From 9621eb22108a1ca45bfc9b7774b729a381b5566a Mon Sep 17 00:00:00 2001 From: Thomas Jarosch Date: Thu, 7 Jul 2011 13:05:20 +0200 Subject: [PATCH] Add cmake code generator support to libt2n --- examples-codegen/Makefile.am | 2 +- examples-codegen/cmake/CMakeLists.txt | 23 ++++++++ examples-codegen/cmake/Libt2n.cmake | 97 +++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 1 deletions(-) create mode 100644 examples-codegen/cmake/CMakeLists.txt create mode 100644 examples-codegen/cmake/Libt2n.cmake diff --git a/examples-codegen/Makefile.am b/examples-codegen/Makefile.am index 207620e..ebf086c 100644 --- a/examples-codegen/Makefile.am +++ b/examples-codegen/Makefile.am @@ -1,2 +1,2 @@ # automatically generated by ./test-build-install-use -EXTRA_DIST = $(srcdir)/example1/* $(srcdir)/example1-client/* $(srcdir)/example1-client-wrapper/* $(srcdir)/example2/* $(srcdir)/example2-client/* $(srcdir)/README +EXTRA_DIST = $(srcdir)/example1/* $(srcdir)/example1-client/* $(srcdir)/example1-client-wrapper/* $(srcdir)/example2/* $(srcdir)/example2-client/* $(srcdir)/cmake/* $(srcdir)/README diff --git a/examples-codegen/cmake/CMakeLists.txt b/examples-codegen/cmake/CMakeLists.txt new file mode 100644 index 0000000..deb1c63 --- /dev/null +++ b/examples-codegen/cmake/CMakeLists.txt @@ -0,0 +1,23 @@ +# Show basic usage of libt2n and cmake +# Requires Libt2n.cmake + +# Setup libt2n +set(t2n_mydaemon_GROUP + ${CMAKE_SOURCE_DIR}/src/t2n_mydaemon.cpp +) +include(Libt2n.cmake) + +# Call setup_libt2n with the CMDGROUP name +setup_libt2n(t2n_mydaemon) + +# ------------------------------------------------------------------------------------------------------ + +set(keymaker_cpp_sources + something.cpp + ${t2n_mydaemon_GROUP} +) + +add_executable(mydaemon main.cpp ${keymaker_cpp_sources} t2n_mydaemon_server.cpp) +target_link_libraries(mydaemon ${LIBT2N_LIBRARIES}) +# Wait till generated code is available +add_dependencies(mydaemon t2n_mydaemon_codegen_done) 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) -- 1.7.1