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