a31edee77aa1ba0f860ac99e449a6f0cbbceff5b
[libt2n] / codegen / Libt2n.cmake
1 # Detect libt2n. Version of this file: 1.2
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(STATUS "Processing libt2n command group ${CMDGROUP}")
44
45         # We are going to run each .cpp file through gccxml for the current CMDGROUP
46         set(T2N_GCCXML_FILES "")
47         set(T2N_GCCXML_COMMANDS "")
48         foreach(T2NFILE ${${CMDGROUP}_GROUP})
49             get_filename_component(FILE_NAME ${T2NFILE} NAME)
50             get_filename_component(FILE_EXT ${T2NFILE} EXT)
51             if(NOT FILE_EXT STREQUAL ".cpp")
52                 message(FATAL_ERROR "   Error: ${FILE_NAME} is not a .cpp file based on its filename extension!")
53             endif()
54             message(STATUS "   Processing file ${FILE_NAME}")
55
56             # We build the commands in advance which execute gccxml on each file in the CMDGROUP
57             set(T2N_GCCXML_COMMANDS ${T2N_GCCXML_COMMANDS}
58                 COMMAND ${LIBT2N_GCCXML} ${gccxml_include_dirs} ${T2NFILE} -fxml=${T2NFILE}.xml
59                 )
60             # The filenames of the created intermediate gccxml files for the current CMDGROUP
61             set(T2N_GCCXML_FILES ${T2N_GCCXML_FILES} ${T2NFILE}.xml)
62         endforeach(T2NFILE ${${CMDGROUP}_GROUP})
63
64         add_custom_command(
65             OUTPUT ${CMDGROUP}_common.cpp ${CMDGROUP}_common.hxx ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx ${CMDGROUP}_server.cpp  ${CMDGROUP}_server.hxx
66
67             # Create dummy _common.hxx file
68             COMMAND echo "\\#include \\\"codegen-stubhead.hxx\\\"" >${CMDGROUP}_common.hxx
69             COMMAND echo "\\#include \\\"${CMDGROUP}.hxx\\\"" >>${CMDGROUP}_common.hxx
70
71             # Invoke gccxml on each source file in the current CMDGROUP and delete the dummy file
72             ${T2N_GCCXML_COMMANDS}
73             COMMAND rm -f ${CMDGROUP}_common.hxx
74
75             # Run the code generator on all the generated gccxml files and remove those intermediate gccxml files
76             COMMAND ${LIBT2N_CODEGEN} ${CMDGROUP} ${T2N_GCCXML_FILES}
77             COMMAND rm -f ${T2N_GCCXML_FILES}
78
79             DEPENDS ${${CMDGROUP}_GROUP}
80             )
81
82         # Write out pkgconfig file
83         configure_file(${LIBT2N_CLIENT_PCTEMPLATE} ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc @ONLY@)
84         install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc
85             DESTINATION lib/pkgconfig)
86
87         # Create shared client library
88         add_library(${CMDGROUP} SHARED ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx)
89         set_target_properties(${CMDGROUP} PROPERTIES VERSION ${VERSION} SOVERSION 1)
90         install(TARGETS ${CMDGROUP} LIBRARY DESTINATION lib COMPONENT sharedlibs)
91
92         # Create static client library
93         add_library(${CMDGROUP}-static STATIC ${CMDGROUP}_client.cpp ${CMDGROUP}_client.hxx)
94         set_target_properties(${CMDGROUP}-static PROPERTIES OUTPUT_NAME "${CMDGROUP}")
95         install(TARGETS ${CMDGROUP}-static ARCHIVE DESTINATION lib COMPONENT staticlibs)
96
97         # Prevent clobbering each other during the build
98         set_target_properties(${CMDGROUP} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
99         set_target_properties(${CMDGROUP}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
100
101         install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}_client.hxx ${CMDGROUP}.hxx
102                     DESTINATION include
103                     COMPONENT headers
104         )
105
106         # Wait till generated code is available
107         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)
108         add_dependencies(${CMDGROUP} ${CMDGROUP}_codegen_done)
109         add_dependencies(${CMDGROUP}-static ${CMDGROUP}_codegen_done)
110
111     endforeach(CMDGROUP ${ARGV})
112 endfunction(setup_libt2n)