| 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}) |
| 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 | 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) |
| 28 | |
| 29 | include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) |
| 30 | |
| 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 |
| 36 | ) |
| 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}) |
| 41 | |
| 42 | foreach(CMDGROUP ${ARGV}) |
| 43 | message("Processing libt2n command group ${CMDGROUP}") |
| 44 | |
| 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}") |
| 52 | |
| 53 | add_custom_command( |
| 54 | OUTPUT ${FILE_WE}.xml |
| 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 |
| 58 | |
| 59 | # Invoke gccxml |
| 60 | COMMAND ${LIBT2N_GCCXML} ${gccxml_include_dirs} ${T2NFILE} -fxml=${FILE_WE}.xml || rm -f ${CMDGROUP}_common.hxx |
| 61 | |
| 62 | DEPENDS ${T2NFILE} |
| 63 | ) |
| 64 | |
| 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} |
| 75 | |
| 76 | DEPENDS ${T2N_GCCXML_FILES} |
| 77 | # DEPENDS ${CMDGROUP}_gccxml_done |
| 78 | ) |
| 79 | |
| 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) |
| 84 | |
| 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) |
| 89 | |
| 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) |
| 94 | |
| 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) |
| 98 | |
| 99 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}_client.hxx ${CMDGROUP}.hxx |
| 100 | DESTINATION include |
| 101 | COMPONENT headers |
| 102 | ) |
| 103 | |
| 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) |
| 109 | |
| 110 | endforeach(CMDGROUP ${ARGV}) |
| 111 | endfunction(setup_libt2n) |