CMakeLists.txt 10.5 KB
Newer Older
Jan Möbius's avatar
Typo  
Jan Möbius committed
1
cmake_minimum_required (VERSION 2.8.4)
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 21 22 23 24 25 26 27 28
project (OpenFlipper)

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

# include our cmake files
include (ACGCommon)

acg_get_version (OpenFlipper)

include (package)
include (ACGOutput)

Jan Möbius's avatar
Jan Möbius committed
29 30

acg_qt4 (4.7.0)
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
acg_openmp ()
acg_ftgl ()

# 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 ()
49 50 51 52
find_package (OpenMesh)
if (NOT OPENMESH_FOUND)
    message (FATAL_ERROR "OpenMesh not found!")
endif ()
53 54 55 56
find_package (OpenVolumeMesh)
if (NOT OPENVOLUMEMESH_FOUND)
    message (FATAL_ERROR "OpenVolumeMesh not found!")
endif ()
57

58

59 60 61 62 63 64 65 66 67 68
# ========================================================================
# Configure the executables path for tests
# ========================================================================
if (APPLE)
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/OpenFlipper.app/Contents/MacOS/OpenFlipper" )
elseif( WIN32 )
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/OpenFlipper.exe" )
else()
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/bin/OpenFlipper" )
endif()
69 70 71
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 )
72

73 74
enable_testing()

Jan Möbius's avatar
Jan Möbius committed
75 76 77 78 79 80 81 82 83 84 85 86 87
# ========================================================================
# 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)." )
add_definitions(-DPRODUCT_STRING=${OPENFLIPPER_PRODUCT_STRING})
add_definitions(-DPRODUCT_NAME=${OPENFLIPPER_PRODUCT_NAME})

88
# ========================================================================
Jan Möbius's avatar
Jan Möbius committed
89
# Core Library Components (Except the Core application)
90 91 92 93
# ========================================================================
add_subdirectory (ACG)
add_subdirectory (OpenFlipper/PluginLib)

94 95 96
# ========================================================================
# Tests
# ========================================================================
Jan Möbius's avatar
Jan Möbius committed
97
add_subdirectory (tests)
98

99 100 101 102 103 104 105 106 107 108
# ========================================================================
# 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 ) 

# Add the deocumentation targets
add_subdirectory (OpenFlipper/Documentation/DeveloperTarget)
Jan Möbius's avatar
Jan Möbius committed
109
add_subdirectory (OpenFlipper/Documentation/DeveloperQtHelpTarget)
110
add_subdirectory (OpenFlipper/Documentation/UserTarget)
Jan Möbius's avatar
Jan Möbius committed
111
add_subdirectory (OpenFlipper/Documentation/UserQtHelpTarget)
112 113 114 115 116 117 118


# ========================================================================
# Build all additional libraries  
# ========================================================================

# search all libs in the libs directory 
119
# (required and optional libraries
120 121 122
file (
  GLOB _local_libs_in
  RELATIVE "${CMAKE_SOURCE_DIR}"
123 124
           "${CMAKE_SOURCE_DIR}/libs/*/CMakeLists.txt"
           "${CMAKE_SOURCE_DIR}/libs_required/*/CMakeLists.txt"
125 126
)

Jan Möbius's avatar
Jan Möbius committed
127 128 129 130 131

set( REMAINING_LOCAL_LIBS "" )

# Special Comiso case:
# The library has to be configured first
132
foreach (_localLib ${_local_libs_in})
Jan Möbius's avatar
Jan Möbius committed
133 134
  if ( "${_localLib}" MATCHES .*CoMISo.* )
    get_filename_component (_local_lib_dir ${_localLib} PATH)
135 136 137 138 139 140 141
    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
142 143 144 145 146 147 148 149
  else()
    LIST(APPEND REMAINING_LOCAL_LIBS ${_localLib})
  endif()
endforeach ()


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

151
  get_filename_component (_local_lib_dir ${_localLib} PATH)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169

  # If the library is in the required folder, we have to build it anyway, so
  # detect it here
  SET(REQUIRED FALSE) 
  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} )
 
  # 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
170
  if ( LIB_${_local_lib_dir_upper}_BUILD OR REQUIRED)
171 172
    add_subdirectory (${CMAKE_SOURCE_DIR}/${_local_lib_dir})
  endif()
173 174
endforeach ()

175 176 177 178 179 180 181 182
# ========================================================================
# PolyLine extension special case
# ========================================================================

if ( EXISTS ${CMAKE_SOURCE_DIR}/libs/MeshIntegration ) 
  add_definitions( -DEXTENDED_POLY_LINE )
endif()

183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
# ========================================================================
# 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()

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

# add plugins
of_add_plugins ()

Jan Möbius's avatar
Jan Möbius committed
207 208 209
# ========================================================================
# Build core as we now know all dependencies
# ========================================================================
210

Jan Möbius's avatar
Jan Möbius committed
211
add_subdirectory (OpenFlipper/CoreApp)
212

213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

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

if (WIN32 )

  # Plugins collected a list of required libdirs for getting 
  # their DLLS on windows:
  get_property( WINDOWS_COPY_LIBDIRS GLOBAL PROPERTY WINDOWS_LIBRARY_DIR_LIST )
  
  if ( WINDOWS_COPY_LIBDIRS )
    list(REMOVE_DUPLICATES WINDOWS_COPY_LIBDIRS)
  endif()

  # 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
  add_dependencies (fixbundle OpenFlipper PluginLib ${OPENFLIPPER_PLUGINS})
 
endif(WIN32)

240
# ========================================================================
241
# Custom command to create a bundle and a package on mac
242
# ========================================================================
243

244 245 246 247 248 249 250
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()

251 252
  # prepare bundle generation cmake file and add a build target for it
  configure_file ("${CMAKE_SOURCE_DIR}/OpenFlipper/cmake/fixbundle.cmake.in"
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
     "${CMAKE_BINARY_DIR}/fixbundle.cmake" @ONLY IMMEDIATE)   

  # Fixbundle is only necessary, when we wan't a shippable package.
  # Otherwise the original rpaths are used 
  if ( OPENFLIPPER_CALL_FIX_BUNDLE )
    # Call fixbundle every time   
    add_custom_target (fixbundle ALL 
      COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/fixbundle.cmake"
    )
  else()
    # Call fixbundle only as a dependency
    add_custom_target (fixbundle 
      COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/fixbundle.cmake"
    )
  endif()

269 270 271 272 273 274
  # let bundle generation depend on all targets
  add_dependencies (fixbundle OpenFlipper PluginLib ${OPENFLIPPER_PLUGINS})

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

276
  # Extra target for building an OpenFlipper package on mac
277 278 279 280 281 282 283 284 285 286
  # 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()

287 288 289 290 291 292 293 294
# ========================================================================
# Output log information
# ========================================================================

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