| 1 | # Version of this file: 1.3.1 |
| 2 | |
| 3 | # Detect libt2n |
| 4 | pkg_check_modules(LIBT2N REQUIRED libt2n) |
| 5 | include_directories(${LIBT2N_INCLUDE_DIRS}) |
| 6 | link_directories(${LIBT2N_LIBRARY_DIRS}) |
| 7 | |
| 8 | # Detect the boost serialization library |
| 9 | find_package(Boost 1.34 COMPONENTS serialization REQUIRED) |
| 10 | include_directories(${Boost_INCLUDE_DIRS}) |
| 11 | |
| 12 | # Get locations from pkgconfig |
| 13 | execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable libt2n_codegen libt2n |
| 14 | OUTPUT_VARIABLE LIBT2N_CODEGEN |
| 15 | OUTPUT_STRIP_TRAILING_WHITESPACE) |
| 16 | execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable libt2n_datadir libt2n |
| 17 | OUTPUT_VARIABLE LIBT2N_DATADIR |
| 18 | OUTPUT_STRIP_TRAILING_WHITESPACE) |
| 19 | set(LIBT2N_CLIENT_PCTEMPLATE ${LIBT2N_DATADIR}/clientlib.pc.in) |
| 20 | set(LIBT2N_GCCXML /usr/bin/libt2n-gccxml.sh) |
| 21 | |
| 22 | # Basic pkgconfig settings needed for client.pc generation |
| 23 | set(prefix ${CMAKE_INSTALL_PREFIX}) |
| 24 | set(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin) |
| 25 | set(includedir ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}) |
| 26 | set(libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) |
| 27 | |
| 28 | # Setup libt2n. Arguments are the CMDGROUP names |
| 29 | function(setup_libt2n) |
| 30 | string(LENGTH "${ARGV}" CMDGROUP_LEN) |
| 31 | if (${CMDGROUP_LEN} EQUAL 0) |
| 32 | message(FATAL_ERROR "libt2n CMDGROUP is empty") |
| 33 | endif(${CMDGROUP_LEN} EQUAL 0) |
| 34 | |
| 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 |
| 40 | DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} |
| 41 | PROPERTY INCLUDE_DIRECTORIES |
| 42 | ) |
| 43 | set(gccxml_include_dirs "") |
| 44 | foreach(gcc_include_dir ${gcc_include_dirs}) |
| 45 | set(gccxml_include_dirs "${gccxml_include_dirs} -I${gcc_include_dir}") |
| 46 | endforeach(gcc_include_dir ${gcc_include_dirs}) |
| 47 | |
| 48 | foreach(CMDGROUP ${ARGV}) |
| 49 | message(STATUS "Processing libt2n command group ${CMDGROUP}") |
| 50 | |
| 51 | # We are going to run each .cpp file through gccxml for the current CMDGROUP |
| 52 | set(T2N_GCCXML_FILES "") |
| 53 | set(T2N_GCCXML_COMMANDS "") |
| 54 | foreach(T2NFILE ${${CMDGROUP}_GROUP}) |
| 55 | get_filename_component(FILE_NAME ${T2NFILE} NAME) |
| 56 | # get_filename_component(FILE_EXT ${T2NFILE} EXT) <-- Doesn't work for filenames with multiple dots |
| 57 | string(REGEX MATCH "(\\.[^\\.]*)$" FILE_EXT ${T2NFILE}) |
| 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() |
| 61 | message(STATUS " Processing file ${FILE_NAME}") |
| 62 | |
| 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) |
| 69 | endforeach(T2NFILE ${${CMDGROUP}_GROUP}) |
| 70 | |
| 71 | add_custom_command( |
| 72 | OUTPUT ${CMDGROUP}_common.cpp ${CMDGROUP}_common.hxx ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx ${CMDGROUP}_server.cpp ${CMDGROUP}_server.hxx |
| 73 | |
| 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 |
| 77 | |
| 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 |
| 81 | |
| 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} |
| 85 | |
| 86 | DEPENDS ${${CMDGROUP}_GROUP} |
| 87 | ) |
| 88 | |
| 89 | # Write out pkgconfig file |
| 90 | configure_file(${LIBT2N_CLIENT_PCTEMPLATE} ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc @ONLY) |
| 91 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc |
| 92 | DESTINATION lib/pkgconfig) |
| 93 | |
| 94 | # Create shared client library |
| 95 | add_library(${CMDGROUP} SHARED ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx) |
| 96 | set_target_properties(${CMDGROUP} PROPERTIES VERSION ${VERSION} SOVERSION 1) |
| 97 | target_link_libraries(${CMDGROUP} ${Boost_SERIALIZATION_LIBRARIES}) |
| 98 | install(TARGETS ${CMDGROUP} LIBRARY DESTINATION lib COMPONENT sharedlibs) |
| 99 | |
| 100 | # Create static client library |
| 101 | add_library(${CMDGROUP}-static STATIC ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx) |
| 102 | set_target_properties(${CMDGROUP}-static PROPERTIES OUTPUT_NAME "${CMDGROUP}") |
| 103 | target_link_libraries(${CMDGROUP}-static ${Boost_SERIALIZATION_LIBRARIES}) |
| 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 | |
| 110 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}_client.hxx ${CMDGROUP}.hxx |
| 111 | DESTINATION include/${PROJECT_NAME} |
| 112 | COMPONENT headers |
| 113 | ) |
| 114 | |
| 115 | # Wait till generated code is available |
| 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) |
| 117 | add_dependencies(${CMDGROUP} ${CMDGROUP}_codegen_done) |
| 118 | add_dependencies(${CMDGROUP}-static ${CMDGROUP}_codegen_done) |
| 119 | |
| 120 | endforeach(CMDGROUP ${ARGV}) |
| 121 | endfunction(setup_libt2n) |