CMake: removing qpythia from the depedencies
[u/mrichter/AliRoot.git] / cmake / GenParFile.cmake
1 # This CMake function generates a target that, in turn, will generate a PARfile for the given
2 # library.
3 #
4 # Usage: in the CMakeLists.txt, for a given library, add the following:
5 #   add_target_parfile(${MODULE} "${SRCS}" "${HDRS}" "${MODULE}LinkDef.h" "${LIBDEPS}" ["extrainclude1 extrainclude2..."])
6 #
7 # Arguments are, in order:
8 #  - library's name: for libBLAHBLAH it will generate a target BLAHBLAH.par
9 #  - source files: classes to include in the PARfile, they must be exactly the ones used to generate
10 #    the library
11 #  - headers
12 #  - the LinkDef used by ROOT
13 #  - dependent libraries: used to generate the rootmap
14 #  - extra include paths (optional): passed during compilation
15 #
16 # To generate a parfile, if enabled in its CMakeLists.txt, go to the build directory and run:
17 #   make BLAHBLAH.par
18
19 function(add_target_parfile PARMODULE PARSOURCES PARHEADERS PARLINKDEF PARLIBDEPS)
20
21   # Libraries: result is a space-separated string
22   foreach(_THISLIB ${PARLIBDEPS})
23     set(_PARLIBDEPS "${_PARLIBDEPS} lib${_THISLIB}")
24   endforeach()
25   string(STRIP "${_PARLIBDEPS}" PARLIBDEPS)
26
27   # Export variables: used in configure_file()
28   set(PARMODULE "${PARMODULE}")
29   string(REPLACE ";" " " PARSOURCES_FLAT "${PARSOURCES}")
30   string(REPLACE ";" " " PARHEADERS_FLAT "${PARHEADERS}")
31
32   #message(STATUS "[add_target_parfile] Library (space-separated): ${PARMODULE}")
33   #message(STATUS "[add_target_parfile] Sources (list): ${PARSOURCES}")
34   #message(STATUS "[add_target_parfile] Headers (list): ${PARHEADERS}")
35   #message(STATUS "[add_target_parfile] Dependencies (space-separated): ${PARLIBDEPS}")
36
37   if(NOT "${ARGV5}" STREQUAL "")
38     # Optional: extra includes, space-separated
39     set(PAREXTRAINCLUDES "${ARGV5}")
40     #message(STATUS "[add_target_parfile] Extra Includes (space-separated): ${PAREXTRAINCLUDES}")
41   endif()
42
43   # PARfile output directory (the one we will tar)
44   set(PARDIR ${CMAKE_CURRENT_BINARY_DIR}/PARfiles/${PARMODULE})
45
46   # Create base directory for this module's PARfile: this is the directory we will tar
47   # This works as "mkdir -p" (i.e. it's recursive and creates parents)
48   file(MAKE_DIRECTORY ${PARDIR}/PROOF-INF)
49
50   # Create Makefile
51   configure_file(
52       ${PROJECT_SOURCE_DIR}/cmake/PARfiles/Makefile.in
53       ${PARDIR}/Makefile
54       @ONLY
55   )
56
57   # Create BUILD.sh
58   configure_file(
59       ${PROJECT_SOURCE_DIR}/cmake/PARfiles/BUILD.sh.in
60       ${PARDIR}/PROOF-INF/BUILD.sh
61       @ONLY
62   )
63   execute_process(COMMAND chmod a+x ${PARDIR}/PROOF-INF/BUILD.sh)
64
65   # Create SETUP.C
66   configure_file(
67       ${PROJECT_SOURCE_DIR}/cmake/PARfiles/SETUP.C.in
68       ${PARDIR}/PROOF-INF/SETUP.C
69       @ONLY
70   )
71
72   # Target for creating PARfile (would stop after the first failed COMMAND)
73   add_custom_target("${PARMODULE}.par"
74     COMMAND rsync --relative ${PARSOURCES} ${PARHEADERS} ${PARLINKDEF} ${PARDIR}/
75     COMMAND tar -C ${PARDIR}/.. -czf ${PARDIR}/../${PARMODULE}.par ${PARMODULE}/
76     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
77   )
78
79   # Install target
80   install(FILES ${PARDIR}/../${PARMODULE}.par DESTINATION PARfiles OPTIONAL)
81
82   # Add this module to the list of generated PARfiles
83   list(APPEND ALIPARFILES ${PARMODULE})
84   set(ALIPARFILES ${ALIPARFILES} CACHE INTERNAL "ALIPARFILES")
85
86 endfunction()