From b24bd083fe58d644ba3b4e8db76636dddd842b9d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Krist=C3=B3f=20Katus?= Date: Thu, 25 Aug 2011 17:34:38 +0200 Subject: [PATCH] Installation of Libt2n.cmake --- codegen/CMakeLists.txt | 1 + codegen/Libt2n.cmake | 112 ++++++++++++++++++++++++++++++ examples-codegen/cmake/CMakeLists.txt | 2 +- examples-codegen/cmake/Libt2n.cmake | 112 ------------------------------ examples-codegen/example1/CMakeLists.txt | 2 +- examples-codegen/example2/CMakeLists.txt | 2 +- libt2n.spec.in | 3 +- 7 files changed, 118 insertions(+), 116 deletions(-) create mode 100644 codegen/Libt2n.cmake delete mode 100644 examples-codegen/cmake/Libt2n.cmake diff --git a/codegen/CMakeLists.txt b/codegen/CMakeLists.txt index 1b62402..55d5243 100644 --- a/codegen/CMakeLists.txt +++ b/codegen/CMakeLists.txt @@ -13,3 +13,4 @@ target_link_libraries(libt2n-codegen ${XMLPP_LIBRARIES}) install(TARGETS libt2n-codegen DESTINATION bin) install(FILES ${CPP_HEADERS} DESTINATION include) install(FILES clientlib.pc.in DESTINATION share/libt2n) +install(FILES Libt2n.cmake DESTINATION ${CMAKE_ROOT}/Modules) diff --git a/codegen/Libt2n.cmake b/codegen/Libt2n.cmake new file mode 100644 index 0000000..a31edee --- /dev/null +++ b/codegen/Libt2n.cmake @@ -0,0 +1,112 @@ +# Detect libt2n. Version of this file: 1.2 +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) + string(LENGTH "${ARGV}" CMDGROUP_LEN) + if (${CMDGROUP_LEN} EQUAL 0) + message(FATAL_ERROR "libt2n CMDGROUP is empty") + endif(${CMDGROUP_LEN} EQUAL 0) + + include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) + + # 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}) + + foreach(CMDGROUP ${ARGV}) + message(STATUS "Processing libt2n command group ${CMDGROUP}") + + # We are going to run each .cpp file through gccxml for the current CMDGROUP + set(T2N_GCCXML_FILES "") + set(T2N_GCCXML_COMMANDS "") + foreach(T2NFILE ${${CMDGROUP}_GROUP}) + get_filename_component(FILE_NAME ${T2NFILE} NAME) + get_filename_component(FILE_EXT ${T2NFILE} EXT) + if(NOT FILE_EXT STREQUAL ".cpp") + message(FATAL_ERROR " Error: ${FILE_NAME} is not a .cpp file based on its filename extension!") + endif() + message(STATUS " Processing file ${FILE_NAME}") + + # We build the commands in advance which execute gccxml on each file in the CMDGROUP + set(T2N_GCCXML_COMMANDS ${T2N_GCCXML_COMMANDS} + COMMAND ${LIBT2N_GCCXML} ${gccxml_include_dirs} ${T2NFILE} -fxml=${T2NFILE}.xml + ) + # The filenames of the created intermediate gccxml files for the current CMDGROUP + set(T2N_GCCXML_FILES ${T2N_GCCXML_FILES} ${T2NFILE}.xml) + endforeach(T2NFILE ${${CMDGROUP}_GROUP}) + + add_custom_command( + OUTPUT ${CMDGROUP}_common.cpp ${CMDGROUP}_common.hxx ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx ${CMDGROUP}_server.cpp ${CMDGROUP}_server.hxx + + # Create dummy _common.hxx file + COMMAND echo "\\#include \\\"codegen-stubhead.hxx\\\"" >${CMDGROUP}_common.hxx + COMMAND echo "\\#include \\\"${CMDGROUP}.hxx\\\"" >>${CMDGROUP}_common.hxx + + # Invoke gccxml on each source file in the current CMDGROUP and delete the dummy file + ${T2N_GCCXML_COMMANDS} + COMMAND rm -f ${CMDGROUP}_common.hxx + + # Run the code generator on all the generated gccxml files and remove those intermediate gccxml files + COMMAND ${LIBT2N_CODEGEN} ${CMDGROUP} ${T2N_GCCXML_FILES} + COMMAND rm -f ${T2N_GCCXML_FILES} + + DEPENDS ${${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 ${CMDGROUP}_client.cpp ${CMDGROUP}_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 ${CMDGROUP}_client.cpp ${CMDGROUP}_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}/${CMDGROUP}_client.hxx ${CMDGROUP}.hxx + DESTINATION include + COMPONENT headers + ) + + # Wait till generated code is available + 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) + add_dependencies(${CMDGROUP} ${CMDGROUP}_codegen_done) + add_dependencies(${CMDGROUP}-static ${CMDGROUP}_codegen_done) + + endforeach(CMDGROUP ${ARGV}) +endfunction(setup_libt2n) diff --git a/examples-codegen/cmake/CMakeLists.txt b/examples-codegen/cmake/CMakeLists.txt index deb1c63..60bb8d1 100644 --- a/examples-codegen/cmake/CMakeLists.txt +++ b/examples-codegen/cmake/CMakeLists.txt @@ -5,7 +5,7 @@ set(t2n_mydaemon_GROUP ${CMAKE_SOURCE_DIR}/src/t2n_mydaemon.cpp ) -include(Libt2n.cmake) +include(${CMAKE_SOURCE_DIR}/codegen/Libt2n.cmake) # Call setup_libt2n with the CMDGROUP name setup_libt2n(t2n_mydaemon) diff --git a/examples-codegen/cmake/Libt2n.cmake b/examples-codegen/cmake/Libt2n.cmake deleted file mode 100644 index a31edee..0000000 --- a/examples-codegen/cmake/Libt2n.cmake +++ /dev/null @@ -1,112 +0,0 @@ -# Detect libt2n. Version of this file: 1.2 -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) - string(LENGTH "${ARGV}" CMDGROUP_LEN) - if (${CMDGROUP_LEN} EQUAL 0) - message(FATAL_ERROR "libt2n CMDGROUP is empty") - endif(${CMDGROUP_LEN} EQUAL 0) - - include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) - - # 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}) - - foreach(CMDGROUP ${ARGV}) - message(STATUS "Processing libt2n command group ${CMDGROUP}") - - # We are going to run each .cpp file through gccxml for the current CMDGROUP - set(T2N_GCCXML_FILES "") - set(T2N_GCCXML_COMMANDS "") - foreach(T2NFILE ${${CMDGROUP}_GROUP}) - get_filename_component(FILE_NAME ${T2NFILE} NAME) - get_filename_component(FILE_EXT ${T2NFILE} EXT) - if(NOT FILE_EXT STREQUAL ".cpp") - message(FATAL_ERROR " Error: ${FILE_NAME} is not a .cpp file based on its filename extension!") - endif() - message(STATUS " Processing file ${FILE_NAME}") - - # We build the commands in advance which execute gccxml on each file in the CMDGROUP - set(T2N_GCCXML_COMMANDS ${T2N_GCCXML_COMMANDS} - COMMAND ${LIBT2N_GCCXML} ${gccxml_include_dirs} ${T2NFILE} -fxml=${T2NFILE}.xml - ) - # The filenames of the created intermediate gccxml files for the current CMDGROUP - set(T2N_GCCXML_FILES ${T2N_GCCXML_FILES} ${T2NFILE}.xml) - endforeach(T2NFILE ${${CMDGROUP}_GROUP}) - - add_custom_command( - OUTPUT ${CMDGROUP}_common.cpp ${CMDGROUP}_common.hxx ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx ${CMDGROUP}_server.cpp ${CMDGROUP}_server.hxx - - # Create dummy _common.hxx file - COMMAND echo "\\#include \\\"codegen-stubhead.hxx\\\"" >${CMDGROUP}_common.hxx - COMMAND echo "\\#include \\\"${CMDGROUP}.hxx\\\"" >>${CMDGROUP}_common.hxx - - # Invoke gccxml on each source file in the current CMDGROUP and delete the dummy file - ${T2N_GCCXML_COMMANDS} - COMMAND rm -f ${CMDGROUP}_common.hxx - - # Run the code generator on all the generated gccxml files and remove those intermediate gccxml files - COMMAND ${LIBT2N_CODEGEN} ${CMDGROUP} ${T2N_GCCXML_FILES} - COMMAND rm -f ${T2N_GCCXML_FILES} - - DEPENDS ${${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 ${CMDGROUP}_client.cpp ${CMDGROUP}_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 ${CMDGROUP}_client.cpp ${CMDGROUP}_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}/${CMDGROUP}_client.hxx ${CMDGROUP}.hxx - DESTINATION include - COMPONENT headers - ) - - # Wait till generated code is available - 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) - add_dependencies(${CMDGROUP} ${CMDGROUP}_codegen_done) - add_dependencies(${CMDGROUP}-static ${CMDGROUP}_codegen_done) - - endforeach(CMDGROUP ${ARGV}) -endfunction(setup_libt2n) diff --git a/examples-codegen/example1/CMakeLists.txt b/examples-codegen/example1/CMakeLists.txt index 8231afa..eb0f0d9 100644 --- a/examples-codegen/example1/CMakeLists.txt +++ b/examples-codegen/example1/CMakeLists.txt @@ -25,7 +25,7 @@ include(CPack) # for each command group list the files to parse for LIBT2N_EXPORT set(t2nexample_GROUP ${CMAKE_CURRENT_SOURCE_DIR}/t2nexample.cpp) # include CMake snippet doing all the magic -include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Libt2n.cmake) +include(${CMAKE_SOURCE_DIR}/codegen/Libt2n.cmake) # command groups are listed here (seperated by spaces) setup_libt2n(t2nexample) diff --git a/examples-codegen/example2/CMakeLists.txt b/examples-codegen/example2/CMakeLists.txt index 9308cbe..31cc66a 100644 --- a/examples-codegen/example2/CMakeLists.txt +++ b/examples-codegen/example2/CMakeLists.txt @@ -35,7 +35,7 @@ set(other_GROUP # ${CMAKE_CURRENT_SOURCE_DIR}/foo.hxx #) # include CMake snippet doing all the magic -include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Libt2n.cmake) +include(${CMAKE_SOURCE_DIR}/codegen/Libt2n.cmake) # command groups are listed here (seperated by spaces) setup_libt2n(default other) diff --git a/libt2n.spec.in b/libt2n.spec.in index c49047a..e2241b4 100644 --- a/libt2n.spec.in +++ b/libt2n.spec.in @@ -17,7 +17,7 @@ C++ IPC library %package devel Summary: talk2neighbor - C++ IPC library Group: Intranator/Development -Requires: libt2n = %{version} libgettext gccxml libxml++ boost-devel +Requires: libt2n = %{version} gccxml libxml++ boost-devel BuildPrereq: boost-devel %description devel @@ -71,3 +71,4 @@ rm -fr $RPM_BUILD_ROOT %{prefix}/include/ # %{prefix}/share/aclocal %{prefix}/share/libt2n +%{prefix}/share/cmake/Modules/Libt2n.cmake -- 1.7.1