X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=examples-codegen%2Fcmake%2FLibt2n.cmake;fp=examples-codegen%2Fcmake%2FLibt2n.cmake;h=24f06bf862d7f1279cabd07741f09422b287db44;hp=0000000000000000000000000000000000000000;hb=9621eb22108a1ca45bfc9b7774b729a381b5566a;hpb=85248d114dd51ade7a018249566ba1d9598ae4b2 diff --git a/examples-codegen/cmake/Libt2n.cmake b/examples-codegen/cmake/Libt2n.cmake new file mode 100644 index 0000000..24f06bf --- /dev/null +++ b/examples-codegen/cmake/Libt2n.cmake @@ -0,0 +1,97 @@ +# Detect libt2n. Version of this file: 1.0 +pkg_check_modules(LIBT2N REQUIRED libt2n) +INCLUDE_DIRECTORIES(${LIBT2N_INCLUDE_DIRS}) +LINK_DIRECTORIES(${LIBT2N_LIBRARY_DIRS}) + +# Get locations from pkgconfig +execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} --variable libt2n_codegen libt2n + OUTPUT_VARIABLE LIBT2N_CODEGEN + OUTPUT_STRIP_TRAILING_WHITESPACE) +execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} --variable libt2n_datadir libt2n + OUTPUT_VARIABLE LIBT2N_DATADIR + OUTPUT_STRIP_TRAILING_WHITESPACE) +set(LIBT2N_CLIENT_PCTEMPLATE ${LIBT2N_DATADIR}/clientlib.pc.in) +set(LIBT2N_GCCXML /usr/bin/libt2n-gccxml.sh) + +# Basic pkgconfig settings needed for client.pc generation +set(prefix ${CMAKE_INSTALL_PREFIX}) +set(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin) +set(includedir ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}) +set(libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) + +# Setup libt2n. Arguments are the CMDGROUP names +function(setup_libt2n) + include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) + + string(LENGTH ${ARGV} CMDGROUP_LEN) + if (${CMDGROUP_LEN} EQUAL 0) + message(FATAL_ERROR "libt2n CMDGROUP is empty") + endif(${CMDGROUP_LEN} EQUAL 0) + + foreach(CMDGROUP ${ARGV}) + message("Processing libt2n command group ${CMDGROUP}") + + # Run each .cpp file through gccxml + foreach(T2NFILE ${${CMDGROUP}_GROUP}) + get_filename_component(FILE_WE ${T2NFILE} NAME_WE) + get_filename_component(NAME ${T2NFILE} NAME) + message(" Processing file ${NAME}") + + # Compute include directories + # TODO: http://www.cmake.org/Bug/view.php?id=11889 contains a better solution + get_property(gcc_include_dirs + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + PROPERTY INCLUDE_DIRECTORIES + ) + set(gccxml_include_dirs "") + foreach(gcc_include_dir ${gcc_include_dirs}) + set(gccxml_include_dirs "${gccxml_include_dirs} -I${gcc_include_dir}") + endforeach(gcc_include_dir ${gcc_include_dirs}) + + 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 + # Create dummy _common.hxx file + COMMAND echo "\\#include \\\"codegen-stubhead.hxx\\\"" >${FILE_WE}_common.hxx + COMMAND echo "\\#include \\\"${FILE_WE}.hxx\\\"" >>${FILE_WE}_common.hxx + + # Invoke gccxml + COMMAND ${LIBT2N_GCCXML} ${gccxml_include_dirs} ${T2NFILE} -fxml=${FILE_WE}.xml || rm -f ${FILE_WE}_common.hxx + + # Transform xml file to real code + COMMAND ${LIBT2N_CODEGEN} ${CMDGROUP} ${FILE_WE}.xml + COMMAND rm -f ${FILE_WE}.xml + + DEPENDS ${T2NFILE} + ) + endforeach(T2NFILE ${${CMDGROUP}_GROUP}) + + # Write out pkgconfig file + configure_file(${LIBT2N_CLIENT_PCTEMPLATE} ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc @ONLY@) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc + DESTINATION lib/pkgconfig) + + # Create shared client library + add_library(${CMDGROUP} SHARED ${FILE_WE}_client.cpp ${FILE_WE}_client.hxx) + set_target_properties(${CMDGROUP} PROPERTIES VERSION ${VERSION} SOVERSION 1) + install(TARGETS ${CMDGROUP} LIBRARY DESTINATION lib COMPONENT sharedlibs) + + # Create static client library + add_library(${CMDGROUP}-static STATIC ${FILE_WE}_client.cpp ${FILE_WE}_client.hxx) + set_target_properties(${CMDGROUP}-static PROPERTIES OUTPUT_NAME "${CMDGROUP}") + install(TARGETS ${CMDGROUP}-static ARCHIVE DESTINATION lib COMPONENT staticlibs) + + # Prevent clobbering each other during the build + set_target_properties(${CMDGROUP} PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(${CMDGROUP}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) + + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${FILE_WE}_client.hxx ${FILE_WE}.hxx + DESTINATION include + COMPONENT headers + ) + + # Wait till generated code is available + add_custom_target(${CMDGROUP}_codegen_done ALL DEPENDS ${FILE_WE}_common.cpp) + add_dependencies(${CMDGROUP} ${CMDGROUP}_codegen_done) + add_dependencies(${CMDGROUP}-static ${CMDGROUP}_codegen_done) + + endforeach(CMDGROUP ${ARGV}) +endfunction(setup_libt2n)