1 # Detect libt2n. Version of this file: 1.1
2 pkg_check_modules(LIBT2N REQUIRED libt2n)
3 include_directories(${LIBT2N_INCLUDE_DIRS})
4 link_directories(${LIBT2N_LIBRARY_DIRS})
6 # Get locations from pkgconfig
7 execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable libt2n_codegen libt2n
8 OUTPUT_VARIABLE LIBT2N_CODEGEN
9 OUTPUT_STRIP_TRAILING_WHITESPACE)
10 execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable libt2n_datadir libt2n
11 OUTPUT_VARIABLE LIBT2N_DATADIR
12 OUTPUT_STRIP_TRAILING_WHITESPACE)
13 set(LIBT2N_CLIENT_PCTEMPLATE ${LIBT2N_DATADIR}/clientlib.pc.in)
14 set(LIBT2N_GCCXML /usr/bin/libt2n-gccxml.sh)
16 # Basic pkgconfig settings needed for client.pc generation
17 set(prefix ${CMAKE_INSTALL_PREFIX})
18 set(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin)
19 set(includedir ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME})
20 set(libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
22 # Setup libt2n. Arguments are the CMDGROUP names
23 function(setup_libt2n)
24 string(LENGTH "${ARGV}" CMDGROUP_LEN)
25 if (${CMDGROUP_LEN} EQUAL 0)
26 message(FATAL_ERROR "libt2n CMDGROUP is empty")
27 endif(${CMDGROUP_LEN} EQUAL 0)
29 include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
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
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})
42 foreach(CMDGROUP ${ARGV})
43 message("Processing libt2n command group ${CMDGROUP}")
45 # Run each .cpp file through gccxml
46 set(T2N_GCCXML_FILES "")
47 # string(REGEX REPLACE "\\.cpp$" ".xml" T2N_GCCXML_FILES "${${CMDGROUP}_GROUP}")
48 foreach(T2NFILE ${${CMDGROUP}_GROUP})
49 get_filename_component(FILE_WE ${T2NFILE} NAME_WE)
50 get_filename_component(FILE_NAME ${T2NFILE} NAME)
51 message(" Processing file ${FILE_NAME}")
55 # Create dummy _common.hxx file
56 COMMAND echo "\\#include \\\"codegen-stubhead.hxx\\\"" >${CMDGROUP}_common.hxx
57 COMMAND echo "\\#include \\\"${CMDGROUP}.hxx\\\"" >>${CMDGROUP}_common.hxx
60 COMMAND ${LIBT2N_GCCXML} ${gccxml_include_dirs} ${T2NFILE} -fxml=${FILE_WE}.xml || rm -f ${CMDGROUP}_common.hxx
65 # Created intermediate gccxml filenames for current CMDGROUP
66 set(T2N_GCCXML_FILES ${T2N_GCCXML_FILES} ${FILE_WE}.xml)
67 endforeach(T2NFILE ${${CMDGROUP}_GROUP})
68 # Wait till generated gccxml files are available
69 # add_custom_target(${CMDGROUP}_gccxml_done ALL DEPENDS ???)
70 message("--- ${T2N_GCCXML_FILES} ---")
71 add_custom_command(OUTPUT ${CMDGROUP}_common.cpp ${CMDGROUP}_common.hxx ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx ${CMDGROUP}_server.cpp ${CMDGROUP}_server.hxx
72 # Transform xml files to real code
73 COMMAND ${LIBT2N_CODEGEN} ${CMDGROUP} ${T2N_GCCXML_FILES}
74 COMMAND rm -f ${T2N_GCCXML_FILES}
76 DEPENDS ${T2N_GCCXML_FILES}
77 # DEPENDS ${CMDGROUP}_gccxml_done
80 # Write out pkgconfig file
81 configure_file(${LIBT2N_CLIENT_PCTEMPLATE} ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc @ONLY@)
82 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc
83 DESTINATION lib/pkgconfig)
85 # Create shared client library
86 add_library(${CMDGROUP} SHARED ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx)
87 set_target_properties(${CMDGROUP} PROPERTIES VERSION ${VERSION} SOVERSION 1)
88 install(TARGETS ${CMDGROUP} LIBRARY DESTINATION lib COMPONENT sharedlibs)
90 # Create static client library
91 add_library(${CMDGROUP}-static STATIC ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx)
92 set_target_properties(${CMDGROUP}-static PROPERTIES OUTPUT_NAME "${CMDGROUP}")
93 install(TARGETS ${CMDGROUP}-static ARCHIVE DESTINATION lib COMPONENT staticlibs)
95 # Prevent clobbering each other during the build
96 set_target_properties(${CMDGROUP} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
97 set_target_properties(${CMDGROUP}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
99 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}_client.hxx ${CMDGROUP}.hxx
104 # Wait till generated code is available
105 # add_custom_target(${CMDGROUP}_codegen_done ALL DEPENDS ${CMDGROUP}_common.cpp)
106 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)
107 add_dependencies(${CMDGROUP} ${CMDGROUP}_codegen_done)
108 add_dependencies(${CMDGROUP}-static ${CMDGROUP}_codegen_done)
110 endforeach(CMDGROUP ${ARGV})
111 endfunction(setup_libt2n)