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

3 4
if (NOT CMAKE_BUILD_TYPE)
  message(STATUS "No build type selected, default to Release")
5
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
6 7
endif()

Jan Möbius's avatar
Jan Möbius committed
8 9

IF ( APPLE )
10 11 12
	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
13 14 15
endif()


16 17 18 19 20
project (OpenFlipper)

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

21 22 23 24 25 26 27
# 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})

28 29 30 31 32
# include our cmake files
include (ACGCommon)

acg_get_version (OpenFlipper)

33
# ========================================================================
34
# Branding 
35 36
# ========================================================================

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67


# 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)
68 69
endif()

70 71 72 73 74 75
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
76 77 78
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)." )

79 80 81 82
if (BRANDING_HEADER)
add_definitions(-DBRANDING_HEADER)
endif ()

83 84 85 86 87 88
add_definitions(-DPRODUCT_STRING=${OPENFLIPPER_PRODUCT_STRING})
add_definitions(-DPRODUCT_NAME=${OPENFLIPPER_PRODUCT_NAME})

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

89 90 91
include (package)
include (ACGOutput)

Matthias Möller's avatar
Matthias Möller committed
92
# try to use QT5 if possible otherwise stick to QT4
Matthias Möller's avatar
Matthias Möller committed
93
set (FORCE_QT4 OFF CACHE BOOL "Use Qt4 even if Qt5 was found")
Matthias Möller's avatar
Matthias Möller committed
94 95 96 97 98 99 100 101

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
102
  message(STATUS "Could not find QT5, searching for QT4")
Matthias Möller's avatar
Matthias Möller committed
103
  acg_qt4 (4.7.0)
Matthias Möller's avatar
Matthias Möller committed
104 105 106 107 108 109
endif()

if (QT4_FOUND)
	message(STATUS "Using QT4 for OpenFlipper")
elseif(QT5_FOUND)
	message(STATUS "Using QT5 for OpenFlipper")
110
	set (OF_MAX_QT_VERSION "5.5.1")
111 112 113 114
    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
115
else()
Matthias Möller's avatar
Matthias Möller committed
116
	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
117
endif()
Jan Möbius's avatar
Jan Möbius committed
118

119 120
acg_openmp ()

121
# check for OpenGL and GLUT as our required dependencies
122 123 124 125 126 127 128 129 130
find_package (OpenGL)
if (NOT OPENGL_FOUND)
  message (FATAL_ERROR "OpengGL not found!")
endif ()

find_package (GLUT)
if (NOT GLUT_FOUND)
  message (FATAL_ERROR "GLUT not found!")
endif ()
131 132 133 134

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

135 136 137 138 139 140
# 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
141
# OpenMesh is a dependent project (in libs_required) so no finder is needed.
142 143 144 145
if (NOT USE_INTERNAL_OPENMESH)
  find_package (OpenMesh REQUIRED)
endif()

146 147
find_package (OpenVolumeMesh)
if (NOT OPENVOLUMEMESH_FOUND)
148
    message (WARNING "OpenVolumeMesh not found, proceeding without it!")
149
endif ()
150

151

152 153 154 155
# ========================================================================
# Configure the executables path for tests
# ========================================================================
if (APPLE)
156
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/OpenFlipper.app/Contents/MacOS/${OPENFLIPPER_PRODUCT_STRING}" )
157
elseif( WIN32 )
158
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/${OPENFLIPPER_PRODUCT_STRING}.exe" )
159
else()
160
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/bin/${OPENFLIPPER_PRODUCT_STRING}" )
161
endif()
162 163 164
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 )
165

166 167
enable_testing()

168
# ========================================================================
Matthias Möller's avatar
Matthias Möller committed
169
# Build all additional libraries
170 171
# ========================================================================

Matthias Möller's avatar
Matthias Möller committed
172
# search all libs in the libs directory
173
# (required and optional libraries
174 175 176
file (
  GLOB _local_libs_in
  RELATIVE "${CMAKE_SOURCE_DIR}"
177
           "${CMAKE_SOURCE_DIR}/libs_required/*/CMakeLists.txt"
Jan Möbius's avatar
Jan Möbius committed
178
           "${CMAKE_SOURCE_DIR}/libs/*/CMakeLists.txt"
179
           "${CMAKE_SOURCE_DIR}/Package-*/libs/*/CMakeLists.txt"
180 181
)

Jan Möbius's avatar
Jan Möbius committed
182 183 184 185
set( REMAINING_LOCAL_LIBS "" )

# Special Comiso case:
# The library has to be configured first
186
foreach (_localLib ${_local_libs_in})
Jan Möbius's avatar
Jan Möbius committed
187 188
  if ( "${_localLib}" MATCHES .*CoMISo.* )
    get_filename_component (_local_lib_dir ${_localLib} PATH)
189 190 191 192 193 194 195
    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
196
  else()
197 198 199
    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
200 201 202 203 204 205
  endif()
endforeach ()


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

207
  get_filename_component (_local_lib_dir ${_localLib} PATH)
208 209 210

  # 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
211
  SET(REQUIRED FALSE)
212 213 214 215 216 217 218
  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
219

220 221 222 223 224 225
  # 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
226
  if ( LIB_${_local_lib_dir_upper}_BUILD OR REQUIRED)
227 228
    add_subdirectory (${CMAKE_SOURCE_DIR}/${_local_lib_dir})
  endif()
229 230
endforeach ()

Jan Möbius's avatar
Jan Möbius committed
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
# ========================================================================
# 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 )

250
# Add the documentation targets
Jan Möbius's avatar
Jan Möbius committed
251 252 253 254 255
add_subdirectory (OpenFlipper/Documentation/DeveloperTarget)
add_subdirectory (OpenFlipper/Documentation/DeveloperQtHelpTarget)
add_subdirectory (OpenFlipper/Documentation/UserTarget)
add_subdirectory (OpenFlipper/Documentation/UserQtHelpTarget)

256 257 258 259
# ========================================================================
# PolyLine extension special case
# ========================================================================

Isaak Lim's avatar
Isaak Lim committed
260 261 262
find_package (MeshIntegration)

if (MESH_INTEGRATION_FOUND)
263 264 265
  add_definitions( -DEXTENDED_POLY_LINE )
endif()

266 267 268 269 270 271 272
# ========================================================================
# 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()

273 274 275 276
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()

277 278 279 280 281 282 283 284 285 286 287 288 289
# ========================================================================
# 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 "")
290 291
acg_set (OPENFLIPPER_STATIC_PLUGINS "")
acg_set (OPENFLIPPER_STATIC_PLUGIN_FILES "")
292
acg_set (OPENFLIPPER_STATIC_PLUGIN_NAMES "")
293

294 295 296 297 298 299
foreach (package ${PREFOUND_PACKAGES})
find_package(${package})
endforeach ()

SET (LOADED_PACKAGES ${PREFOUND_PACKAGES})
LIST (APPEND LOADED_PACKAGES "Doxygen")
300 301
# add plugins
of_add_plugins ()
302 303
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.")
304

Jan Möbius's avatar
Jan Möbius committed
305 306 307
# ========================================================================
# Build core as we now know all dependencies
# ========================================================================
308

Jan Möbius's avatar
Jan Möbius committed
309
add_subdirectory (OpenFlipper/CoreApp)
310

311 312 313 314 315 316 317

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

if (WIN32 )

Matthias Möller's avatar
Matthias Möller committed
318
  # Plugins collected a list of required libdirs for getting
319 320
  # their DLLS on windows:
  get_property( WINDOWS_COPY_LIBDIRS GLOBAL PROPERTY WINDOWS_LIBRARY_DIR_LIST )
Matthias Möller's avatar
Matthias Möller committed
321

322 323 324 325
  if ( WINDOWS_COPY_LIBDIRS )
    list(REMOVE_DUPLICATES WINDOWS_COPY_LIBDIRS)
  endif()

326 327 328 329
  
  # workaround for VS2018 where the OpenMP vcomp90.dll seems to be missing from the path
  if ( CMAKE_GENERATOR MATCHES "^Visual Studio 9.*" )
    INCLUDE(InstallRequiredSystemLibraries)
330
    set ( OMP_PATH "${MSVC90_REDIST_DIR}/${CMAKE_MSVC_ARCH}/Microsoft.VC90.OPENMP/;${MSVC90_REDIST_DIR}/Debug_NonRedist/${CMAKE_MSVC_ARCH}/Microsoft.VC90.DebugOpenMP/" )
331 332
  endif()

333 334 335 336 337 338 339 340
  # 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
341
  add_dependencies (fixbundle ${OPENFLIPPER_PRODUCT_STRING} OpenFlipperPluginLib ${OPENFLIPPER_PLUGINS})
Matthias Möller's avatar
Matthias Möller committed
342

343 344
endif(WIN32)

345
# ========================================================================
346
# Custom command to create a bundle and a package on mac
347
# ========================================================================
348

349 350 351 352 353 354 355
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()

356 357
  # 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
358
     "${CMAKE_BINARY_DIR}/fixbundle.cmake" @ONLY IMMEDIATE)
359 360

  # Fixbundle is only necessary, when we wan't a shippable package.
Matthias Möller's avatar
Matthias Möller committed
361
  # Otherwise the original rpaths are used
362
  if ( OPENFLIPPER_CALL_FIX_BUNDLE )
Matthias Möller's avatar
Matthias Möller committed
363 364
    # Call fixbundle every time
    add_custom_target (fixbundle ALL
365 366 367 368
      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
369
    add_custom_target (fixbundle
370 371 372 373
      COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/fixbundle.cmake"
    )
  endif()

374
  # let bundle generation depend on all targets
Jan Möbius's avatar
Jan Möbius committed
375
  add_dependencies (fixbundle ${OPENFLIPPER_PRODUCT_STRING} OpenFlipperPluginLib ${OPENFLIPPER_PLUGINS})
376 377 378 379

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

381
  # Extra target for building an OpenFlipper package on mac
382 383 384 385 386 387 388 389 390 391
  # 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()

392 393 394 395 396 397 398 399
# ========================================================================
# Output log information
# ========================================================================

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