| 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) |
| 24 | include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) |
| 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) |