Add cmake code generator support to libt2n
[libt2n] / examples-codegen / cmake / Libt2n.cmake
1 # Detect libt2n. Version of this file: 1.0
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     include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
25
26     string(LENGTH ${ARGV} CMDGROUP_LEN)
27     if (${CMDGROUP_LEN} EQUAL 0)
28         message(FATAL_ERROR "libt2n CMDGROUP is empty")
29     endif(${CMDGROUP_LEN} EQUAL 0)
30
31     foreach(CMDGROUP ${ARGV})
32         message("Processing libt2n command group ${CMDGROUP}")
33
34         # Run each .cpp file through gccxml
35         foreach(T2NFILE ${${CMDGROUP}_GROUP})
36             get_filename_component(FILE_WE ${T2NFILE} NAME_WE)
37             get_filename_component(NAME ${T2NFILE} NAME)
38             message("   Processing file ${NAME}")
39
40             # Compute include directories
41             # TODO: http://www.cmake.org/Bug/view.php?id=11889 contains a better solution
42             get_property(gcc_include_dirs
43                 DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
44                 PROPERTY INCLUDE_DIRECTORIES
45             )
46             set(gccxml_include_dirs "")
47             foreach(gcc_include_dir ${gcc_include_dirs})
48                 set(gccxml_include_dirs "${gccxml_include_dirs} -I${gcc_include_dir}")
49             endforeach(gcc_include_dir ${gcc_include_dirs})
50
51             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
52                 # Create dummy _common.hxx file
53                 COMMAND echo "\\#include \\\"codegen-stubhead.hxx\\\"" >${FILE_WE}_common.hxx
54                 COMMAND echo "\\#include \\\"${FILE_WE}.hxx\\\"" >>${FILE_WE}_common.hxx
55
56                 # Invoke gccxml
57                 COMMAND ${LIBT2N_GCCXML} ${gccxml_include_dirs} ${T2NFILE} -fxml=${FILE_WE}.xml || rm -f ${FILE_WE}_common.hxx
58
59                 # Transform xml file to real code
60                 COMMAND ${LIBT2N_CODEGEN} ${CMDGROUP} ${FILE_WE}.xml
61                 COMMAND rm -f ${FILE_WE}.xml
62
63                 DEPENDS ${T2NFILE}
64             )
65         endforeach(T2NFILE ${${CMDGROUP}_GROUP})
66
67         # Write out pkgconfig file
68         configure_file(${LIBT2N_CLIENT_PCTEMPLATE} ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc @ONLY@)
69         install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMDGROUP}.pc
70             DESTINATION lib/pkgconfig)
71
72         # Create shared client library
73         add_library(${CMDGROUP} SHARED ${FILE_WE}_client.cpp ${FILE_WE}_client.hxx)
74         set_target_properties(${CMDGROUP} PROPERTIES VERSION ${VERSION} SOVERSION 1)
75         install(TARGETS ${CMDGROUP} LIBRARY DESTINATION lib COMPONENT sharedlibs)
76
77         # Create static client library
78         add_library(${CMDGROUP}-static STATIC ${FILE_WE}_client.cpp ${FILE_WE}_client.hxx)
79         set_target_properties(${CMDGROUP}-static PROPERTIES OUTPUT_NAME "${CMDGROUP}")
80         install(TARGETS ${CMDGROUP}-static ARCHIVE DESTINATION lib COMPONENT staticlibs)
81
82         # Prevent clobbering each other during the build
83         set_target_properties(${CMDGROUP} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
84         set_target_properties(${CMDGROUP}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
85
86         install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${FILE_WE}_client.hxx ${FILE_WE}.hxx
87                     DESTINATION include
88                     COMPONENT headers
89         )
90
91         # Wait till generated code is available
92         add_custom_target(${CMDGROUP}_codegen_done ALL DEPENDS ${FILE_WE}_common.cpp)
93         add_dependencies(${CMDGROUP} ${CMDGROUP}_codegen_done)
94         add_dependencies(${CMDGROUP}-static ${CMDGROUP}_codegen_done)
95
96     endforeach(CMDGROUP ${ARGV})
97 endfunction(setup_libt2n)