CMakeLists.txt 13.5 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 35 36 37 38 39 40 41 42
# ========================================================================
# Branding Flags
# ========================================================================

if ( EXISTS ${CMAKE_SOURCE_DIR}/branding/branding.cmake )
	include(${CMAKE_SOURCE_DIR}/branding/branding.cmake)
endif()

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)." )
43
set( BRANDING_HEADER false CACHE String "Indicate there is a branding.h inside the branding folder.")
44 45 46
add_definitions(-DPRODUCT_STRING=${OPENFLIPPER_PRODUCT_STRING})
add_definitions(-DPRODUCT_NAME=${OPENFLIPPER_PRODUCT_NAME})

47 48 49 50
if (BRANDING_HEADER)
add_definitions(-DBRANDING_HEADER)
endif ()

51 52 53
include (package)
include (ACGOutput)

Matthias Möller's avatar
Matthias Möller committed
54
# try to use QT5 if possible otherwise stick to QT4
Matthias Möller's avatar
Matthias Möller committed
55
set (FORCE_QT4 OFF CACHE BOOL "Use Qt4 even if Qt5 was found")
Matthias Möller's avatar
Matthias Möller committed
56 57 58 59 60 61 62 63

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
64
  message(STATUS "Could not find QT5, searching for QT4")
Matthias Möller's avatar
Matthias Möller committed
65
  acg_qt4 (4.7.0)
Matthias Möller's avatar
Matthias Möller committed
66 67 68 69 70 71
endif()

if (QT4_FOUND)
	message(STATUS "Using QT4 for OpenFlipper")
elseif(QT5_FOUND)
	message(STATUS "Using QT5 for OpenFlipper")
72
	set (OF_MAX_QT_VERSION "5.5.1")
73 74 75 76
    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
77
else()
Matthias Möller's avatar
Matthias Möller committed
78
	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
79
endif()
Jan Möbius's avatar
Jan Möbius committed
80

81
acg_openmp ()
82
#acg_ftgl ()
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98

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

find_package (GLEW)
if (NOT GLEW_FOUND)
  message (FATAL_ERROR "GLEW not found!")
endif ()

find_package (GLUT)
if (NOT GLUT_FOUND)
  message (FATAL_ERROR "GLUT not found!")
endif ()
99 100 101 102

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

103 104 105 106 107 108
# 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
109
# OpenMesh is a dependent project (in libs_required) so no finder is needed.
110 111 112 113
if (NOT USE_INTERNAL_OPENMESH)
  find_package (OpenMesh REQUIRED)
endif()

114 115
find_package (OpenVolumeMesh)
if (NOT OPENVOLUMEMESH_FOUND)
116
    message (WARNING "OpenVolumeMesh not found, proceeding without it!")
117
endif ()
118

119

120 121 122 123
# ========================================================================
# Configure the executables path for tests
# ========================================================================
if (APPLE)
124
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/OpenFlipper.app/Contents/MacOS/${OPENFLIPPER_PRODUCT_STRING}" )
125
elseif( WIN32 )
126
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/${OPENFLIPPER_PRODUCT_STRING}.exe" )
127
else()
128
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/bin/${OPENFLIPPER_PRODUCT_STRING}" )
129
endif()
130 131 132
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 )
133

134 135
enable_testing()

136
# ========================================================================
Matthias Möller's avatar
Matthias Möller committed
137
# Build all additional libraries
138 139
# ========================================================================

Matthias Möller's avatar
Matthias Möller committed
140
# search all libs in the libs directory
141
# (required and optional libraries
142 143 144
file (
  GLOB _local_libs_in
  RELATIVE "${CMAKE_SOURCE_DIR}"
145
           "${CMAKE_SOURCE_DIR}/libs_required/*/CMakeLists.txt"
Jan Möbius's avatar
Jan Möbius committed
146
           "${CMAKE_SOURCE_DIR}/libs/*/CMakeLists.txt"
147
           "${CMAKE_SOURCE_DIR}/Package-*/libs/*/CMakeLists.txt"
148 149
)

Jan Möbius's avatar
Jan Möbius committed
150 151 152 153
set( REMAINING_LOCAL_LIBS "" )

# Special Comiso case:
# The library has to be configured first
154
foreach (_localLib ${_local_libs_in})
Jan Möbius's avatar
Jan Möbius committed
155 156
  if ( "${_localLib}" MATCHES .*CoMISo.* )
    get_filename_component (_local_lib_dir ${_localLib} PATH)
157 158 159 160 161 162 163
    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
164
  else()
165 166 167
    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
168 169 170 171 172 173
  endif()
endforeach ()


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

175
  get_filename_component (_local_lib_dir ${_localLib} PATH)
176 177 178

  # 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
179
  SET(REQUIRED FALSE)
180 181 182 183 184 185 186
  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
187

188 189 190 191 192 193
  # 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
194
  if ( LIB_${_local_lib_dir_upper}_BUILD OR REQUIRED)
195 196
    add_subdirectory (${CMAKE_SOURCE_DIR}/${_local_lib_dir})
  endif()
197 198
endforeach ()

Jan Möbius's avatar
Jan Möbius committed
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
# ========================================================================
# 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 )

218
# Add the documentation targets
Jan Möbius's avatar
Jan Möbius committed
219 220 221 222 223
add_subdirectory (OpenFlipper/Documentation/DeveloperTarget)
add_subdirectory (OpenFlipper/Documentation/DeveloperQtHelpTarget)
add_subdirectory (OpenFlipper/Documentation/UserTarget)
add_subdirectory (OpenFlipper/Documentation/UserQtHelpTarget)

224 225 226 227
# ========================================================================
# PolyLine extension special case
# ========================================================================

Isaak Lim's avatar
Isaak Lim committed
228 229 230
find_package (MeshIntegration)

if (MESH_INTEGRATION_FOUND)
231 232 233
  add_definitions( -DEXTENDED_POLY_LINE )
endif()

234 235 236 237 238 239 240
# ========================================================================
# 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()

241 242 243 244
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()

245 246 247 248 249 250 251 252 253 254 255 256 257
# ========================================================================
# 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 "")
258 259
acg_set (OPENFLIPPER_STATIC_PLUGINS "")
acg_set (OPENFLIPPER_STATIC_PLUGIN_FILES "")
260

261 262 263 264 265 266
foreach (package ${PREFOUND_PACKAGES})
find_package(${package})
endforeach ()

SET (LOADED_PACKAGES ${PREFOUND_PACKAGES})
LIST (APPEND LOADED_PACKAGES "Doxygen")
267 268
# add plugins
of_add_plugins ()
269 270
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.")
271

Jan Möbius's avatar
Jan Möbius committed
272 273 274
# ========================================================================
# Build core as we now know all dependencies
# ========================================================================
275

Jan Möbius's avatar
Jan Möbius committed
276
add_subdirectory (OpenFlipper/CoreApp)
277

278 279 280 281 282 283 284

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

if (WIN32 )

Matthias Möller's avatar
Matthias Möller committed
285
  # Plugins collected a list of required libdirs for getting
286 287
  # their DLLS on windows:
  get_property( WINDOWS_COPY_LIBDIRS GLOBAL PROPERTY WINDOWS_LIBRARY_DIR_LIST )
Matthias Möller's avatar
Matthias Möller committed
288

289 290 291 292
  if ( WINDOWS_COPY_LIBDIRS )
    list(REMOVE_DUPLICATES WINDOWS_COPY_LIBDIRS)
  endif()

293 294 295 296
  
  # workaround for VS2018 where the OpenMP vcomp90.dll seems to be missing from the path
  if ( CMAKE_GENERATOR MATCHES "^Visual Studio 9.*" )
    INCLUDE(InstallRequiredSystemLibraries)
297
    set ( OMP_PATH "${MSVC90_REDIST_DIR}/${CMAKE_MSVC_ARCH}/Microsoft.VC90.OPENMP/;${MSVC90_REDIST_DIR}/Debug_NonRedist/${CMAKE_MSVC_ARCH}/Microsoft.VC90.DebugOpenMP/" )
298 299
  endif()

300 301 302 303 304 305 306 307
  # 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
308
  add_dependencies (fixbundle ${OPENFLIPPER_PRODUCT_STRING} OpenFlipperPluginLib ${OPENFLIPPER_PLUGINS})
Matthias Möller's avatar
Matthias Möller committed
309

310 311
endif(WIN32)

312
# ========================================================================
313
# Custom command to create a bundle and a package on mac
314
# ========================================================================
315

316 317 318 319 320 321 322
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()

323 324
  # 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
325
     "${CMAKE_BINARY_DIR}/fixbundle.cmake" @ONLY IMMEDIATE)
326 327

  # Fixbundle is only necessary, when we wan't a shippable package.
Matthias Möller's avatar
Matthias Möller committed
328
  # Otherwise the original rpaths are used
329
  if ( OPENFLIPPER_CALL_FIX_BUNDLE )
Matthias Möller's avatar
Matthias Möller committed
330 331
    # Call fixbundle every time
    add_custom_target (fixbundle ALL
332 333 334 335
      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
336
    add_custom_target (fixbundle
337 338 339 340
      COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/fixbundle.cmake"
    )
  endif()

341
  # let bundle generation depend on all targets
Jan Möbius's avatar
Jan Möbius committed
342
  add_dependencies (fixbundle ${OPENFLIPPER_PRODUCT_STRING} OpenFlipperPluginLib ${OPENFLIPPER_PLUGINS})
343 344 345 346

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

348
  # Extra target for building an OpenFlipper package on mac
349 350 351 352 353 354 355 356 357 358
  # 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()

359 360 361 362 363 364 365 366
# ========================================================================
# Output log information
# ========================================================================

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