source: trunk/Mars/CMakeLists.txt @ 19299

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