source: trunk/Mars/CMakeLists.txt@ 19305

Last change on this file since 19305 was 19299, checked in by tbretz, 6 years 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.