source: trunk/Mars/CMakeLists.txt @ 19294

Last change on this file since 19294 was 19294, checked in by tbretz, 7 months ago
In this context $ ENV should be just ENV, the subdir must be specified, to avoid confusion renamed libMARS to libCore, the LIBARARY OUTPUT DIRECTORY must be set before the first ROOT_GENERATE_DICTIONARY
File size: 12.4 KB
Line 
1# *********************************
2# ************ cmake **************
3# *********************************
4CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
5CMAKE_POLICY(SET CMP0043 NEW)
6CMAKE_POLICY(SET CMP0048 NEW)
7
8# Enable debug symbols by default
9# must be done before project() statement
10SET(CMAKE_BUILD_TYPE_INIT Release)
11# (you can also set it on the command line: -D CMAKE_BUILD_TYPE=Release)
12
13# Enable CLANG as default compilers, to change this use
14# cmake -DCMAKE_C_COMPILER=cc -DCMAKE_CXX_COMPILER=c++
15# Note that if compilers are switched on the fly,
16# the cache is deleted
17IF(NOT DEFINED CMAKE_C_COMPILER)
18        FIND_PROGRAM(CMAKE_C_COMPILER   NAMES $ENV{CC}  clang   gcc cc  PATHS ENV PATH NO_DEFAULT_PATH DOC "C Compiler")
19ENDIF()
20IF(NOT DEFINED CMAKE_CXX_COMPILER)
21        FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES $ENV{CXX} clang++ g++ c++ PATHS ENV PATH NO_DEFAULT_PATH DOC "C++ Compiler")
22ENDIF()
23
24#SET(CMAKE_VERBOSE_MAKEFILE ON)
25
26# To check for an include file you do this:
27#CHECK_INCLUDE_FILE("stdint.h"        HAVE_STDINT_H)
28# To check the size of a primitive type:
29#CHECK_TYPE_SIZE("int"   SIZEOF_INT)
30
31
32
33# *********************************
34# ************ Project ************
35# *********************************
36
37STRING(TIMESTAMP VERSION %y.%U.%w.%H UTC)
38
39MESSAGE(STATUS "Mars V${VERSION}")
40
41PROJECT(mars VERSION ${VERSION})
42
43INCLUDE(GNUInstallDirs)
44
45# ======== For config.h.in =========
46SET(PACKAGE_MAINTAINER "Thomas Bretz")
47SET(PACKAGE_BUGREPORT  "tbretz@physik.rwth-aachen.de")
48SET(PACKAGE_URL        "https://www.fact-project.org")
49
50
51
52# *********************************
53# ********* Requirements **********
54# *********************************
55
56# Inlclude the main source AND build dir itself
57#SET(CMAKE_INCLUDE_CURRENT_DIR ON)
58SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/dictionary)
59
60# =========== help2man ============
61FIND_PROGRAM(HELP2MAN_EXECUTABLE help2man)
62
63# =========== pkg-config ============
64FIND_PACKAGE(PkgConfig)
65FIND_PACKAGE(PackageHandleStandardArgs)
66
67
68# ============= libnova ==============
69
70PKG_CHECK_MODULES(Nova Nova)
71
72# Try to locate the package in the default path
73# and in the path provided by pkg-config
74FIND_PATH(NOVA_INCLUDE_DIR NAMES libnova/libnova.h PATHS ${NOVA_INCLUDE_DIRS})
75FIND_LIBRARY(NOVA_LIBRARY NAMES nova PATHS ${NOVA_LIBRARY_DIRS})
76
77# Check if NOVA_LIBARARY and NOVA_INCLUDE_DIR is set
78# Print a message otherwise
79FIND_PACKAGE_HANDLE_STANDARD_ARGS(Nova DEFAULT_MSG NOVA_LIBRARY NOVA_INCLUDE_DIR)
80
81# Mark those variables to be displayed as 'advanced' in the GUI
82MARK_AS_ADVANCED(NOVA_LIBRARY NOVA_INCLUDE_DIR)
83
84# handle success
85IF(NOVA_FOUND AND NOT NOVA_FIND_QUIETLY)
86    MESSAGE(STATUS "Found Nova ${NOVA_LIBRARY} in ${NOVA_INCLUDE_DIR}")
87ENDIF()
88
89
90# ============== libz ================
91
92FIND_PACKAGE(ZLIB REQUIRED)
93
94
95# =========== Enable C++11 ===========
96
97SET(CMAKE_CXX_STANDARD 11)
98SET(CMAKE_CXX_FLAGS
99        "${CMAKE_CXX_FLAGS} -Wall -Winit-self -Wpointer-arith \
100         -Wcast-align -Wformat -Woverloaded-virtual \
101         -Wnon-virtual-dtor -Wshadow -fPIC") # -Wextra
102
103SET(CMAKE_CXX_FLAGS
104        "${CMAKE_CXX_FLAGS} \
105         -DMARSVER=\\\"1.0\\\" -D_REENTRANT -D__MARS__ -D__LINUX__ \
106         -DPACKAGE_VERSION=\\\"1.0\\\" -DREVISION=\\\"1.0\\\" \
107         -DPACKAGE_NAME=\\\"MARS\\\" -DHAVE_ZLIB")
108
109
110# --------- ROOT -------------
111
112#IF(EXISTS "$ENV{ROOTSYS}/ROOTConfig.cmake")
113IF(DEFINED ENV{CMAKE_PREFIX_PATH}) # -- This is if compiled with cmake --
114   # You need to tell CMake where to find the ROOT installation. This can be done in a number of ways:
115   #   - ROOT built with classic configure/make use the provided $ROOTSYS/etc/cmake/FindROOT.cmake
116   #   - ROOT built with CMake. Add in CMAKE_PREFIX_PATH the installation prefix for ROOT
117   LIST(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
118   #---Locate the ROOT package and defines a number of variables (e.g. ROOT_INCLUDE_DIRS)
119   FIND_PACKAGE(ROOT REQUIRED COMPONENTS Gui Minuit ASImage HistPainter)
120   #---Define useful ROOT functions and macros (e.g. ROOT_GENERATE_DICTIONARY)
121   INCLUDE(${ROOT_USE_FILE})
122ELSE()
123   # You need to tell CMake where to find the ROOT installation. This can be done in a number of ways:
124   #   - ROOT built with classic configure/make use the provided $ROOTSYS/etc/cmake/FindROOT.cmake
125   #   - ROOT built with CMake. Add in CMAKE_PREFIX_PATH the installation prefix for ROOT
126   SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "$ENV{ROOTSYS}/etc/cmake")
127   #---Locate the ROOT package and defines a number of variables (e.g. ROOT_INCLUDE_DIRS)
128   FIND_PACKAGE(ROOT REQUIRED COMPONENTS Gui Minuit ASImage HistPainter)
129   # From RootUseFile.cmake (root 6)
130   INCLUDE_DIRECTORIES(${ROOT_INCLUDE_DIRS})
131   LINK_DIRECTORIES(${ROOT_LIBRARY_DIR})
132   ADD_DEFINITIONS(${ROOT_DEFINITIONS})
133   SET(CMAKE_CXX_FLAGS     "${CMAKE_CXX_FLAGS} ${ROOT_CXX_FLAGS}")
134   SET(CMAKE_C_FLAGS       "${CMAKE_C_FLAGS} ${ROOT_C_FLAGS}")
135   SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${ROOT_fortran_FLAGS}")
136ENDIF()
137
138# -lGui -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree
139# -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread
140# -lASImage -lMinuit -lHistPainter -lThread
141
142#MESSAGE("INCL_DIRS: ${ROOT_INCLUDE_DIRS}")
143#MESSAGE("LIBS:      ${ROOT_LIBRARIES}")
144#MESSAGE("DEFS:      ${ROOT_DEFINITIONS}")
145#MESSAGE("CXXFLAGS:  ${ROOT_CXX_FLAGS}")
146#MESSAGE("CXFLAGS:   ${ROOT_CC_FLAGS}")
147#MESSAGE("FOUND:     ${ROOT_FOUND}")
148#MESSAGE("FILE:      ${ROOT_USE_FILE}")
149#MESSAGE("DIR:       ${CMAKE_CURRENT_SOURCE_DIR}")
150#ROOT_<library>_LIBRARY PATH    Full path for each of the ROOT libraries listed in COMPONENTS
151#ROOT_<command>_CMD     PATH    Full path for each ROOT executable (rootcling, root, hadd, etc.)
152#ROOT_<option>_FOUND    BOOL    True for each enabled build option (e.g. cocoa, python, xrootd, etc.)
153
154# function ROOT_GENERATE_DICTIONARY( dictionary
155#                                    header1 header2 ...
156#                                    LINKDEF linkdef1 ...
157#                                    OPTIONS opt1...)
158
159CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/root.rc.in"     "${PROJECT_BINARY_DIR}/.rootrc")
160CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/rootlogon.C.in" "${PROJECT_BINARY_DIR}/rootlogon.C")
161
162# -------------------------------------------------------
163
164FILE(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/dictionary)
165
166MACRO(SRCFILES subdir)
167
168        EXECUTE_PROCESS(COMMAND
169                ${PROJECT_SOURCE_DIR}/Makefile.extract.sh ${subdir}
170                WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/${subdir}
171                OUTPUT_VARIABLE _HEADERS)
172
173        SEPARATE_ARGUMENTS(_HEADERS)
174
175        LIST(GET       _HEADERS 0 _CINT)
176        LIST(REMOVE_AT _HEADERS 0)
177
178        SET(_SRCLIST ${_HEADERS})
179
180        STRING(REPLACE "${subdir}/" " "    _HEADERS ${_HEADERS}) # Remove directory
181        STRING(REPLACE ".cc"        ".h"   _HEADERS ${_HEADERS}) # change extension
182        STRING(REPLACE ".cxx"       ".hxx" _HEADERS ${_HEADERS}) # special for files in mmc
183
184        SEPARATE_ARGUMENTS(_HEADERS)
185
186        ROOT_GENERATE_DICTIONARY(dictionary/${_CINT} ${_HEADERS} ${_CINT}Incl.h LINKDEF ${subdir}/${_CINT}LinkDef.h OPTIONS -p  -D__MARS__ -DHAVE_ZLIB)
187        TARGET_SOURCES(mars PRIVATE dictionary/${_CINT}.cxx ${_SRCLIST})
188
189        INSTALL(DIRECTORY ${subdir}/ DESTINATION "include" FILES_MATCHING PATTERN "*.h")
190
191ENDMACRO()
192
193# -------------------------------------------------------
194
195#SET(DIRECTORIES mmc)
196
197SET(DIRECTORIES
198        manalysis
199        mastro
200        mbadpixels
201        mbase
202        mcalib
203        mcamera
204        mcorsika
205        mdata
206        mdrs
207        melectronics
208        mextralgo
209        mfbase
210        mfileio
211        mfilter
212        mgeom
213        mgui
214        mhbase
215        mhcalib
216        mhflux
217        mhft
218        mhist
219        mhvstime
220        mimage
221        mjobs
222        mjoptim
223        mjtrain
224        mmain
225        mmc
226        mmovie
227        mmuon
228        mpedestal
229        mpointing
230        mranforest
231        mraw
232        mreport
233        msignal
234        msim
235        msimcamera
236        msimreflector
237        msql
238        mtools
239        mtrigger
240)
241
242INCLUDE_DIRECTORIES(${DIRECTORIES} mcore .)
243
244ROOT_GENERATE_DICTIONARY(dictionary/Core
245           mcore/factofits.h
246           mcore/factfits.h
247           mcore/DrsCalib.h
248           mcore/PixelMap.h
249           mcore/Interpolator2D.h
250           mcore/nova.h
251           mcore/Prediction.h
252           MIncl.h
253        LINKDEF MLinkDef.h
254        OPTIONS -p -D__MARS__ -DHAVE_ZLIB)
255
256ADD_LIBRARY(mars SHARED dictionary/Core.cxx) # CMAKE_POSITION_INDEPENDENT_CODE
257TARGET_LINK_LIBRARIES(mars
258        ZLIB::ZLIB
259        ${NOVA_LIBRARY}
260        ${ROOT_LIBRARIES})
261
262ADD_EXECUTABLE(showplot showplot.cc)
263ADD_EXECUTABLE(showlog  showplot.cc)
264ADD_EXECUTABLE(ceres    ceres.cc)
265TARGET_LINK_LIBRARIES(showplot mars ${ROOT_LIBRARIES})
266TARGET_LINK_LIBRARIES(showlog  mars ${ROOT_LIBRARIES})
267TARGET_LINK_LIBRARIES(ceres    mars ${ROOT_LIBRARIES})
268
269
270FOREACH(DIR ${DIRECTORIES})
271        MESSAGE(STATUS "Reading source list from ${DIR}/Makefile")
272        SRCFILES(${DIR})
273ENDFOREACH()
274
275# rootlogon.C finds the shared object only if the libmars.so is in the same directory than the dictionary files
276# there is a way to create a map file with rootcling - but I haven#t yet fugured out how. Note that a link is not enough
277#ADD_CUSTOM_COMMAND(TARGET mars POST_BUILD
278#       COMMAND cp -f ${PROJECT_BINARY_DIR}/libmars.so ${PROJECT_BINARY_DIR}/dictionary/libmars.so
279#       COMMENT "Copying libmars.so to ${PROJECT_BINARY_DIR}/dictionary")
280
281#---Create a shared library with geneated dictionary
282#ADD_LIBRARY(Event SHARED Event.cxx G__Event.cxx)
283#TARGET_LINK_LIBRARIES(Event ${ROOT_LIBRARIES})
284
285#---Create  a main program using the library
286#ADD_EXECUTABLE(Main MainEvent.cxx)
287#TARGET_LINK_LIBRARIES(Main Event)
288
289
290# *********************************
291# ************ Packaging **********
292# *********************************
293
294#SET(PKG_SHARE    "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}")
295#SET(PKG_APPS     "${CMAKE_INSTALL_DATAROOTDIR}/applications")
296#SET(PKG_PIXMAPS  "${CMAKE_INSTALL_DATAROOTDIR}/pixmaps")
297
298# ====== Installation targets =====
299
300#INSTALL(TARGETS  mars           DESTINATION "${CMAKE_INSTALL_BINDIR}")
301INSTALL(TARGETS   mars         DESTINATION ".")
302INSTALL(TARGETS   showplot     DESTINATION ".")
303INSTALL(TARGETS   showlog      DESTINATION ".")
304INSTALL(TARGETS   ceres        DESTINATION ".")
305INSTALL(FILES     .rootrc      DESTINATION ".")
306INSTALL(DIRECTORY macros       DESTINATION "." FILES_MATCHING PATTERN "*.C")
307INSTALL(DIRECTORY fact         DESTINATION "." FILES_MATCHING PATTERN "*.C")
308INSTALL(DIRECTORY datacenter   DESTINATION ".")
309INSTALL(DIRECTORY scripts      DESTINATION ".")
310INSTALL(DIRECTORY resources    DESTINATION "." FILES_MATCHING PATTERN "*.rc" PATTERN "*.txt")
311INSTALL(DIRECTORY resmc        DESTINATION "." FILES_MATCHING PATTERN "*" )
312INSTALL(DIRECTORY mcore/       DESTINATION "include" FILES_MATCHING PATTERN "*.h")
313
314
315# ======== General packaging ======
316# https://cmake.org/cmake/help/latest/module/CPack.html
317
318INCLUDE(InstallRequiredSystemLibraries)
319
320# SET(CPACK_STRIP_FILES ON) # Strip debug sysmbold from files
321
322SET(CPACK_PACKAGE_VERSION       "${mars_VERSION}")
323SET(CPACK_PACKAGE_CONTACT       "${PACKAGE_BUGREPORT}")
324SET(CPACK_PACKAGE_MAINTAINER    "${PACKAGE_MAINTAINER}")
325#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
326#SET(CPACK_PACKAGE_VENDOR "Me, myself, and I")
327
328
329SET(CPACK_SOURCE_IGNORE_FILES "/old/;/build/;/[.].*/;/autom4te[.]cache/;.*~;.log$")
330
331# Maybe the text displayed in synaptic?
332#SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README")
333SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MARS - Environment")
334#CPACK_RESOURCE_FILE_README     ReadMe file to be embedded in the installer.
335
336SET(CPACK_GENERATOR        TBZ2) # TGZ DEB
337#SET(CPACK_SOURCE_GENERATOR TBZ2) # TGZ
338#SET(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/cmake/Package.txt)
339#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")
340
341
342# ======== Debian packaging =======
343# https://cmake.org/cmake/help/latest/module/CPackDeb.html
344# https://www.debian.org/doc/debian-policy
345
346#SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libao4 (>=1.0), libsfm-system2.3v5 (>=2.3), libsfml-graphicsv2.3v5 (>=2.3), libsfml-audio2.3v5 (>=2.3), libsfm-window2.3v5 (>2.3)")
347SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS 1) # generate better (atomatic?) dependecies
348SET(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY ">=")
349SET(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
350SET(CPACK_DEBIAN_PACKAGE_SECTION utils)
351SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PACKAGE_URL}")
352SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION
353"${CPACK_PACKAGE_DESCRIPTION_SUMMARY}
354 This package contains the MARS Analysis Environment.")
355#indent the long description with spaces
356
357#CPACK_INSTALL_CMAKE_PROJECTS
358#List of four values that specify what project to install. Build directory, Project Name, Project Component, Directory.
359
360INCLUDE(CPack)
Note: See TracBrowser for help on using the repository browser.