source: trunk/Mars/CMakeLists.txt@ 19450

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