1#############################################################################
2# $Id: CMake.NCBIptb.legacy.cmake 590468 2019-07-30 13:21:57Z gouriano $
3#############################################################################
4#############################################################################
5##
6##  NCBI CMake wrapper extension
7##  Adds support of ASNTOOL code generation and "TARGET EXPORT"
8##    Author: Andrei Gourianov, gouriano@ncbi
9##
10
11
12##############################################################################
13# asntool app
14if (NOT WIN32)
15    set(NCBI_ASNTOOL $ENV{NCBI}/bin/asntool)
16    set(NCBI_ASNDIR  /am/ncbiapdata/asn)
17else()
18    set(NCBI_ASNTOOL //snowman/win-coremake/Lib/Ncbi/C_Toolkit/vs2017.64/c.current/bin/asntool.exe)
19endif()
20
21##############################################################################
22function(NCBI_generate_by_asntool)
23    cmake_parse_arguments(PARSE_ARGV 0 ASNTOOL "LOCAL" "DATASPEC;BASENAME;HEADER" "EXTERNAL;GENFLAGS")
24
25    file(RELATIVE_PATH _rel "${NCBI_SRC_ROOT}" "${NCBI_CURRENT_SOURCE_DIR}")
26    set(_inc_dir ${NCBI_INC_ROOT}/${_rel})
27    if(IS_ABSOLUTE ${ASNTOOL_DATASPEC})
28        set(_specpath ${ASNTOOL_DATASPEC})
29    else()
30        set(_specpath ${NCBI_CURRENT_SOURCE_DIR}/${ASNTOOL_DATASPEC})
31    endif()
32    get_filename_component(_specname ${_specpath} NAME_WE)
33    get_filename_component(_specext ${_specpath} EXT)
34    set(_dataspec ${_specname}${_specext})
35    set(_basename ${ASNTOOL_BASENAME})
36    if (DEFINED ASNTOOL_HEADER)
37        set(_header ${ASNTOOL_HEADER})
38    else()
39        set(_header ${_specname}.h)
40    endif()
41    set(_externals "")
42    foreach(_module IN LISTS ASNTOOL_EXTERNAL)
43        if (NOT "${_externals}" STREQUAL "")
44            set(_externals "${_externals},")
45        endif()
46        if(EXISTS ${NCBI_CURRENT_SOURCE_DIR}/${_module} OR IS_ABSOLUTE ${_module})
47            set(_externals "${_externals}${_module}")
48        else()
49            set(_externals "${_externals}${NCBI_ASNDIR}/${_module}")
50        endif()
51    endforeach()
52    if (NOT "${_externals}" STREQUAL "")
53        set(_externals -M ${_externals})
54    endif()
55    if (ASNTOOL_LOCAL)
56        add_custom_command(
57            OUTPUT  ${NCBI_CURRENT_SOURCE_DIR}/${_basename}.c ${NCBI_CURRENT_SOURCE_DIR}/${_basename}.h ${NCBI_CURRENT_SOURCE_DIR}/${_header}
58            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${_specpath} ${NCBI_CURRENT_SOURCE_DIR}
59            COMMAND ${NCBI_ASNTOOL} -w 100 -m ${_dataspec} -o ${_header}
60            COMMAND ${NCBI_ASNTOOL} -w 100 -G -m ${_dataspec} -B ${_basename} ${_externals} -K ${_header} ${ASNTOOL_GENFLAGS}
61            WORKING_DIRECTORY ${NCBI_CURRENT_SOURCE_DIR}
62            COMMENT "Generate C object loader from ${_dataspec}"
63            DEPENDS ${_specpath}
64        )
65    else()
66        add_custom_command(
67            OUTPUT  ${NCBI_CURRENT_SOURCE_DIR}/${_basename}.c ${_inc_dir}/${_basename}.h ${_inc_dir}/${_header}
68            COMMAND ${CMAKE_COMMAND} -E make_directory ${_inc_dir}
69            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${_specpath} ${NCBI_CURRENT_SOURCE_DIR}
70            COMMAND ${NCBI_ASNTOOL} -w 100 -m ${_dataspec} -o ${_inc_dir}/${_header}
71            COMMAND ${NCBI_ASNTOOL} -w 100 -G -m ${_dataspec} -B ${_basename} ${_externals} -K ${_header} ${ASNTOOL_GENFLAGS}
72            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${_basename}.h ${_inc_dir}
73            COMMAND ${CMAKE_COMMAND} -E remove -f ${_basename}.h
74            WORKING_DIRECTORY ${NCBI_CURRENT_SOURCE_DIR}
75            COMMENT "Generate C object loader from ${_dataspec}"
76            DEPENDS ${_specpath}
77        )
78    endif()
79endfunction()
80
81##############################################################################
82function(NCBI_target_export)
83    cmake_parse_arguments(PARSE_ARGV 0 EXPORT "" "TARGET;DESTINATION" "HEADERS")
84    if(WIN32 OR XCODE)
85        set(_dest ${NCBI_CFGINC_ROOT}/$<CONFIG>/${EXPORT_DESTINATION})
86    else()
87        set(_dest ${NCBI_CFGINC_ROOT}/${EXPORT_DESTINATION})
88    endif()
89    file(RELATIVE_PATH _rel "${NCBI_SRC_ROOT}" "${NCBI_CURRENT_SOURCE_DIR}")
90    set(_inc_dir ${NCBI_INC_ROOT}/${_rel})
91if(OFF)
92    foreach(_header IN LISTS EXPORT_HEADERS)
93        if (EXISTS "${NCBI_CURRENT_SOURCE_DIR}/${_header}")
94            set(_headers ${_headers} ${_header})
95        else()
96            set(_headers ${_headers} ${_inc_dir}/${_header})
97        endif()
98    endforeach()
99else()
100    set(_headers ${_headers} ${EXPORT_HEADERS})
101endif()
102    add_custom_command(
103        TARGET ${EXPORT_TARGET} POST_BUILD
104        COMMAND ${CMAKE_COMMAND} -E make_directory ${_dest}
105        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${_headers} ${_dest}
106        WORKING_DIRECTORY ${NCBI_CURRENT_SOURCE_DIR}
107        COMMENT "Exporting ${EXPORT_TARGET} headers into ${NCBI_CFGINC_ROOT}"
108    )
109endfunction()
110