Proper dependency handling in Libt2n.cmake by using only one add_custom_command for...
[libt2n] / examples-codegen / cmake / Libt2n.cmake
CommitLineData
813a4e4b 1# Detect libt2n. Version of this file: 1.2
9621eb22 2pkg_check_modules(LIBT2N REQUIRED libt2n)
9fe43ede
KK
3include_directories(${LIBT2N_INCLUDE_DIRS})
4link_directories(${LIBT2N_LIBRARY_DIRS})
9621eb22
TJ
5
6# Get locations from pkgconfig
9fe43ede 7execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable libt2n_codegen libt2n
9621eb22
TJ
8 OUTPUT_VARIABLE LIBT2N_CODEGEN
9 OUTPUT_STRIP_TRAILING_WHITESPACE)
9fe43ede 10execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable libt2n_datadir libt2n
9621eb22
TJ
11 OUTPUT_VARIABLE LIBT2N_DATADIR
12 OUTPUT_STRIP_TRAILING_WHITESPACE)
13set(LIBT2N_CLIENT_PCTEMPLATE ${LIBT2N_DATADIR}/clientlib.pc.in)
14set(LIBT2N_GCCXML /usr/bin/libt2n-gccxml.sh)
15
16# Basic pkgconfig settings needed for client.pc generation
17set(prefix ${CMAKE_INSTALL_PREFIX})
18set(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin)
19set(includedir ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME})
20set(libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
21
22# Setup libt2n. Arguments are the CMDGROUP names
23function(setup_libt2n)
9fe43ede 24 string(LENGTH "${ARGV}" CMDGROUP_LEN)
9621eb22
TJ
25 if (${CMDGROUP_LEN} EQUAL 0)
26 message(FATAL_ERROR "libt2n CMDGROUP is empty")
27 endif(${CMDGROUP_LEN} EQUAL 0)
28
9fe43ede
KK
29 include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
30
31 # Compute include directories
32 # TODO: http://www.cmake.org/Bug/view.php?id=11889 contains a better solution
33 get_property(gcc_include_dirs
34 DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
35 PROPERTY INCLUDE_DIRECTORIES
36 )
37 set(gccxml_include_dirs "")
38 foreach(gcc_include_dir ${gcc_include_dirs})
39 set(gccxml_include_dirs "${gccxml_include_dirs} -I${gcc_include_dir}")
40 endforeach(gcc_include_dir ${gcc_include_dirs})
41
9621eb22 42 foreach(CMDGROUP ${ARGV})
813a4e4b 43 message(STATUS "Processing libt2n command group ${CMDGROUP}")
9621eb22 44
813a4e4b 45 # We are going to run each .cpp file through gccxml for the current CMDGROUP
9fe43ede 46 set(T2N_GCCXML_FILES "")
813a4e4b 47 set(T2N_GCCXML_COMMANDS "")
9621eb22 48 foreach(T2NFILE ${${CMDGROUP}_GROUP})
9fe43ede 49 get_filename_component(FILE_NAME ${T2NFILE} NAME)
813a4e4b
KK
50 get_filename_component(FILE_EXT ${T2NFILE} EXT)
51 if(NOT FILE_EXT STREQUAL ".cpp")
52 message(FATAL_ERROR " Error: ${FILE_NAME} is not a .cpp file based on its filename extension!")
53 endif()
54 message(STATUS " Processing file ${FILE_NAME}")
55
56 # We build the commands in advance which execute gccxml on each file in the CMDGROUP
57 set(T2N_GCCXML_COMMANDS ${T2N_GCCXML_COMMANDS}
58 COMMAND ${LIBT2N_GCCXML} ${gccxml_include_dirs} ${T2NFILE} -fxml=${T2NFILE}.xml
59 )
60 # The filenames of the created intermediate gccxml files for the current CMDGROUP
61 set(T2N_GCCXML_FILES ${T2N_GCCXML_FILES} ${T2NFILE}.xml)
62 endforeach(T2NFILE ${${CMDGROUP}_GROUP})
63
64 add_custom_command(
65 OUTPUT ${CMDGROUP}_common.cpp ${CMDGROUP}_common.hxx ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx ${CMDGROUP}_server.cpp ${CMDGROUP}_server.hxx
66
9fe43ede
KK
67 # Create dummy _common.hxx file
68 COMMAND echo "\\#include \\\"codegen-stubhead.hxx\\\"" >${CMDGROUP}_common.hxx
69 COMMAND echo "\\#include \\\"${CMDGROUP}.hxx\\\"" >>${CMDGROUP}_common.hxx
70
813a4e4b
KK
71 # Invoke gccxml on each source file in the current CMDGROUP and delete the dummy file
72 ${T2N_GCCXML_COMMANDS}
73 COMMAND rm -f ${CMDGROUP}_common.hxx
9fe43ede 74
813a4e4b 75 # Run the code generator on all the generated gccxml files and remove those intermediate gccxml files
9fe43ede
KK
76 COMMAND ${LIBT2N_CODEGEN} ${CMDGROUP} ${T2N_GCCXML_FILES}
77 COMMAND rm -f ${T2N_GCCXML_FILES}
78
813a4e4b
KK
79 DEPENDS ${${CMDGROUP}_GROUP}
80 )
9621eb22
TJ
81
82 # Write out pkgconfig file
83 configure_file(${LIBT2N_CLIENT_PCTEMPLATE} ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc @ONLY@)
84 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc
85 DESTINATION lib/pkgconfig)
86
87 # Create shared client library
9fe43ede 88 add_library(${CMDGROUP} SHARED ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx)
9621eb22
TJ
89 set_target_properties(${CMDGROUP} PROPERTIES VERSION ${VERSION} SOVERSION 1)
90 install(TARGETS ${CMDGROUP} LIBRARY DESTINATION lib COMPONENT sharedlibs)
91
92 # Create static client library
9fe43ede 93 add_library(${CMDGROUP}-static STATIC ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx)
9621eb22
TJ
94 set_target_properties(${CMDGROUP}-static PROPERTIES OUTPUT_NAME "${CMDGROUP}")
95 install(TARGETS ${CMDGROUP}-static ARCHIVE DESTINATION lib COMPONENT staticlibs)
96
97 # Prevent clobbering each other during the build
98 set_target_properties(${CMDGROUP} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
99 set_target_properties(${CMDGROUP}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
100
9fe43ede 101 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}_client.hxx ${CMDGROUP}.hxx
9621eb22
TJ
102 DESTINATION include
103 COMPONENT headers
104 )
105
106 # Wait till generated code is available
9fe43ede 107 add_custom_target(${CMDGROUP}_codegen_done ALL DEPENDS ${CMDGROUP}_common.cpp ${CMDGROUP}_common.hxx ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx ${CMDGROUP}_server.cpp ${CMDGROUP}_server.hxx)
9621eb22
TJ
108 add_dependencies(${CMDGROUP} ${CMDGROUP}_codegen_done)
109 add_dependencies(${CMDGROUP}-static ${CMDGROUP}_codegen_done)
110
111 endforeach(CMDGROUP ${ARGV})
112endfunction(setup_libt2n)