CMakeLists.txt 17 KB
Newer Older
1 2 3 4 5
# Force minimal cmake version
# Required 3.1 to set C++11 
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)

# Set and enforce C++-11 flags
Jan Möbius's avatar
Jan Möbius committed
6
set( CMAKE_CXX_STANDARD_REQUIRED TRUE )
7
set( CMAKE_CXX_STANDARD 11 )
8

Jan Möbius's avatar
Jan Möbius committed
9 10
# ACG Environment default settings
# This is ugly but currently we need to work around the default installed 5.3 on debian
Jan Möbius's avatar
Jan Möbius committed
11
if ( EXISTS /ACG/acgdev/gcc-4.9-x86_64/qt-5.6.0/5.6/gcc_64/ )
Jan Möbius's avatar
Jan Möbius committed
12
  # Default to this install path for QT%_INSTALL_DIR
Jan Möbius's avatar
Jan Möbius committed
13
  set (QT5_INSTALL_PATH /ACG/acgdev/gcc-4.9-x86_64/qt-5.6.0/5.6/gcc_64/ CACHE PATH "Qt5 install path set for ACG environment" )
Jan Möbius's avatar
Jan Möbius committed
14 15
endif()

16 17 18
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
19
endif()
20

21 22
if (NOT CMAKE_BUILD_TYPE)
  message(STATUS "No build type selected, default to Release")
23
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
24 25
endif()

Jan Möbius's avatar
Jan Möbius committed
26 27

IF ( APPLE )
28 29 30
	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
31 32 33
endif()


34 35
project (OpenFlipper)

36 37 38 39 40 41 42 43
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
	if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6.0" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.9" OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "4.9")
		message(WARNING "Your version of GCC contains an optimizer bug. Please verify that you do not use -O3!")
		string(REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE_NEW "${CMAKE_CXX_FLAGS_RELEASE}")
		set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE_NEW}" CACHE STRING "" FORCE)
	endif()
endif()

44
# add our macro directory to cmake search path
45 46 47 48
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/OpenFlipper/cmake)

# Include some of our OpenFlipper cmake macros
include(OpenFlipper_common)
49

50 51 52 53 54 55 56
# 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})

Jan Möbius's avatar
Jan Möbius committed
57 58 59 60 61 62 63
# ========================================================================
# QT Setup 
# ========================================================================

# Qt setup
include(ACGQt)

64
acg_qt5 ()
Jan Möbius's avatar
Jan Möbius committed
65 66

if (NOT QT5_FOUND)
67
  message(FATAL_ERROR "Could not found any QT Version. Please specify QT5_INSTALL_PATH (path to bin and include dir) to build with QT5")
Jan Möbius's avatar
Jan Möbius committed
68 69
endif()

70 71 72 73
set (OF_MAX_QT_VERSION "5.6.0")

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.")
Jan Möbius's avatar
Jan Möbius committed
74 75 76 77 78
endif()

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

79 80
# include our cmake files
include (ACGCommon)
81
include (MSVCMacros)
82 83 84

acg_get_version (OpenFlipper)

85
# ========================================================================
86 87 88 89 90 91 92 93 94 95
# qtcrator workaround for missing files in project
# ========================================================================

# qtcreator (4.0.3) does not include some header files and *T.cc in its
# project structure. The issue is well-known, this is a workaround.
# Unfortunately I could not find a workaround that does not involve adding
# a dummy target that is visible in the target list.

# To force adding files to the project structure, use
# target_sources(_qtcreator_add_files PUBLIC ${EXTRA_FILES})
Jan Möbius's avatar
Jan Möbius committed
96
# in your CMakeLists.txt templates of the form (*T.cc) are added automatically
97 98 99 100 101

add_library(_qtcreator_add_files CMakeLists.txt) # dummy file that always exists
set_target_properties(_qtcreator_add_files PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)

# ========================================================================
102
# Branding 
103 104
# ========================================================================

105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
# 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)
134 135
endif()

136 137 138 139 140 141
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
142 143 144
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)." )

145 146 147 148
if (BRANDING_HEADER)
add_definitions(-DBRANDING_HEADER)
endif ()

149 150 151 152 153 154
add_definitions(-DPRODUCT_STRING=${OPENFLIPPER_PRODUCT_STRING})
add_definitions(-DPRODUCT_NAME=${OPENFLIPPER_PRODUCT_NAME})

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

155 156 157 158 159
include (package)
include (ACGOutput)

acg_openmp ()

Jan's avatar
Jan committed
160
# check for OpenGL, GLEW and GLUT as our required dependencies
161 162 163 164 165
find_package (OpenGL)
if (NOT OPENGL_FOUND)
  message (FATAL_ERROR "OpengGL not found!")
endif ()

Jan's avatar
Jan committed
166 167 168 169 170
find_package (GLEW)
if (NOT GLEW_FOUND)
  message (FATAL_ERROR "GLEW not found!")
endif ()

171 172 173 174
find_package (GLUT)
if (NOT GLUT_FOUND)
  message (FATAL_ERROR "GLUT not found!")
endif ()
175 176 177 178

# 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")

179 180 181 182 183 184
# 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
185 186
find_package(ACG)

Jan Möbius's avatar
Jan Möbius committed
187
# OpenMesh is a dependent project (in libs_required) so no finder is needed.
188 189 190 191
if (NOT USE_INTERNAL_OPENMESH)
  find_package (OpenMesh REQUIRED)
endif()

192 193
find_package (OpenVolumeMesh)
if (NOT OPENVOLUMEMESH_FOUND)
194
    message (WARNING "OpenVolumeMesh not found, proceeding without it!")
195
endif ()
196

197

198 199 200 201
# ========================================================================
# Configure the executables path for tests
# ========================================================================
if (APPLE)
202
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/OpenFlipper.app/Contents/MacOS/${OPENFLIPPER_PRODUCT_STRING}" )
203
elseif( WIN32 )
204
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/${OPENFLIPPER_PRODUCT_STRING}.exe" )
205
else()
206
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/bin/${OPENFLIPPER_PRODUCT_STRING}" )
207
endif()
208 209 210
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 )
211

212 213
enable_testing()

214
# ========================================================================
Matthias Möller's avatar
Matthias Möller committed
215
# Build all additional libraries
216 217
# ========================================================================

Matthias Möller's avatar
Matthias Möller committed
218
# search all libs in the libs directory
219
# (required and optional libraries
220 221 222
file (
  GLOB _local_libs_in
  RELATIVE "${CMAKE_SOURCE_DIR}"
223
           "${CMAKE_SOURCE_DIR}/libs_required/*/CMakeLists.txt"
Jan Möbius's avatar
Jan Möbius committed
224
           "${CMAKE_SOURCE_DIR}/libs/*/CMakeLists.txt"
225
           "${CMAKE_SOURCE_DIR}/Package-*/libs/*/CMakeLists.txt"
226 227
)

Jan Möbius's avatar
Jan Möbius committed
228 229 230 231
set( REMAINING_LOCAL_LIBS "" )

# Special Comiso case:
# The library has to be configured first
232
foreach (_localLib ${_local_libs_in})
Jan Möbius's avatar
Jan Möbius committed
233 234
  if ( "${_localLib}" MATCHES .*CoMISo.* )
    get_filename_component (_local_lib_dir ${_localLib} PATH)
235 236 237 238 239 240 241
    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
242
  else()
243 244 245
    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
246 247 248 249 250 251
  endif()
endforeach ()


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

253
  get_filename_component (_local_lib_dir ${_localLib} PATH)
254 255 256

  # 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
257
  SET(REQUIRED FALSE)
258 259 260 261 262 263 264
  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
265

266 267 268 269 270 271
  # 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
272
  if ( LIB_${_local_lib_dir_upper}_BUILD OR REQUIRED)
273 274
    add_subdirectory (${CMAKE_SOURCE_DIR}/${_local_lib_dir})
  endif()
275 276
endforeach ()

277 278 279 280
# Group the external libraries in a folder libs_required
GROUP_PROJECT(OpenMeshTools libs_required)
GROUP_PROJECT(OpenMeshCore libs_required)
GROUP_PROJECT(OpenVolumeMesh libs_required)
Jan Möbius's avatar
Jan Möbius committed
281 282

if( DOXYGEN_FOUND )
283
GROUP_PROJECT(doc-install Documentation)
Jan Möbius's avatar
Jan Möbius committed
284
endif()
285

Jan Möbius's avatar
Jan Möbius committed
286 287 288
# ========================================================================
# Core Library Components (Except the Core application)
# ========================================================================
Jan Möbius's avatar
Jan Möbius committed
289
add_subdirectory (OpenFlipper/libs_required/ACG)
Jan Möbius's avatar
Jan Möbius committed
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
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 )

305
# Add the documentation targets
Jan Möbius's avatar
Jan Möbius committed
306 307 308 309 310
add_subdirectory (OpenFlipper/Documentation/DeveloperTarget)
add_subdirectory (OpenFlipper/Documentation/DeveloperQtHelpTarget)
add_subdirectory (OpenFlipper/Documentation/UserTarget)
add_subdirectory (OpenFlipper/Documentation/UserQtHelpTarget)

311 312 313 314
# ========================================================================
# PolyLine extension special case
# ========================================================================

Isaak Lim's avatar
Isaak Lim committed
315 316 317
find_package (MeshIntegration)

if (MESH_INTEGRATION_FOUND)
318 319 320
  add_definitions( -DEXTENDED_POLY_LINE )
endif()

321 322 323 324 325 326 327
# ========================================================================
# 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()

328 329 330 331
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()

332 333 334 335 336 337 338 339 340 341 342 343 344
# ========================================================================
# 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 "")
345 346
acg_set (OPENFLIPPER_STATIC_PLUGINS "")
acg_set (OPENFLIPPER_STATIC_PLUGIN_FILES "")
347
acg_set (OPENFLIPPER_STATIC_PLUGIN_NAMES "")
348

349 350 351 352 353 354
foreach (package ${PREFOUND_PACKAGES})
find_package(${package})
endforeach ()

SET (LOADED_PACKAGES ${PREFOUND_PACKAGES})
LIST (APPEND LOADED_PACKAGES "Doxygen")
355 356
# add plugins
of_add_plugins ()
357 358
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.")
359

Jan Möbius's avatar
Jan Möbius committed
360 361 362
# ========================================================================
# Build core as we now know all dependencies
# ========================================================================
363

Jan Möbius's avatar
Jan Möbius committed
364
add_subdirectory (OpenFlipper/CoreApp)
365

366 367 368 369 370 371 372

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

if (WIN32 )

Matthias Möller's avatar
Matthias Möller committed
373
  # Plugins collected a list of required libdirs for getting
374 375
  # their DLLS on windows:
  get_property( WINDOWS_COPY_LIBDIRS GLOBAL PROPERTY WINDOWS_LIBRARY_DIR_LIST )
Matthias Möller's avatar
Matthias Möller committed
376

377 378 379 380
  if ( WINDOWS_COPY_LIBDIRS )
    list(REMOVE_DUPLICATES WINDOWS_COPY_LIBDIRS)
  endif()

381 382 383 384
  
  # workaround for VS2018 where the OpenMP vcomp90.dll seems to be missing from the path
  if ( CMAKE_GENERATOR MATCHES "^Visual Studio 9.*" )
    INCLUDE(InstallRequiredSystemLibraries)
385
    set ( OMP_PATH "${MSVC90_REDIST_DIR}/${CMAKE_MSVC_ARCH}/Microsoft.VC90.OPENMP/;${MSVC90_REDIST_DIR}/Debug_NonRedist/${CMAKE_MSVC_ARCH}/Microsoft.VC90.DebugOpenMP/" )
386 387
  endif()

388 389 390 391 392 393 394 395
  # 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
396
  add_dependencies (fixbundle ${OPENFLIPPER_PRODUCT_STRING} OpenFlipperPluginLib ${OPENFLIPPER_PLUGINS})
Matthias Möller's avatar
Matthias Möller committed
397

398 399
endif(WIN32)

400
# ========================================================================
401
# Custom command to create a bundle and a package on mac
402
# ========================================================================
403

404 405 406 407 408 409 410
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()

411 412
  # 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
413
     "${CMAKE_BINARY_DIR}/fixbundle.cmake" @ONLY IMMEDIATE)
414 415

  # Fixbundle is only necessary, when we wan't a shippable package.
Matthias Möller's avatar
Matthias Möller committed
416
  # Otherwise the original rpaths are used
417
  if ( OPENFLIPPER_CALL_FIX_BUNDLE )
Matthias Möller's avatar
Matthias Möller committed
418 419
    # Call fixbundle every time
    add_custom_target (fixbundle ALL
420 421 422 423
      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
424
    add_custom_target (fixbundle
425 426 427 428
      COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/fixbundle.cmake"
    )
  endif()

429
  # let bundle generation depend on all targets
Jan Möbius's avatar
Jan Möbius committed
430
  add_dependencies (fixbundle ${OPENFLIPPER_PRODUCT_STRING} OpenFlipperPluginLib ${OPENFLIPPER_PLUGINS})
431 432 433 434

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

436
  # Extra target for building an OpenFlipper package on mac
437 438 439 440 441 442 443 444 445 446
  # 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()

447 448 449 450 451 452 453 454
# ========================================================================
# Output log information
# ========================================================================

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