Commit | Line | Data |
---|---|---|
9621eb22 TJ |
1 | # Detect libt2n. Version of this file: 1.0 |
2 | pkg_check_modules(LIBT2N REQUIRED libt2n) | |
3 | INCLUDE_DIRECTORIES(${LIBT2N_INCLUDE_DIRS}) | |
4 | LINK_DIRECTORIES(${LIBT2N_LIBRARY_DIRS}) | |
5 | ||
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) | |
15 | ||
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}) | |
21 | ||
22 | # Setup libt2n. Arguments are the CMDGROUP names | |
23 | function(setup_libt2n) | |
4127491f | 24 | include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) |
9621eb22 TJ |
25 | |
26 | string(LENGTH ${ARGV} CMDGROUP_LEN) | |
27 | if (${CMDGROUP_LEN} EQUAL 0) | |
28 | message(FATAL_ERROR "libt2n CMDGROUP is empty") | |
29 | endif(${CMDGROUP_LEN} EQUAL 0) | |
30 | ||
31 | foreach(CMDGROUP ${ARGV}) | |
32 | message("Processing libt2n command group ${CMDGROUP}") | |
33 | ||
34 | # Run each .cpp file through gccxml | |
35 | foreach(T2NFILE ${${CMDGROUP}_GROUP}) | |
36 | get_filename_component(FILE_WE ${T2NFILE} NAME_WE) | |
37 | get_filename_component(NAME ${T2NFILE} NAME) | |
38 | message(" Processing file ${NAME}") | |
39 | ||
40 | # Compute include directories | |
41 | # TODO: http://www.cmake.org/Bug/view.php?id=11889 contains a better solution | |
42 | get_property(gcc_include_dirs | |
43 | DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | |
44 | PROPERTY INCLUDE_DIRECTORIES | |
45 | ) | |
46 | set(gccxml_include_dirs "") | |
47 | foreach(gcc_include_dir ${gcc_include_dirs}) | |
48 | set(gccxml_include_dirs "${gccxml_include_dirs} -I${gcc_include_dir}") | |
49 | endforeach(gcc_include_dir ${gcc_include_dirs}) | |
50 | ||
51 | add_custom_command(OUTPUT ${FILE_WE}_common.cpp ${FILE_WE}_common.hxx ${FILE_WE}_client.cpp ${FILE_WE}_client.hxx ${FILE_WE}_server.cpp ${FILE_WE}_server.hxx | |
52 | # Create dummy _common.hxx file | |
53 | COMMAND echo "\\#include \\\"codegen-stubhead.hxx\\\"" >${FILE_WE}_common.hxx | |
54 | COMMAND echo "\\#include \\\"${FILE_WE}.hxx\\\"" >>${FILE_WE}_common.hxx | |
55 | ||
56 | # Invoke gccxml | |
57 | COMMAND ${LIBT2N_GCCXML} ${gccxml_include_dirs} ${T2NFILE} -fxml=${FILE_WE}.xml || rm -f ${FILE_WE}_common.hxx | |
58 | ||
59 | # Transform xml file to real code | |
60 | COMMAND ${LIBT2N_CODEGEN} ${CMDGROUP} ${FILE_WE}.xml | |
61 | COMMAND rm -f ${FILE_WE}.xml | |
62 | ||
63 | DEPENDS ${T2NFILE} | |
64 | ) | |
65 | endforeach(T2NFILE ${${CMDGROUP}_GROUP}) | |
66 | ||
67 | # Write out pkgconfig file | |
68 | configure_file(${LIBT2N_CLIENT_PCTEMPLATE} ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc @ONLY@) | |
69 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc | |
70 | DESTINATION lib/pkgconfig) | |
71 | ||
72 | # Create shared client library | |
73 | add_library(${CMDGROUP} SHARED ${FILE_WE}_client.cpp ${FILE_WE}_client.hxx) | |
74 | set_target_properties(${CMDGROUP} PROPERTIES VERSION ${VERSION} SOVERSION 1) | |
75 | install(TARGETS ${CMDGROUP} LIBRARY DESTINATION lib COMPONENT sharedlibs) | |
76 | ||
77 | # Create static client library | |
78 | add_library(${CMDGROUP}-static STATIC ${FILE_WE}_client.cpp ${FILE_WE}_client.hxx) | |
79 | set_target_properties(${CMDGROUP}-static PROPERTIES OUTPUT_NAME "${CMDGROUP}") | |
80 | install(TARGETS ${CMDGROUP}-static ARCHIVE DESTINATION lib COMPONENT staticlibs) | |
81 | ||
82 | # Prevent clobbering each other during the build | |
83 | set_target_properties(${CMDGROUP} PROPERTIES CLEAN_DIRECT_OUTPUT 1) | |
84 | set_target_properties(${CMDGROUP}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) | |
85 | ||
86 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${FILE_WE}_client.hxx ${FILE_WE}.hxx | |
87 | DESTINATION include | |
88 | COMPONENT headers | |
89 | ) | |
90 | ||
91 | # Wait till generated code is available | |
92 | add_custom_target(${CMDGROUP}_codegen_done ALL DEPENDS ${FILE_WE}_common.cpp) | |
93 | add_dependencies(${CMDGROUP} ${CMDGROUP}_codegen_done) | |
94 | add_dependencies(${CMDGROUP}-static ${CMDGROUP}_codegen_done) | |
95 | ||
96 | endforeach(CMDGROUP ${ARGV}) | |
97 | endfunction(setup_libt2n) |