CMakeLists.txt 15.3 KB
Newer Older
1
cmake_minimum_required (VERSION 2.8.9)
2

Jan Möbius's avatar
Jan Möbius committed
3
4
5
6
7
8
9
10
# ACG Environment default settings
# This is ugly but currently we need to work around the default installed 5.3 on debian
if ( EXISTS /ACG/acgdev/gcc-4.9-x86_64/qt-5.5.1/5.5/gcc_64/ )
  # Default to this install path for QT%_INSTALL_DIR
  set (QT5_INSTALL_PATH /ACG/acgdev/gcc-4.9-x86_64/qt-5.5.1/5.5/gcc_64/ CACHE PATH "Qt5 install path set for ACG environment" )
endif()


11
12
13
if ( WIN32 )
  # This is the base directory for windows library search used in the finders we shipp.
  set(CMAKE_WINDOWS_LIBS_DIR "c:/libs" CACHE STRING "Default Library search dir on windows." )
Jan Möbius's avatar
Jan Möbius committed
14
endif()
15

16
17
if (NOT CMAKE_BUILD_TYPE)
  message(STATUS "No build type selected, default to Release")
18
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
19
20
endif()

Jan Möbius's avatar
Jan Möbius committed
21
22

IF ( APPLE )
23
24
25
	IF(CMAKE_BUILD_TYPE MATCHES Debug)
	    message(WARNING "WARNING: Mac Debug mode might mix debug and release libraries (Webkit, ...), which causes strange errors. If you use ports to provide qt, you might want to disable Qt debug libraries to make sure only release qt libraries are linked to OpenFlippers debug build.")
	ENDIF(CMAKE_BUILD_TYPE MATCHES Debug)
Jan Möbius's avatar
Jan Möbius committed
26
27
28
endif()


29
30
31
32
33
project (OpenFlipper)

# add our macro directory to cmake search path
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)

34
35
36
37
38
39
40
# search for more macro directories in Package-* folders
file (
  GLOB _more_macro_directories
       "${CMAKE_SOURCE_DIR}/Package-*/cmake"
)
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${_more_macro_directories})

41
42
43
44
45
# include our cmake files
include (ACGCommon)

acg_get_version (OpenFlipper)

46
# ========================================================================
47
# Branding 
48
49
# ========================================================================

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80


# search all branding dirs in the packages and in toplevel
file (
  GLOB _local_branding_in
  RELATIVE "${CMAKE_SOURCE_DIR}"
           "${CMAKE_SOURCE_DIR}/branding"
           "${CMAKE_SOURCE_DIR}/Package-*/branding"
)

# Get number of found branding dirs
list(LENGTH _local_branding_in branding_dir_count)

# Check if we found at least one branding directory
if (  ${branding_dir_count} GREATER 0 )

  list(GET _local_branding_in 0 BRANDING_DIRECTORY_TMP)
  set( BRANDING_DIRECTORY "${CMAKE_SOURCE_DIR}/${BRANDING_DIRECTORY_TMP}" CACHE PATH "Path to the branding files")

  if ( ${branding_dir_count} GREATER 1 )
    message(WARNING "Found multiple branding dirs in : ${_local_branding_in}")
    message(WARNING "Using only first branding directory: ${BRANDING_DIRECTORY}")    
  endif()
  
elseif()
  set( BRANDING_DIRECTORY "branding" CACHE PATH "Path to the branding files")

endif()

if ( EXISTS ${BRANDING_DIRECTORY}/branding.cmake )
	include(${BRANDING_DIRECTORY}/branding.cmake)
81
82
endif()

83
84
85
86
87
88
if ( EXISTS ${BRANDING_DIRECTORY}/branding.h )
  set( BRANDING_HEADER true CACHE String "Indicate there is a branding.h inside the branding folder that should be included.")
endif()


#Initialize with defaults, if not already set via branding cmake file
89
90
91
set( OPENFLIPPER_PRODUCT_STRING "OpenFlipper" CACHE String "Product string used e.g. to determine the config file path. Should only contain alphanumeric characters (no spaces)." )
set( OPENFLIPPER_PRODUCT_NAME "OpenFlipper" CACHE String "Product name used in all visible places (e.g. about box)." )

92
93
94
95
if (BRANDING_HEADER)
add_definitions(-DBRANDING_HEADER)
endif ()

96
97
98
99
100
101
add_definitions(-DPRODUCT_STRING=${OPENFLIPPER_PRODUCT_STRING})
add_definitions(-DPRODUCT_NAME=${OPENFLIPPER_PRODUCT_NAME})

# ========================================================================
# ========================================================================

102
103
104
include (package)
include (ACGOutput)

Matthias Möller's avatar
Matthias Möller committed
105
# try to use QT5 if possible otherwise stick to QT4
Matthias Möller's avatar
Matthias Möller committed
106
set (FORCE_QT4 OFF CACHE BOOL "Use Qt4 even if Qt5 was found")
Matthias Möller's avatar
Matthias Möller committed
107
108
109
110
111
112
113
114

if (NOT FORCE_QT4)
  acg_qt5 ()
else()
  set (QT5_FOUND false)
endif()

if (NOT QT5_FOUND)
Matthias Möller's avatar
Matthias Möller committed
115
  message(STATUS "Could not find QT5, searching for QT4")
Matthias Möller's avatar
Matthias Möller committed
116
  acg_qt4 (4.7.0)
Matthias Möller's avatar
Matthias Möller committed
117
118
119
120
121
122
endif()

if (QT4_FOUND)
	message(STATUS "Using QT4 for OpenFlipper")
elseif(QT5_FOUND)
	message(STATUS "Using QT5 for OpenFlipper")
123
	set (OF_MAX_QT_VERSION "5.5.1")
124
125
126
127
    if (${Qt5Core_VERSION_STRING} STRGREATER ${OF_MAX_QT_VERSION})
      message(WARNING "Detected QT Version higher than ${OF_MAX_QT_VERSION}!\n"
        "OpenFlipper has not been tested with this QT Version on Windows.")
    endif()
Matthias Möller's avatar
Matthias Möller committed
128
else()
Matthias Möller's avatar
Matthias Möller committed
129
	message(FATAL_ERROR "Could not found any QT Version. Please specify QT5_INSTALL_PATH (path to bin and include dir) to build with QT5 or specify the QT_QMAKE_EXECUTABLE to build with QT4")
Matthias Möller's avatar
Matthias Möller committed
130
endif()
Jan Möbius's avatar
Jan Möbius committed
131

132
133
acg_openmp ()

134
# check for OpenGL, GLEW and GLUT as our required dependencies
135
136
137
138
139
find_package (OpenGL)
if (NOT OPENGL_FOUND)
  message (FATAL_ERROR "OpengGL not found!")
endif ()

140
141
142
143
144
find_package (GLEW)
if (NOT GLEW_FOUND)
  message (FATAL_ERROR "GLEW not found!")
endif ()

145
146
147
148
find_package (GLUT)
if (NOT GLUT_FOUND)
  message (FATAL_ERROR "GLUT not found!")
endif ()
149
150
151
152

# using the internal openmesh delivered by the svn repo (default) or use some external installation
set (USE_INTERNAL_OPENMESH ON CACHE BOOL "Use and build internal version of OpenMesh found in libs_required")

153
154
155
156
157
158
# enable/disable openmesh warnings
set(NO_DECREMENT_DEPRECATED_WARNINGS OFF CACHE BOOL "Disables all deprecated warnings warning about decrement operations on normal circulators.")
if(NO_DECREMENT_DEPRECATED_WARNINGS)
  add_definitions( -DNO_DECREMENT_DEPRECATED_WARNINGS )
endif()

Jan Möbius's avatar
Jan Möbius committed
159
# OpenMesh is a dependent project (in libs_required) so no finder is needed.
160
161
162
163
if (NOT USE_INTERNAL_OPENMESH)
  find_package (OpenMesh REQUIRED)
endif()

164
165
find_package (OpenVolumeMesh)
if (NOT OPENVOLUMEMESH_FOUND)
166
    message (WARNING "OpenVolumeMesh not found, proceeding without it!")
167
endif ()
168

169

170
171
172
173
# ========================================================================
# Configure the executables path for tests
# ========================================================================
if (APPLE)
174
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/OpenFlipper.app/Contents/MacOS/${OPENFLIPPER_PRODUCT_STRING}" )
175
elseif( WIN32 )
176
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/${OPENFLIPPER_PRODUCT_STRING}.exe" )
177
else()
178
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/bin/${OPENFLIPPER_PRODUCT_STRING}" )
179
endif()
180
181
182
SET(OPENFLIPPER_TEST_FILES    ${CMAKE_BINARY_DIR}/tests/globalTestFiles )
SET(OPENFLIPPER_TEST_RESULTS  ${CMAKE_BINARY_DIR}/tests/testResults )
SET(OPENFLIPPER_TEST_BINARIES ${CMAKE_BINARY_DIR}/tests/testBinaries )
183

184
185
enable_testing()

186
# ========================================================================
Matthias Möller's avatar
Matthias Möller committed
187
# Build all additional libraries
188
189
# ========================================================================

Matthias Möller's avatar
Matthias Möller committed
190
# search all libs in the libs directory
191
# (required and optional libraries
192
193
194
file (
  GLOB _local_libs_in
  RELATIVE "${CMAKE_SOURCE_DIR}"
195
           "${CMAKE_SOURCE_DIR}/libs_required/*/CMakeLists.txt"
Jan Möbius's avatar
Jan Möbius committed
196
           "${CMAKE_SOURCE_DIR}/libs/*/CMakeLists.txt"
197
           "${CMAKE_SOURCE_DIR}/Package-*/libs/*/CMakeLists.txt"
198
199
)

Jan Möbius's avatar
Jan Möbius committed
200
201
202
203
set( REMAINING_LOCAL_LIBS "" )

# Special Comiso case:
# The library has to be configured first
204
foreach (_localLib ${_local_libs_in})
Jan Möbius's avatar
Jan Möbius committed
205
206
  if ( "${_localLib}" MATCHES .*CoMISo.* )
    get_filename_component (_local_lib_dir ${_localLib} PATH)
207
208
209
210
211
212
213
    if ( NOT DEFINED LIB_COMISO_BUILD )
      set( LIB_COMISO_BUILD true CACHE BOOL "Enable or disable build of COMISO Library" )
    endif()

    if ( LIB_COMISO_BUILD )
      add_subdirectory (${CMAKE_SOURCE_DIR}/${_local_lib_dir})
    endif()
Jan Möbius's avatar
Jan Möbius committed
214
  else()
215
216
217
    if ( NOT "${_localLib}" MATCHES OpenMesh OR USE_INTERNAL_OPENMESH)
      LIST(APPEND REMAINING_LOCAL_LIBS ${_localLib})
    endif()
Jan Möbius's avatar
Jan Möbius committed
218
219
220
221
222
223
  endif()
endforeach ()


# add all found libs to the build
foreach (_localLib ${REMAINING_LOCAL_LIBS})
224

225
  get_filename_component (_local_lib_dir ${_localLib} PATH)
226
227
228

  # If the library is in the required folder, we have to build it anyway, so
  # detect it here
Matthias Möller's avatar
Matthias Möller committed
229
  SET(REQUIRED FALSE)
230
231
232
233
234
235
236
  if ( _localLib MATCHES ".*libs_required.*" )
    SET(REQUIRED TRUE )
  endif()

  # Extract upper case library dir name for the human readable entries in the cmake config
  string(TOUPPER ${_local_lib_dir} _local_lib_dir_upper)
  string(REGEX REPLACE "LIBS[/\\]" "" _local_lib_dir_upper ${_local_lib_dir_upper} )
Matthias Möller's avatar
Matthias Möller committed
237

238
239
240
241
242
243
  # Only generate setting if the lib is not required (otherwise, we will always build it)
  if ( NOT DEFINED LIB_${_local_lib_dir_upper}_BUILD AND NOT REQUIRED)
      set( LIB_${_local_lib_dir_upper}_BUILD true CACHE BOOL "Enable or disable build of ${_local_lib_dir_upper} Library" )
  endif()

  # Build if this library is required or if it is enabled
Jan Möbius's avatar
Jan Möbius committed
244
  if ( LIB_${_local_lib_dir_upper}_BUILD OR REQUIRED)
245
246
    add_subdirectory (${CMAKE_SOURCE_DIR}/${_local_lib_dir})
  endif()
247
248
endforeach ()

Jan Möbius's avatar
Jan Möbius committed
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
# ========================================================================
# Core Library Components (Except the Core application)
# ========================================================================
add_subdirectory (ACG)
add_subdirectory (OpenFlipper/PluginLib)

# ========================================================================
# Tests
# ========================================================================
add_subdirectory (tests)

# ========================================================================
# Documentation generators
# ========================================================================

# Create dirs to make doxygen happy
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_DATADIR}/Doc )
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_DATADIR}/Help )

268
# Add the documentation targets
Jan Möbius's avatar
Jan Möbius committed
269
270
271
272
273
add_subdirectory (OpenFlipper/Documentation/DeveloperTarget)
add_subdirectory (OpenFlipper/Documentation/DeveloperQtHelpTarget)
add_subdirectory (OpenFlipper/Documentation/UserTarget)
add_subdirectory (OpenFlipper/Documentation/UserQtHelpTarget)

274
275
276
277
# ========================================================================
# PolyLine extension special case
# ========================================================================

Isaak Lim's avatar
Isaak Lim committed
278
279
280
find_package (MeshIntegration)

if (MESH_INTEGRATION_FOUND)
281
282
283
  add_definitions( -DEXTENDED_POLY_LINE )
endif()

284
285
286
287
288
289
290
# ========================================================================
# License Manager
# ========================================================================
if ( NOT DEFINED OPENFLIPPER_ENABLE_LICENSE_MANAGER )
  set( OPENFLIPPER_ENABLE_LICENSE_MANAGER true CACHE BOOL "Enable or disable license management in all plugins" )
endif()

291
292
293
294
if ( NOT DEFINED OPENFLIPPER_ENABLE_LICENSE_KEY_GENERATOR )
  set( OPENFLIPPER_ENABLE_LICENSE_KEY_GENERATOR true CACHE BOOL "Enable or disable building the license key generators in all plugins" )
endif()

295
296
297
298
299
300
301
302
303
304
305
306
307
# ========================================================================
# Apple Mac Store Flags
# ========================================================================
if ( APPLE AND NOT DEFINED OPENFLIPPER_BUILD_APP_STORE_COMPLIANT )
  set( OPENFLIPPER_BUILD_APP_STORE_COMPLIANT true CACHE BOOL "Enable app store compliant build (No internal update, different paths,...)" )
endif()

# ========================================================================
# Plugins
# ========================================================================

# start with an empty plugin list
acg_set (OPENFLIPPER_PLUGINS "")
308
309
acg_set (OPENFLIPPER_STATIC_PLUGINS "")
acg_set (OPENFLIPPER_STATIC_PLUGIN_FILES "")
310
acg_set (OPENFLIPPER_STATIC_PLUGIN_NAMES "")
311

312
313
314
315
316
317
foreach (package ${PREFOUND_PACKAGES})
find_package(${package})
endforeach ()

SET (LOADED_PACKAGES ${PREFOUND_PACKAGES})
LIST (APPEND LOADED_PACKAGES "Doxygen")
318
319
# add plugins
of_add_plugins ()
320
321
list (REMOVE_DUPLICATES LOADED_PACKAGES)
set (PREFOUND_PACKAGES "${LOADED_PACKAGES}" CACHE INTERNAL "List of packages that will get found at global scope so they don't get found over and over inside the individual packages.")
322

Jan Möbius's avatar
Jan Möbius committed
323
324
325
# ========================================================================
# Build core as we now know all dependencies
# ========================================================================
326

Jan Möbius's avatar
Jan Möbius committed
327
add_subdirectory (OpenFlipper/CoreApp)
328

329
330
331
332
333
334
335

# ========================================================================
# Bundle generation
# ========================================================================

if (WIN32 )

Matthias Möller's avatar
Matthias Möller committed
336
  # Plugins collected a list of required libdirs for getting
337
338
  # their DLLS on windows:
  get_property( WINDOWS_COPY_LIBDIRS GLOBAL PROPERTY WINDOWS_LIBRARY_DIR_LIST )
Matthias Möller's avatar
Matthias Möller committed
339

340
341
342
343
  if ( WINDOWS_COPY_LIBDIRS )
    list(REMOVE_DUPLICATES WINDOWS_COPY_LIBDIRS)
  endif()

344
345
346
347
  
  # workaround for VS2018 where the OpenMP vcomp90.dll seems to be missing from the path
  if ( CMAKE_GENERATOR MATCHES "^Visual Studio 9.*" )
    INCLUDE(InstallRequiredSystemLibraries)
348
    set ( OMP_PATH "${MSVC90_REDIST_DIR}/${CMAKE_MSVC_ARCH}/Microsoft.VC90.OPENMP/;${MSVC90_REDIST_DIR}/Debug_NonRedist/${CMAKE_MSVC_ARCH}/Microsoft.VC90.DebugOpenMP/" )
349
350
  endif()

351
352
353
354
355
356
357
358
  # prepare bundle generation cmake file and add a build target for it
  configure_file ("${CMAKE_SOURCE_DIR}/OpenFlipper/cmake/fixbundle.cmake.win.in"
     "${CMAKE_BINARY_DIR}/fixbundle.win.cmake" @ONLY IMMEDIATE)

  add_custom_target (fixbundle ALL
    COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/fixbundle.win.cmake" )

  # let bundle generation depend on all targets
359
  add_dependencies (fixbundle ${OPENFLIPPER_PRODUCT_STRING} OpenFlipperPluginLib ${OPENFLIPPER_PLUGINS})
Matthias Möller's avatar
Matthias Möller committed
360

361
362
endif(WIN32)

363
# ========================================================================
364
# Custom command to create a bundle and a package on mac
365
# ========================================================================
366

367
368
369
370
371
372
373
if ( APPLE )

   # Configuration option about fixbundle
   if ( APPLE AND NOT DEFINED OPENFLIPPER_CALL_FIX_BUNDLE )
     set( OPENFLIPPER_CALL_FIX_BUNDLE false CACHE BOOL "After building OpenFlipper, a bundle creation step is executed (which copies all dependencies into the bundle) to create a valid MacOs Bundle. This step is only necessary if creating a package." )
   endif()

374
375
  # prepare bundle generation cmake file and add a build target for it
  configure_file ("${CMAKE_SOURCE_DIR}/OpenFlipper/cmake/fixbundle.cmake.in"
Matthias Möller's avatar
Matthias Möller committed
376
     "${CMAKE_BINARY_DIR}/fixbundle.cmake" @ONLY IMMEDIATE)
377
378

  # Fixbundle is only necessary, when we wan't a shippable package.
Matthias Möller's avatar
Matthias Möller committed
379
  # Otherwise the original rpaths are used
380
  if ( OPENFLIPPER_CALL_FIX_BUNDLE )
Matthias Möller's avatar
Matthias Möller committed
381
382
    # Call fixbundle every time
    add_custom_target (fixbundle ALL
383
384
385
386
      COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/fixbundle.cmake"
    )
  else()
    # Call fixbundle only as a dependency
Matthias Möller's avatar
Matthias Möller committed
387
    add_custom_target (fixbundle
388
389
390
391
      COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/fixbundle.cmake"
    )
  endif()

392
  # let bundle generation depend on all targets
Jan Möbius's avatar
Jan Möbius committed
393
  add_dependencies (fixbundle ${OPENFLIPPER_PRODUCT_STRING} OpenFlipperPluginLib ${OPENFLIPPER_PLUGINS})
394
395
396
397

  # install bundle
  install (DIRECTORY ${CMAKE_BINARY_DIR}/Build/OpenFlipper.app DESTINATION .
           USE_SOURCE_PERMISSIONS)
398

399
  # Extra target for building an OpenFlipper package on mac
400
401
402
403
404
405
406
407
408
409
  # Call fixbundle first
  # afterwards we call make package as an external command, as we can't
  # add a dependency on build in targets of cake
  add_custom_target (OpenFlipper_package
    DEPENDS fixbundle
    COMMAND make package
  )

endif()

410
411
412
413
414
415
416
417
# ========================================================================
# Output log information
# ========================================================================

# display results
acg_print_configure_header (OPENFLIPPER "OpenFlipper")
of_print_plugin_stats ()
acg_print_configure_footer ()