source: trunk/Mars/CMakeLists.txt @ 19491

Last change on this file since 19491 was 19491, checked in by tbretz, 3 months ago
For convienece in debugging, print system information when available.
File size: 13.7 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
50FIND_PROGRAM(LSB_RELEASE_EXE NAMES lsb_release)
51IF (DEFINED LSB_RELEASE_EXE)
52   EXECUTE_PROCESS(COMMAND ${LSB_RELEASE_EXE} -d OUTPUT_VARIABLE LSB_RELEASE OUTPUT_STRIP_TRAILING_WHITESPACE)
53   MESSAGE(STATUS ${LSB_RELEASE})
54ENDIF()
55
56# *********************************
57# ********* Requirements **********
58# *********************************
59
60# Inlclude the main source AND build dir itself
61#SET(CMAKE_INCLUDE_CURRENT_DIR ON)
62SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
63
64# =========== help2man ============
65FIND_PROGRAM(HELP2MAN_EXECUTABLE help2man)
66
67# =========== pkg-config ============
68FIND_PACKAGE(PkgConfig)
69FIND_PACKAGE(PackageHandleStandardArgs)
70
71
72# ============= libnova ==============
73
74PKG_CHECK_MODULES(Nova QUIET Nova)
75
76# Try to locate the package in the default path
77# and in the path provided by pkg-config
78FIND_PATH(NOVA_INCLUDE_DIR NAMES libnova/libnova.h PATHS ${NOVA_INCLUDE_DIRS})
79FIND_LIBRARY(NOVA_LIBRARY NAMES nova PATHS ${NOVA_LIBRARY_DIRS})
80
81# Check if NOVA_LIBARARY and NOVA_INCLUDE_DIR is set
82# Print a message otherwise
83FIND_PACKAGE_HANDLE_STANDARD_ARGS(Nova DEFAULT_MSG NOVA_LIBRARY NOVA_INCLUDE_DIR)
84
85# Mark those variables to be displayed as 'advanced' in the GUI
86MARK_AS_ADVANCED(NOVA_LIBRARY NOVA_INCLUDE_DIR)
87
88# handle success
89FIND_PACKAGE_MESSAGE(NovaInc "Found Nova headers in ${NOVA_INCLUDE_DIR}" "[${NOVA_LIBRARY}][${NOVA_INCLUDE_DIR}]")
90
91
92# ============== libz ================
93
94FIND_PACKAGE(ZLIB REQUIRED)
95
96# ============== ROOT ================
97
98FIND_PROGRAM(ROOTCONFIG_EXECUTABLE NAMES root-config)
99FIND_PACKAGE_HANDLE_STANDARD_ARGS(root-config DEFAULT_MSG ROOTCONFIG_EXECUTABLE)
100IF(NOT ROOTCONFIG_EXECUTABLE)
101   MESSAGE(FATAL_ERROR "Please make sure `root-config` is accessible in your path. In case of an installation from source, you might need to source\n . [path-to-root]/bin/thisroot.sh")
102ENDIF()
103
104# You need to tell CMake where to find the ROOT installation. This can be done in a number of ways:
105#   - ROOT built with classic configure/make use the provided $ROOTSYS/etc/cmake/FindROOT.cmake
106#   - ROOT built with CMake. Add in CMAKE_PREFIX_PATH the installation prefix for ROOT
107IF(EXISTS $ENV{ROOTSYS}/ROOTConfig.cmake)
108   IF(NOT DEFINED ENV{CMAKE_PREFIX_PATH})
109      LIST(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
110   ENDIF()
111ELSE()
112   SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "$ENV{ROOTSYS}/etc/cmake")
113ENDIF()
114
115#---Locate the ROOT package and defines a number of variables (e.g. ROOT_INCLUDE_DIRS)
116FIND_PACKAGE(ROOT REQUIRED COMPONENTS Gui Minuit ASImage HistPainter)
117
118IF(NOT DEFINED ROOT_CONFIG_EXECUTABLE)
119   FIND_PACKAGE_MESSAGE(RootFound "Found ROOT: ${ROOT_INCLUDE_DIRS} [${ROOT_VERSION}]" "[${ROOT_INCLUDE_DIRS}][${ROOT_LIBRARY_DIR}][${ROOT_VERSION}]")
120ENDIF()
121
122#---Define useful ROOT functions and macros (e.g. ROOT_GENERATE_DICTIONARY)
123IF(DEFINED ROOT_USE_FILE)
124   FIND_PACKAGE_MESSAGE(RootInclude "Setup ROOT: ${ROOT_USE_FILE}" "[${ROOT_USE_FILE}]")
125   INCLUDE(${ROOT_USE_FILE})
126ELSE()
127   FIND_PACKAGE_MESSAGE(RootInclude "Setup ROOT: ${ROOT_VERSION}" "[${ROOT_VERSION}]")
128   # From RootUseFile.cmake (root 6)
129   INCLUDE_DIRECTORIES(${ROOT_INCLUDE_DIRS})
130   LINK_DIRECTORIES(${ROOT_LIBRARY_DIR})
131   ADD_DEFINITIONS(${ROOT_DEFINITIONS})
132   SET(CMAKE_CXX_FLAGS     "${CMAKE_CXX_FLAGS} ${ROOT_CXX_FLAGS}")
133   SET(CMAKE_C_FLAGS       "${CMAKE_C_FLAGS} ${ROOT_C_FLAGS}")
134   SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${ROOT_fortran_FLAGS}")
135ENDIF()
136
137# -lGui -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree
138# -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread
139# -lASImage -lMinuit -lHistPainter -lThread
140
141#MESSAGE("INCL_DIRS: ${ROOT_INCLUDE_DIRS}")
142#MESSAGE("LIBS:      ${ROOT_LIBRARIES}")
143#MESSAGE("DEFS:      ${ROOT_DEFINITIONS}")
144#MESSAGE("CXXFLAGS:  ${ROOT_CXX_FLAGS}")
145#MESSAGE("CXFLAGS:   ${ROOT_CC_FLAGS}")
146#MESSAGE("FOUND:     ${ROOT_FOUND}")
147#MESSAGE("FILE:      ${ROOT_USE_FILE}")
148#MESSAGE("DIR:       ${CMAKE_CURRENT_SOURCE_DIR}")
149#ROOT_<library>_LIBRARY PATH    Full path for each of the ROOT libraries listed in COMPONENTS
150#ROOT_<command>_CMD     PATH    Full path for each ROOT executable (rootcling, root, hadd, etc.)
151#ROOT_<option>_FOUND    BOOL    True for each enabled build option (e.g. cocoa, python, xrootd, etc.)
152
153# function ROOT_GENERATE_DICTIONARY( dictionary
154#                                    header1 header2 ...
155#                                    LINKDEF linkdef1 ...
156#                                    OPTIONS opt1...)
157
158# *********************************
159# ********** Observatory **********
160# *********************************
161
162SET(OBSERVATORY "ORM" CACHE STRING "Select the observatory location (ORM, HAWC, SPM, RWTH: see nova.h)")
163
164IF(NOT OBSERVATORY STREQUAL "ORM"  AND
165   NOT OBSERVATORY STREQUAL "HAWC" AND
166   NOT OBSERVATORY STREQUAL "SPM"  AND
167   NOT OBSERVATORY STREQUAL "RWTH")
168   MESSAGE(FATAL_ERROR "OBSERVATORY=${OBSERVATORY} invalid. Only ORM, HAWC, SPM and RWTH allowd!")
169ENDIF()
170
171FIND_PACKAGE_MESSAGE(PresetObservatory "Preset Observatory: ${OBSERVATORY}" "[${OBSERVATORY}]")
172
173
174# *********************************
175# *********** Compiler ************
176# *********************************
177
178SET(CMAKE_CXX_STANDARD 11)
179SET(CMAKE_CXX_FLAGS
180        "${CMAKE_CXX_FLAGS} -Wall -Winit-self -Wpointer-arith \
181         -Wcast-align -Wformat -Woverloaded-virtual \
182         -Wnon-virtual-dtor -Wshadow -fPIC") # -Wextra
183
184SET(CMAKE_CXX_FLAGS
185        "${CMAKE_CXX_FLAGS} \
186         -DMARSVER=\\\"1.0\\\" -D_REENTRANT -D__MARS__ -D__LINUX__ \
187         -DPACKAGE_VERSION=\\\"1.0\\\" -DREVISION=\\\"1.0\\\" \
188         -DPACKAGE_NAME=\\\"MARS\\\" -DHAVE_ZLIB")
189
190CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/root.rc.in"     "${PROJECT_BINARY_DIR}/.rootrc")
191CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/rootlogon.C.in" "${PROJECT_BINARY_DIR}/rootlogon.C")
192CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/dohtml.C.in"    "${PROJECT_BINARY_DIR}/dohtml.C")
193
194# -------------------------------------------------------
195
196FILE(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/dictionary)
197
198MACRO(SRCFILES subdir)
199
200        MESSAGE(STATUS "Reading source list from ${DIR}/Makefile")
201
202        EXECUTE_PROCESS(COMMAND
203                ${PROJECT_SOURCE_DIR}/Makefile.extract.sh ${subdir}
204                WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/${subdir}
205                OUTPUT_VARIABLE _HEADERS)
206
207        SEPARATE_ARGUMENTS(_HEADERS)
208
209        LIST(GET       _HEADERS 0 _CINT)
210        LIST(REMOVE_AT _HEADERS 0)
211
212        SET(_SRCLIST ${_HEADERS})
213
214        STRING(REPLACE "${subdir}/" " "    _HEADERS ${_HEADERS}) # Remove directory
215        STRING(REPLACE ".cc"        ".h"   _HEADERS ${_HEADERS}) # change extension
216        STRING(REPLACE ".cxx"       ".hxx" _HEADERS ${_HEADERS}) # special for files in mmc
217
218        SEPARATE_ARGUMENTS(_HEADERS)
219
220        # - This adds the rule how the dictionary is created
221        ROOT_GENERATE_DICTIONARY(dictionary/${_CINT} ${_HEADERS} ${_CINT}Incl.h LINKDEF ${subdir}/${_CINT}LinkDef.h OPTIONS -p  -D__MARS__ -DHAVE_ZLIB)
222        # - This makes sure that it is compiled
223        TARGET_SOURCES(mars PRIVATE dictionary/${_CINT}.cxx ${_SRCLIST})
224
225        INSTALL(DIRECTORY ${subdir}/ DESTINATION "include" FILES_MATCHING PATTERN "*.h")
226
227ENDMACRO()
228
229# -------------------------------------------------------
230
231#SET(DIRECTORIES mmc)
232
233SET(DIRECTORIES
234        manalysis
235        mastro
236        mbadpixels
237        mbase
238        mcalib
239        mcamera
240        mcorsika
241        mdata
242        mdrs
243        melectronics
244        mextralgo
245        mfbase
246        mfileio
247        mfilter
248        mgeom
249        mgui
250        mhbase
251        mhcalib
252        mhflux
253        mhft
254        mhist
255        mhvstime
256        mimage
257        mjobs
258        mjoptim
259        mjtrain
260        mmain
261        mmc
262        mmovie
263        mmuon
264        mpedestal
265        mpointing
266        mranforest
267        mraw
268        mreport
269        msignal
270        msim
271        msimcamera
272        msimreflector
273        msql
274        mtools
275        mtrigger
276)
277
278INCLUDE_DIRECTORIES(${DIRECTORIES} mcore .)
279
280ROOT_GENERATE_DICTIONARY(dictionary/Core
281           mcore/factofits.h
282           mcore/factfits.h
283           mcore/DrsCalib.h
284           mcore/PixelMap.h
285           mcore/Interpolator2D.h
286           mcore/nova.h
287           mcore/Prediction.h
288           MIncl.h
289        LINKDEF MLinkDef.h
290        OPTIONS -p -D__MARS__ -DHAVE_ZLIB)
291
292ADD_LIBRARY(mars SHARED dictionary/Core.cxx) # CMAKE_POSITION_INDEPENDENT_CODE
293TARGET_LINK_LIBRARIES(mars
294        ZLIB::ZLIB
295        ${NOVA_LIBRARY}
296        ${ROOT_LIBRARIES})
297
298ADD_EXECUTABLE(showplot showplot.cc)
299ADD_EXECUTABLE(showlog  showplot.cc)
300ADD_EXECUTABLE(ceres    ceres.cc)
301TARGET_LINK_LIBRARIES(showplot mars ${ROOT_LIBRARIES})
302TARGET_LINK_LIBRARIES(showlog  mars ${ROOT_LIBRARIES})
303TARGET_LINK_LIBRARIES(ceres    mars ${ROOT_LIBRARIES})
304
305
306FOREACH(DIR ${DIRECTORIES})
307        SRCFILES(${DIR})
308ENDFOREACH()
309
310# rootlogon.C finds the shared object only if the libmars.so is in the same directory than the dictionary files
311# 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
312#ADD_CUSTOM_COMMAND(TARGET mars POST_BUILD
313#       COMMAND cp -f ${PROJECT_BINARY_DIR}/libmars.so ${PROJECT_BINARY_DIR}/dictionary/libmars.so
314#       COMMENT "Copying libmars.so to ${PROJECT_BINARY_DIR}/dictionary")
315
316#---Create a shared library with geneated dictionary
317#ADD_LIBRARY(Event SHARED Event.cxx G__Event.cxx)
318#TARGET_LINK_LIBRARIES(Event ${ROOT_LIBRARIES})
319
320#---Create  a main program using the library
321#ADD_EXECUTABLE(Main MainEvent.cxx)
322#TARGET_LINK_LIBRARIES(Main Event)
323
324
325# *********************************
326# ************ Packaging **********
327# *********************************
328
329#SET(PKG_SHARE    "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}")
330#SET(PKG_APPS     "${CMAKE_INSTALL_DATAROOTDIR}/applications")
331#SET(PKG_PIXMAPS  "${CMAKE_INSTALL_DATAROOTDIR}/pixmaps")
332
333# ====== Installation targets =====
334
335#INSTALL(TARGETS  mars           DESTINATION "${CMAKE_INSTALL_BINDIR}")
336INSTALL(TARGETS   mars         DESTINATION ".")
337INSTALL(TARGETS   showplot     DESTINATION ".")
338INSTALL(TARGETS   showlog      DESTINATION ".")
339INSTALL(TARGETS   ceres        DESTINATION ".")
340INSTALL(FILES     .rootrc      DESTINATION ".")
341INSTALL(DIRECTORY lib          DESTINATION ".")
342INSTALL(DIRECTORY macros       DESTINATION "." FILES_MATCHING PATTERN "*.C")
343INSTALL(DIRECTORY fact         DESTINATION "." FILES_MATCHING PATTERN "*.C")
344INSTALL(DIRECTORY datacenter   DESTINATION ".")
345INSTALL(DIRECTORY scripts      DESTINATION ".")
346INSTALL(DIRECTORY resources    DESTINATION "." FILES_MATCHING PATTERN "*.rc" PATTERN "*.txt")
347INSTALL(DIRECTORY resmc        DESTINATION "." FILES_MATCHING PATTERN "*" )
348INSTALL(DIRECTORY mcore/       DESTINATION "include" FILES_MATCHING PATTERN "*.h")
349
350
351# ======== General packaging ======
352# https://cmake.org/cmake/help/latest/module/CPack.html
353
354INCLUDE(InstallRequiredSystemLibraries)
355
356# SET(CPACK_STRIP_FILES ON) # Strip debug sysmbold from files
357
358SET(CPACK_PACKAGE_VERSION       "${mars_VERSION}")
359SET(CPACK_PACKAGE_CONTACT       "${PACKAGE_BUGREPORT}")
360SET(CPACK_PACKAGE_MAINTAINER    "${PACKAGE_MAINTAINER}")
361#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
362#SET(CPACK_PACKAGE_VENDOR "Me, myself, and I")
363
364
365SET(CPACK_SOURCE_IGNORE_FILES "/old/;/build/;/[.].*/;/autom4te[.]cache/;.*~;.log$")
366
367# Maybe the text displayed in synaptic?
368#SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README")
369SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MARS - Environment")
370#CPACK_RESOURCE_FILE_README     ReadMe file to be embedded in the installer.
371
372SET(CPACK_GENERATOR        TBZ2) # TGZ DEB
373#SET(CPACK_SOURCE_GENERATOR TBZ2) # TGZ
374#SET(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/cmake/Package.txt)
375#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")
376
377
378# ======== Debian packaging =======
379# https://cmake.org/cmake/help/latest/module/CPackDeb.html
380# https://www.debian.org/doc/debian-policy
381
382#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)")
383SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS 1) # generate better (atomatic?) dependecies
384SET(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY ">=")
385SET(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
386SET(CPACK_DEBIAN_PACKAGE_SECTION utils)
387SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PACKAGE_URL}")
388SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION
389"${CPACK_PACKAGE_DESCRIPTION_SUMMARY}
390 This package contains the MARS Analysis Environment.")
391#indent the long description with spaces
392
393#CPACK_INSTALL_CMAKE_PROJECTS
394#List of four values that specify what project to install. Build directory, Project Name, Project Component, Directory.
395
396INCLUDE(CPack)
Note: See TracBrowser for help on using the repository browser.