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

5 6 7 8 9
# Convenience checks for problems
if(EXISTS ${CMAKE_SOURCE_DIR}/libs_required/OpenMesh)
  message(FATAL_ERROR "Directory libs_required/OpenMesh has been moved to OpenFlipper/libs_required/OpenMesh! Please remove the old directory if it's still there!")
endif()

10
# Set and enforce C++-11 flags
Jan Möbius's avatar
Jan Möbius committed
11
set( CMAKE_CXX_STANDARD_REQUIRED TRUE )
12
set( CMAKE_CXX_STANDARD 11 )
13

Jan Möbius's avatar
Jan Möbius committed
14 15
# 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
16
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
17
  # Default to this install path for QT%_INSTALL_DIR
Jan Möbius's avatar
Jan Möbius committed
18
  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
19 20
endif()

21 22 23
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
24
endif()
25

26 27
if (NOT CMAKE_BUILD_TYPE)
  message(STATUS "No build type selected, default to Release")
28
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
29 30
endif()

Jan Möbius's avatar
Jan Möbius committed
31 32

IF ( APPLE )
33 34 35
	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
36 37 38
endif()


39 40
project (OpenFlipper)

41 42 43 44 45 46 47 48
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()

49
# add our macro directory to cmake search path
50 51 52 53
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/OpenFlipper/cmake)

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

55 56 57 58 59 60 61
# 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
62 63 64 65 66 67 68
# ========================================================================
# QT Setup 
# ========================================================================

# Qt setup
include(ACGQt)

69
acg_qt5 ()
Jan Möbius's avatar
Jan Möbius committed
70 71

if (NOT QT5_FOUND)
72
  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
73 74
endif()

75 76 77 78
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
79 80 81 82 83
endif()

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

84 85
# include our cmake files
include (ACGCommon)
86
include (MSVCMacros)
87 88 89

acg_get_version (OpenFlipper)

90
# ========================================================================
91
# Branding 
92 93
# ========================================================================

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
# 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)
123 124
endif()

125 126 127 128 129 130
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
131 132 133
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)." )

134 135 136 137
if (BRANDING_HEADER)
add_definitions(-DBRANDING_HEADER)
endif ()

138 139 140 141 142 143
add_definitions(-DPRODUCT_STRING=${OPENFLIPPER_PRODUCT_STRING})
add_definitions(-DPRODUCT_NAME=${OPENFLIPPER_PRODUCT_NAME})

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

144 145 146 147 148
include (package)
include (ACGOutput)

acg_openmp ()

Jan's avatar
Jan committed
149
# check for OpenGL, GLEW and GLUT as our required dependencies
150 151 152 153 154
find_package (OpenGL)
if (NOT OPENGL_FOUND)
  message (FATAL_ERROR "OpengGL not found!")
endif ()

Jan's avatar
Jan committed
155 156 157 158 159
find_package (GLEW)
if (NOT GLEW_FOUND)
  message (FATAL_ERROR "GLEW not found!")
endif ()

160 161 162 163
find_package (GLUT)
if (NOT GLUT_FOUND)
  message (FATAL_ERROR "GLUT not found!")
endif ()
164 165 166 167

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

168 169 170 171 172 173
# 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
174 175
find_package(ACG)

Jan Möbius's avatar
Jan Möbius committed
176
# OpenMesh is a dependent project (in libs_required) so no finder is needed.
177 178 179 180
if (NOT USE_INTERNAL_OPENMESH)
  find_package (OpenMesh REQUIRED)
endif()

181 182
find_package (OpenVolumeMesh)
if (NOT OPENVOLUMEMESH_FOUND)
183
    message (WARNING "OpenVolumeMesh not found, proceeding without it!")
184
endif ()
185

186

187 188 189 190
# ========================================================================
# Configure the executables path for tests
# ========================================================================
if (APPLE)
191
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/OpenFlipper.app/Contents/MacOS/${OPENFLIPPER_PRODUCT_STRING}" )
192
elseif( WIN32 )
193
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/${OPENFLIPPER_PRODUCT_STRING}.exe" )
194
else()
195
  SET( OPENFLIPPER_EXECUTABLE "${CMAKE_BINARY_DIR}/Build/bin/${OPENFLIPPER_PRODUCT_STRING}" )
196
endif()
197 198 199
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 )
200

201 202
enable_testing()

203
# ========================================================================
Matthias Möller's avatar
Matthias Möller committed
204
# Build all additional libraries
205 206
# ========================================================================

207 208 209
add_subdirectory (OpenFlipper/libs_required/OpenMesh)
add_subdirectory (OpenFlipper/libs_required/ACG)

Matthias Möller's avatar
Matthias Möller committed
210
# search all libs in the libs directory
Jan Möbius's avatar
Jan Möbius committed
211 212
# in Packages, types, ...
# (required and optional libraries )
213 214 215
file (
  GLOB _local_libs_in
  RELATIVE "${CMAKE_SOURCE_DIR}"
216
           "${CMAKE_SOURCE_DIR}/libs_required/*/CMakeLists.txt"
Jan Möbius's avatar
Jan Möbius committed
217
           "${CMAKE_SOURCE_DIR}/libs/*/CMakeLists.txt"
Jan Möbius's avatar
Jan Möbius committed
218
           "${CMAKE_SOURCE_DIR}/Type-*/libs/*/CMakeLists.txt"
219
           "${CMAKE_SOURCE_DIR}/Package-*/libs/*/CMakeLists.txt"
220 221
)

Jan Möbius's avatar
Jan Möbius committed
222 223 224 225
set( REMAINING_LOCAL_LIBS "" )

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


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

247
  get_filename_component (_local_lib_dir ${_localLib} PATH)
248 249 250

  # 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
251
  SET(REQUIRED FALSE)
252 253 254 255 256 257 258
  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
259

260 261 262 263 264 265
  # 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
266
  if ( LIB_${_local_lib_dir_upper}_BUILD OR REQUIRED)
267 268
    add_subdirectory (${CMAKE_SOURCE_DIR}/${_local_lib_dir})
  endif()
269 270
endforeach ()

271 272 273
# Group the external libraries in a folder libs_required
GROUP_PROJECT(OpenMeshTools libs_required)
GROUP_PROJECT(OpenMeshCore libs_required)
274
GROUP_PROJECT(ACG libs_required)
275
GROUP_PROJECT(OpenVolumeMesh libs_required)
Jan Möbius's avatar
Jan Möbius committed
276 277

if( DOXYGEN_FOUND )
278
GROUP_PROJECT(doc-install Documentation)
Jan Möbius's avatar
Jan Möbius committed
279
endif()
280

Jan Möbius's avatar
Jan Möbius committed
281 282 283 284 285
# ========================================================================
# Core Library Components (Except the Core application)
# ========================================================================
add_subdirectory (OpenFlipper/PluginLib)

Jan Möbius's avatar
Jan Möbius committed
286 287 288 289 290 291 292 293 294 295 296 297 298 299
# ========================================================================
# Build DataTypes
# ========================================================================

# Search for all available data types
file (
  GLOB _data_types
  RELATIVE "${CMAKE_SOURCE_DIR}"
           "${CMAKE_SOURCE_DIR}/Type-*/ObjectTypes/*"
           "${CMAKE_SOURCE_DIR}/Package-*/Type-*/ObjectTypes/*"
)

# add all found libs to the build
foreach (DATATYPE_DIR ${_data_types})
300 301
  if (EXISTS ${CMAKE_SOURCE_DIR}/${DATATYPE_DIR}/CMakeLists.txt)
    add_subdirectory(${DATATYPE_DIR})
Jan Möbius's avatar
Jan Möbius committed
302

303 304 305 306
    # Extract Name of type from directory
    string(REGEX MATCH "[^/\\]*$" TYPENAME ${DATATYPE_DIR})
    string(TOUPPER ${TYPENAME} TYPENAME )
    list(APPEND TYPE_LIST ${TYPENAME})
Jan Möbius's avatar
Jan Möbius committed
307

308 309
    set(${TYPENAME}_INCLUDE ${CMAKE_SOURCE_DIR}/${DATATYPE_DIR}/../../ )
 endif()
Jan Möbius's avatar
Jan Möbius committed
310 311 312 313 314 315 316 317 318 319 320 321 322 323
endforeach()

# info header for Available data types
acg_color_message ("\n${_escape}[40;37m************************************************************${_escape}[0m")
acg_color_message ("${_escape}[40;37m* Available OpenFlipper Types:                             *${_escape}[0m")
acg_color_message ("${_escape}[40;37m************************************************************${_escape}[0m")
acg_color_message (" ")

foreach (DATATYPE ${TYPE_LIST})
  acg_color_message ("${DATATYPE}")
endforeach()

acg_color_message (" ")

Jan Möbius's avatar
Jan Möbius committed
324 325 326
# ========================================================================
# Tests
# ========================================================================
Jan Möbius's avatar
Jan Möbius committed
327
add_subdirectory (OpenFlipper/tests)
Jan Möbius's avatar
Jan Möbius committed
328 329 330 331 332 333 334 335 336

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

337
# Add the documentation targets
Jan Möbius's avatar
Jan Möbius committed
338 339 340 341 342
add_subdirectory (OpenFlipper/Documentation/DeveloperTarget)
add_subdirectory (OpenFlipper/Documentation/DeveloperQtHelpTarget)
add_subdirectory (OpenFlipper/Documentation/UserTarget)
add_subdirectory (OpenFlipper/Documentation/UserQtHelpTarget)

343 344 345 346
# ========================================================================
# PolyLine extension special case
# ========================================================================

Isaak Lim's avatar
Isaak Lim committed
347 348 349
find_package (MeshIntegration)

if (MESH_INTEGRATION_FOUND)
350 351 352
  add_definitions( -DEXTENDED_POLY_LINE )
endif()

353 354 355 356 357 358 359
# ========================================================================
# 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()

360 361 362 363
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()

364 365 366 367 368 369 370 371 372 373 374 375 376
# ========================================================================
# 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 "")
377 378
acg_set (OPENFLIPPER_STATIC_PLUGINS "")
acg_set (OPENFLIPPER_STATIC_PLUGIN_FILES "")
379
acg_set (OPENFLIPPER_STATIC_PLUGIN_NAMES "")
380

381 382 383 384 385 386
foreach (package ${PREFOUND_PACKAGES})
find_package(${package})
endforeach ()

SET (LOADED_PACKAGES ${PREFOUND_PACKAGES})
LIST (APPEND LOADED_PACKAGES "Doxygen")
387 388
# add plugins
of_add_plugins ()
389 390
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.")
391

Jan Möbius's avatar
Jan Möbius committed
392 393 394
# ========================================================================
# Build core as we now know all dependencies
# ========================================================================
395

Jan Möbius's avatar
Jan Möbius committed
396
add_subdirectory (OpenFlipper/CoreApp)
397

398 399 400 401 402 403 404

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

if (WIN32 )

Matthias Möller's avatar
Matthias Möller committed
405
  # Plugins collected a list of required libdirs for getting
406 407
  # their DLLS on windows:
  get_property( WINDOWS_COPY_LIBDIRS GLOBAL PROPERTY WINDOWS_LIBRARY_DIR_LIST )
Matthias Möller's avatar
Matthias Möller committed
408

409 410 411 412
  if ( WINDOWS_COPY_LIBDIRS )
    list(REMOVE_DUPLICATES WINDOWS_COPY_LIBDIRS)
  endif()

413 414 415 416
  
  # workaround for VS2018 where the OpenMP vcomp90.dll seems to be missing from the path
  if ( CMAKE_GENERATOR MATCHES "^Visual Studio 9.*" )
    INCLUDE(InstallRequiredSystemLibraries)
417
    set ( OMP_PATH "${MSVC90_REDIST_DIR}/${CMAKE_MSVC_ARCH}/Microsoft.VC90.OPENMP/;${MSVC90_REDIST_DIR}/Debug_NonRedist/${CMAKE_MSVC_ARCH}/Microsoft.VC90.DebugOpenMP/" )
418 419
  endif()

420 421 422 423 424 425 426 427
  # 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
428
  add_dependencies (fixbundle ${OPENFLIPPER_PRODUCT_STRING} OpenFlipperPluginLib ${OPENFLIPPER_PLUGINS})
Matthias Möller's avatar
Matthias Möller committed
429

430 431
endif(WIN32)

432
# ========================================================================
433
# Custom command to create a bundle and a package on mac
434
# ========================================================================
435

436 437 438 439 440 441 442
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()

443 444
  # 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
445
     "${CMAKE_BINARY_DIR}/fixbundle.cmake" @ONLY IMMEDIATE)
446 447

  # Fixbundle is only necessary, when we wan't a shippable package.
Matthias Möller's avatar
Matthias Möller committed
448
  # Otherwise the original rpaths are used
449
  if ( OPENFLIPPER_CALL_FIX_BUNDLE )
Matthias Möller's avatar
Matthias Möller committed
450 451
    # Call fixbundle every time
    add_custom_target (fixbundle ALL
452 453 454 455
      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
456
    add_custom_target (fixbundle
457 458 459 460
      COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/fixbundle.cmake"
    )
  endif()

461
  # let bundle generation depend on all targets
Jan Möbius's avatar
Jan Möbius committed
462
  add_dependencies (fixbundle ${OPENFLIPPER_PRODUCT_STRING} OpenFlipperPluginLib ${OPENFLIPPER_PLUGINS})
463 464 465 466

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

468
  # Extra target for building an OpenFlipper package on mac
469 470 471 472 473 474 475 476 477 478
  # 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()

479 480 481 482 483 484 485 486
# ========================================================================
# Output log information
# ========================================================================

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