source: trunk/Mars/CMakeLists.txt @ 19347

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