source: subsurface/CMakeLists.txt

Last change on this file was d67421c, checked in by Dirk Hohndel <dirk@…>, 4 days ago

Enable BLE on Android

Signed-off-by: Dirk Hohndel <dirk@…>

  • Property mode set to 100644
File size: 21.2 KB
Line 
1# cmake based build of Subsurface
2
3# Uncomment his to see all commands cmake actually executes
4# set(CMAKE_VERBOSE_MAKEFILE ON)
5
6project(Subsurface)
7cmake_minimum_required(VERSION 2.8.11)
8
9# global settings
10
11set(CMAKE_AUTOMOC ON)
12include(cmake/Modules/MacroOutOfSourceBuild.cmake)
13MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
14    "We don't support building in source, please create a build folder elsewhere and remember to run git clean -xdf to remoev temporary files created by CMake."
15)
16
17#Options regarding usage of pkgconfig
18option(LIBGIT2_FROM_PKGCONFIG "use pkg-config to retrieve libgit2" OFF)
19option(LIBDC_FROM_PKGCONFIG "use pkg-config to retrieve libdivecomputer" OFF)
20option(LIBGRANTLEE_FROM_PKGCONFIG "use pkg-config to retrieve grantlee" OFF)
21option(LIBMARBLE_FROM_PKGCONFIG "use pkg-config to retrieve marble" OFF)
22
23#Library Handling
24option(FORCE_LIBSSH "force linking with libssh to workaround libgit2 bug" ON)
25option(LIBGIT2_DYNAMIC "search for libgit2.so before libgit2.a" OFF)
26
27#Options regarding disabling parts of subsurface.
28option(NO_MARBLE "disable the marble widget" OFF)
29option(NO_DOCS "disable the docs" OFF)
30option(NO_PRINTING "disable the printing support" OFF)
31option(NO_USERMANUAL "don't include a viewer for the user manual" OFF)
32
33#Options regarding enabling parts of subsurface
34option(FBSUPPORT "allow posting to Facebook" ON)
35option(BTSUPPORT "enable support for QtBluetooth (requires Qt5.4 or newer)" ON)
36option(FTDISUPPORT "enable support for libftdi based serial" OFF)
37option(USE_WEBENGINE "Use QWebEngine instead of QWebKit" OFF)
38
39# Options regarding What should we build on subsurface
40option(MAKE_TESTS "Make the tests" ON)
41
42SET(SUBSURFACE_TARGET_EXECUTABLE "DesktopExecutable" CACHE STRING "The type of application, DesktopExecutable or MobileExecutable")
43LIST(APPEND SUBSURFACE_ACCEPTED_EXECUTABLES  "DesktopExecutable" "MobileExecutable")
44SET_PROPERTY(CACHE SUBSURFACE_TARGET_EXECUTABLE PROPERTY STRINGS ${SUBSURFACE_ACCEPTED_EXECUTABLES})
45
46#verify if Platform is correct and warn on wxit with example.
47list (FIND SUBSURFACE_ACCEPTED_EXECUTABLES ${SUBSURFACE_TARGET_EXECUTABLE}  _index)
48if (${_index} EQUAL -1)
49  message(FATAL_ERROR "Requested platform not supported, please use one of the following:
50    ${SUBSURFACE_ACCEPTED_EXECUTABLES}
51
52    inputted value was: ${SUBSURFACE_TARGET_EXECUTABLE}
53
54    Example: -DSUBSURFACE_TARGET_EXECUTABLE=DesktopExecutable")
55endif()
56
57# SUBSURFACE_SOURCE may be used in subdirectories (tests)
58set(SUBSURFACE_SOURCE ${CMAKE_SOURCE_DIR})
59add_definitions(-DSUBSURFACE_SOURCE="${SUBSURFACE_SOURCE}")
60
61#evenrything's correct, moving on.
62set(CMAKE_MODULE_PATH
63        ${CMAKE_MODULE_PATH}
64        ${${PROJECT_NAME}_SOURCE_DIR}/cmake/Modules
65)
66
67#
68# TODO: This Compilation part should go on the Target specific CMake.
69#
70if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
71        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 ")
72        if((${CMAKE_SYSTEM_NAME} MATCHES "Darwin") AND
73           ((${CMAKE_SYSTEM_VERSION} MATCHES "11.4.") OR
74            (${CMAKE_OSX_DEPLOYMENT_TARGET} MATCHES "10.7") OR
75            (${CMAKE_OSX_DEPLOYMENT_TARGET} MATCHES "10.8")))
76                set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
77        else()
78                set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
79        endif()
80elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
81        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 ")
82        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
83elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
84        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
85        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
86
87        # Warn about possible float conversion errors
88        # Use NOT VERSION_LESS since VERSION_GREATER_EQUAL is not available
89        # in currently used cmake version.
90        if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9.0")
91                set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wfloat-conversion")
92                set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wfloat-conversion")
93        endif()
94
95elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
96  # using Intel C++
97elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
98  # using Visual Studio C++
99endif()
100
101# pkgconfig for required libraries
102find_package(PkgConfig)
103include(cmake/Modules/pkgconfig_helper.cmake)
104
105# The 'HandleFindXXX' are special libraries that subsurface needs
106# to find and configure in a few different ways because of a few
107# developers that prefer pkg-config over CMake, so we try to make
108# everyone happy. It also sets some variables for each library, so
109# if you think a module miss anything, take a look on the specific
110# module file.
111include(cmake/Modules/HandleFindGit2.cmake)
112include(cmake/Modules/HandleFindLibDiveComputer.cmake)
113if(${SUBSURFACE_TARGET_EXECUTABLE} MATCHES "DesktopExecutable")
114        include(cmake/Modules/HandleFindMarble.cmake)
115        include(cmake/Modules/HandleFindGrantlee.cmake)
116        include(cmake/Modules/HandleUserManual.cmake)
117endif()
118include(cmake/Modules/HandleFtdiSupport.cmake)
119include(cmake/Modules/HandleVersionGeneration.cmake)
120include(cmake/Modules/RunOnBuildDir.cmake)
121include(cmake/Modules/cmake_variables_helper.cmake)
122
123pkg_config_library(LIBXML libxml-2.0 REQUIRED)
124pkg_config_library(LIBSQLITE3 sqlite3 REQUIRED)
125pkg_config_library(LIBXSLT libxslt REQUIRED)
126pkg_config_library(LIBZIP libzip REQUIRED)
127pkg_config_library(LIBUSB libusb-1.0 QUIET)
128
129include_directories(.
130        ${CMAKE_CURRENT_BINARY_DIR}
131        ${CMAKE_BINARY_DIR}
132        ${CMAKE_BINARY_DIR}/desktop-widgets
133)
134
135# Project Target specific configuration should go here,
136# if the configuration is too big or would disrupt the normal code flux,
137# move it somewhere else (another file) and include it.
138if(${SUBSURFACE_TARGET_EXECUTABLE} MATCHES "DesktopExecutable")
139        if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
140                set(SUBSURFACE_TARGET Subsurface)
141        else()
142                set(SUBSURFACE_TARGET subsurface)
143        endif()
144        remove_definitions(-DSUBSURFACE_MOBILE)
145elseif(${SUBSURFACE_TARGET_EXECUTABLE} MATCHES "MobileExecutable")
146        if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
147                set(SUBSURFACE_TARGET Subsurface-mobile)
148        else()
149                set(SUBSURFACE_TARGET subsurface-mobile)
150        endif()
151        list(APPEND QT_EXTRA_COMPONENTS Quick)
152        list(APPEND QT_EXTRA_COMPONENTS QuickControls2)
153        list(APPEND QT_EXTRA_LIBRARIES Qt5::Quick)
154        list(APPEND QT_EXTRA_LIBRARIES Qt5::QuickControls2)
155        add_definitions(-DSUBSURFACE_MOBILE)
156endif()
157
158if(ANDROID)
159        set(NO_PRINTING ON)
160        list(APPEND QT_EXTRA_COMPONENTS AndroidExtras)
161        list(APPEND QT_EXTRA_LIBRARIES Qt5::AndroidExtras)
162        set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -llog)
163elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
164        # add pthread to the end of the library list on Linux
165        # this is only needed on Ubuntu
166        # but shouldn't hurt on other Linux versions
167        # in some builds we appear to be missing libz for some strange reason...
168        # Add ssh2 at the end for openSUSE builds (for recent cmake?)
169        set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lssh2 -lz -lpthread)
170elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
171        execute_process(
172                COMMAND sh scripts/get-version linux
173                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
174                OUTPUT_VARIABLE SSRF_VERSION_STRING
175                OUTPUT_STRIP_TRAILING_WHITESPACE
176        )
177        find_library(APP_SERVICES_LIBRARY ApplicationServices)
178        find_library(HID_LIB HidApi)
179        set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} ${HID_LIB})
180        set(EXTRA_LIBS ${APP_SERVICES_LIBRARY})
181        set(ICON_FILE ${CMAKE_SOURCE_DIR}/packaging/macosx/Subsurface.icns)
182        if(${SUBSURFACE_TARGET_EXECUTABLE} MATCHES "MobileExecutable")
183                set(MACOSX_BUNDLE_INFO_STRING "Subsurface-mobile")
184                set(MACOSX_BUNDLE_BUNDLE_NAME "Subsurface-mobile")
185        else()
186                set(MACOSX_BUNDLE_INFO_STRING "Subsurface")
187                set(MACOSX_BUNDLE_BUNDLE_NAME "Subsurface")
188        endif()
189        set(MACOSX_BUNDLE_ICON_FILE Subsurface.icns)
190        set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.subsurface-divelog")
191        set(MACOSX_BUNDLE_BUNDLE_VERSION "${SSRF_VERSION_STRING}")
192        set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${SSRF_VERSION_STRING}")
193        set(MACOSX_BUNDLE_LONG_VERSION_STRING "${SSRF_VERSION_STRING}")
194        set(MACOSX_BUNDLE_COPYRIGHT "Linus Torvalds, Dirk Hohndel, Tomaz Canabrava, and others")
195        set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
196        set(SUBSURFACE_PKG MACOSX_BUNDLE ${ICON_FILE})
197elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
198        set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lwsock32 -lws2_32)
199        remove_definitions(-DUNICODE)
200        add_definitions(-mwindows -D_WIN32)
201endif()
202
203if(BTSUPPORT)
204        list(APPEND QT_EXTRA_COMPONENTS Bluetooth)
205        list(APPEND QT_EXTRA_LIBRARIES Qt5::Bluetooth)
206endif()
207
208find_package(Qt5 REQUIRED COMPONENTS Core Concurrent Widgets Network Svg Test LinguistTools Positioning ${QT_EXTRA_COMPONENTS})
209set(QT_LIBRARIES Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network Qt5::Svg  Qt5::Positioning ${QT_EXTRA_LIBRARIES})
210set(QT_TEST_LIBRARIES ${QT_LIBRARIES} Qt5::Test)
211
212#disable bluetooth if Qt version is ancient.
213if (BTSUPPORT AND "${Qt5Core_VERSION}" VERSION_LESS 5.4.0)
214        set(BTSUPPORT OFF)
215        message(STATUS "Turning off Bluetooth support as Qt version ${Qt5Core_VERSION} is insufficient for that")
216        list(REMOVE_ITEM QT_LIBRARIES Qt5::Bluetooth)
217endif()
218
219#I can't test MacOS, and Windows Qt doesn't support BLE at all afaik
220if (BTSUPPORT AND (ANDROID OR CMAKE_SYSTEM_NAME STREQUAL "Linux"))
221        set(BLESUPPORT ON)
222endif()
223
224if(BTSUPPORT)
225        add_definitions(-DBT_SUPPORT)
226endif()
227
228if(BLESUPPORT)
229        add_definitions(-DBLE_SUPPORT)
230endif()
231
232#set up the subsurface_link_libraries variable
233set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} ${LIBDIVECOMPUTER_LIBRARIES} ${LIBGIT2_LIBRARIES} ${LIBUSB_LIBRARIES})
234qt5_add_resources(SUBSURFACE_RESOURCES subsurface.qrc)
235
236# include translations
237add_subdirectory(translations)
238add_subdirectory(core)
239add_subdirectory(qt-models)
240add_subdirectory(profile-widget)
241
242if (${SUBSURFACE_TARGET_EXECUTABLE} MATCHES "DesktopExecutable")
243        add_subdirectory(desktop-widgets)
244endif()
245
246# create the executables
247if(${SUBSURFACE_TARGET_EXECUTABLE} MATCHES "MobileExecutable")
248        set(MOBILE_SRC
249                mobile-widgets/qmlmanager.cpp
250                mobile-widgets/qmlprofile.cpp
251                mobile-widgets/qml/kirigami/src/kirigamiplugin.cpp
252                mobile-widgets/qml/kirigami/src/settings.cpp
253                mobile-widgets/qml/kirigami/src/enums.cpp
254                subsurface-mobile-main.cpp
255                subsurface-mobile-helper.cpp
256        )
257        if(NOT ANDROID AND NOT iOS)
258                set(MOBILE_SRC ${MOBILE_SRC} mobile-widgets/qml/kirigami/src/desktopicon.cpp)
259        endif()
260        add_definitions(-DKIRIGAMI_BUILD_TYPE_STATIC)
261        qt5_add_resources(MOBILE_RESOURCES mobile-widgets/qml/mobile-resources.qrc)
262        qt5_add_resources(MOBILE_RESOURCES mobile-widgets/qml/kirigami/kirigami.qrc)
263        # When building the mobile application in Android, link it and Qt will do the rest, when doing the mobile application on Desktop, create an executable.
264        if(ANDROID)
265                add_library(${SUBSURFACE_TARGET} SHARED ${SUBSURFACE_PKG} ${MOBILE_SRC} ${SUBSURFACE_RESOURCES} ${MOBILE_RESOURCES})
266        else()
267                add_executable(${SUBSURFACE_TARGET} MACOSX_BUNDLE WIN32 ${SUBSURFACE_PKG} ${MOBILE_SRC} ${SUBSURFACE_RESOURCES} ${MOBILE_RESOURCES})
268        endif()
269        target_link_libraries(
270                ${SUBSURFACE_TARGET}
271                subsurface_profile
272                subsurface_models
273                subsurface_corelib
274                ${SUBSURFACE_LINK_LIBRARIES}
275        )
276elseif(${SUBSURFACE_TARGET_EXECUTABLE} MATCHES "DesktopExecutable")
277        set(SUBSURFACE_APP
278                subsurface-desktop-main.cpp
279                subsurface-desktop-helper.cpp
280        )
281        source_group("Subsurface App" FILES ${SUBSURFACE_APP})
282        if(ANDROID)
283                add_library(${SUBSURFACE_TARGET} SHARED ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES})
284        else()
285                add_executable(${SUBSURFACE_TARGET} MACOSX_BUNDLE WIN32 ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES})
286        endif()
287
288        if(FBSUPPORT)
289                set(FACEBOOK_INTEGRATION facebook_integration)
290        endif()
291        target_link_libraries(
292                ${SUBSURFACE_TARGET}
293                subsurface_generated_ui
294                subsurface_interface
295                ${FACEBOOK_INTEGRATION}
296                subsurface_profile
297                subsurface_statistics
298                subsurface_models
299                subsurface_corelib
300                ${SUBSURFACE_LINK_LIBRARIES}
301        )
302        add_dependencies(subsurface_statistics subsurface_generated_ui)
303        add_dependencies(subsurface_interface subsurface_generated_ui)
304        add_dependencies(subsurface_profile subsurface_generated_ui)
305        add_dependencies(subsurface_models subsurface_generated_ui)
306        add_dependencies(subsurface_generated_ui version)
307endif()
308
309add_dependencies(subsurface_corelib version)
310
311# add platform specific actions
312if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
313        add_custom_command(
314                OUTPUT ${CMAKE_BINARY_DIR}/qt.conf
315                COMMAND echo \"[Paths]\" > ${CMAKE_BINARY_DIR}/qt.conf \; echo \"Prefix=.\" >> ${CMAKE_BINARY_DIR}/qt.conf
316        )
317        add_custom_target(
318                generate_qtconf
319                DEPENDS ${CMAKE_BINARY_DIR}/qt.conf
320        )
321        add_dependencies(${SUBSURFACE_TARGET} generate_qtconf)
322endif()
323
324# build an automated html exporter
325add_executable(export-html EXCLUDE_FROM_ALL export-html.cpp ${SUBSURFACE_RESOURCES})
326target_link_libraries(export-html subsurface_corelib ${SUBSURFACE_LINK_LIBRARIES})
327
328# install Subsurface
329# first some variables with files that need installing
330set(DOCFILES
331        README
332        ReleaseNotes/ReleaseNotes.txt
333        SupportedDivecomputers.txt
334        ${CMAKE_BINARY_DIR}/Documentation/user-manual.html
335        ${CMAKE_BINARY_DIR}/Documentation/user-manual_es.html
336        ${CMAKE_BINARY_DIR}/Documentation/user-manual_fr.html
337        ${CMAKE_BINARY_DIR}/Documentation/user-manual_ru.html
338)
339
340# add all the translations that we may need
341FILE(STRINGS "subsurface_enabled_translations" QTTRANSLATIONS_BASE)
342
343if(NOT DEFINED QT_TRANSLATION_DIR OR QT_TRANSLATION_DIR STREQUAL "")
344        set(QT_TRANSLATION_DIR ${Qt5Core_DIR}/../../../translations)
345endif()
346set(QTTRANSLATIONS "")
347foreach(QTTRANSLATION ${QTTRANSLATIONS_BASE})
348        if(NOT ${QTTRANSLATION} STREQUAL "")
349                if(EXISTS ${QT_TRANSLATION_DIR}/${QTTRANSLATION})
350                        set(QTTRANSLATIONS ${QTTRANSLATIONS} ${QT_TRANSLATION_DIR}/${QTTRANSLATION})
351                endif()
352        endif()
353endforeach()
354
355# now for each platform the install instructions
356if(ANDROID)
357        # Android template directory
358        include(${QT_ANDROID_CMAKE})
359        if((DEFINED ENV{KEYSTORE}) AND (DEFINED ENV{KEYSTORE_PASSWORD}))
360                add_qt_android_apk(${SUBSURFACE_TARGET}.apk ${SUBSURFACE_TARGET}
361                        PACKAGE_SOURCES ${CMAKE_BINARY_DIR}/android-mobile DEPENDS ${ANDROID_NATIVE_LIBSSL} ${ANDROID_NATIVE_LIBCRYPT}
362                        BUILDTOOLS_REVISION ${BUILDTOOLS_REVISION}
363                        KEYSTORE $ENV{KEYSTORE} Subsurface-mobile KEYSTORE_PASSWORD $ENV{KEYSTORE_PASSWORD}
364                )
365                message(STATUS "KEYSTORE=$ENV{KEYSTORE} KEYSTORE_PASSWORD=$ENV{KEYSTORE_PASSWORD}")
366        else()
367                add_qt_android_apk(${SUBSURFACE_TARGET}.apk ${SUBSURFACE_TARGET}
368                        PACKAGE_SOURCES ${CMAKE_BINARY_DIR}/android-mobile DEPENDS ${ANDROID_NATIVE_LIBSSL} ${ANDROID_NATIVE_LIBCRYPT}
369                        BUILDTOOLS_REVISION ${BUILDTOOLS_REVISION}
370                )
371                message(STATUS "no KEYSTORE")
372        endif()
373elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
374        set(APP_BUNDLE_DIR "${SUBSURFACE_TARGET}.app")
375        if(${SUBSURFACE_TARGET_EXECUTABLE} MATCHES "MobileExecutable")
376                set(EXTRA_MACDEPLOY_ARGS "-qmldir=${APP_BUNDLE_DIR}/Contents/Frameworks/qml ")
377        endif()
378        set(MACDEPLOY_ARGS "${EXTRA_MACDEPLOY_ARGS}-executable=${APP_BUNDLE_DIR}/Contents/MacOS/${SUBSURFACE_TARGET} -always-overwrite")
379        set(RESOURCEDIR ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Resources)
380        set(PLUGINDIR ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/PlugIns)
381        install(DIRECTORY marbledata/maps DESTINATION ${RESOURCEDIR}/data)
382        install(DIRECTORY marbledata/bitmaps DESTINATION ${RESOURCEDIR}/data)
383        install(DIRECTORY Documentation/images DESTINATION ${RESOURCEDIR}/share/Documentation)
384        install(FILES ${DOCFILES} DESTINATION ${RESOURCEDIR}/share/Documentation)
385        install(DIRECTORY theme DESTINATION ${RESOURCEDIR})
386        install(DIRECTORY printing_templates DESTINATION ${RESOURCEDIR})
387        install(FILES ${TRANSLATIONS} DESTINATION ${RESOURCEDIR}/translations)
388        install(FILES ${QTTRANSLATIONS} DESTINATION ${RESOURCEDIR}/translations)
389        install(FILES ${CMAKE_SOURCE_DIR}/gpl-2.0.txt DESTINATION ${RESOURCEDIR})
390        # this is a HACK
391        if(${SUBSURFACE_TARGET_EXECUTABLE} MATCHES "DesktopExecutable")
392                install(DIRECTORY ${Grantlee5_DIR}/../../grantlee DESTINATION ${PLUGINDIR})
393        endif()
394        # this is a hack - but I don't know how else to find the macdeployqt program if it's not in the PATH
395        string(REPLACE moc macdeployqt MACDEPLOYQT ${QT_MOC_EXECUTABLE})
396        install(CODE "execute_process(COMMAND ${MACDEPLOYQT} ${APP_BUNDLE_DIR} ${MACDEPLOY_ARGS})")
397        # and another hack to get the QML Components in the right place
398        if(${SUBSURFACE_TARGET_EXECUTABLE} MATCHES "MobileExecutable")
399                install(CODE "execute_process(COMMAND mkdir -p ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/qml)")
400                install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/qml/QtQuick ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/qml)")
401        endif()
402        if(NOT NO_MARBLE)
403                # more hackery - this time for QtXml which is needed by libssrfmarblewidget
404                install(CODE "execute_process(COMMAND cp -a ${_qt5Core_install_prefix}/lib/QtXml.framework ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks)")
405                install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/QtXml.framework/Versions/5/Headers)")
406                install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/QtXml.framework/Headers)")
407                install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/QtXml.framework/QtXml.prl)")
408                install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/QtXml.framework/Versions/5/QtXml_debug)")
409                install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/QtXml.framework/QtXml_debug)")
410                install(CODE "execute_process(COMMAND rm -rf ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/QtXml.framework/QtXml_debug.prl)")
411                install(CODE "execute_process(COMMAND install_name_tool -id @executable_path/../Frameworks/QtXml ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/QtXml.framework/QtXml)")
412                install(CODE "execute_process(COMMAND install_name_tool -change @rpath/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/QtCore ${CMAKE_BINARY_DIR}/${APP_BUNDLE_DIR}/Contents/Frameworks/QtXml.framework/QtXml)")
413        endif()
414        install(CODE "message(STATUS \"two ERRORS here about libmysqlclient and libpq not found are harmless\")")
415elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
416        # Windows bundling rules
417        # We don't have a helpful tool like macdeployqt for Windows, so we hardcode
418        # which libs we need.
419        # "make install", copies everything into a staging area
420        # "make installer", uses makensis to create an installer executable
421        set(WINDOWSSTAGING ${CMAKE_BINARY_DIR}/staging)
422        install(DIRECTORY marbledata/maps DESTINATION ${WINDOWSSTAGING}/data)
423        install(DIRECTORY marbledata/bitmaps DESTINATION ${WINDOWSSTAGING}/data)
424        install(DIRECTORY Documentation/images DESTINATION ${WINDOWSSTAGING}/Documentation)
425        install(FILES ${DOCFILES} DESTINATION ${WINDOWSSTAGING}/Documentation)
426        install(DIRECTORY theme DESTINATION ${WINDOWSSTAGING})
427        install(DIRECTORY printing_templates DESTINATION ${WINDOWSSTAGING})
428        install(FILES ${TRANSLATIONS} DESTINATION ${WINDOWSSTAGING}/translations)
429        install(FILES ${QTTRANSLATIONS} DESTINATION ${WINDOWSSTAGING}/translations)
430        install(FILES ${CMAKE_SOURCE_DIR}/gpl-2.0.txt ${CMAKE_SOURCE_DIR}/packaging/windows/subsurface.ico DESTINATION ${WINDOWSSTAGING})
431        install(TARGETS ${SUBSURFACE_TARGET} DESTINATION ${WINDOWSSTAGING})
432        install(FILES ${CMAKE_BINARY_DIR}/qt.conf DESTINATION ${WINDOWSSTAGING})
433        install(DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib/grantlee DESTINATION ${WINDOWSSTAGING})
434        if(NOT DEFINED MAKENSIS)
435                set(MAKENSIS makensis)
436        endif()
437
438        # the script we created above is now added as a command to run at
439        # install time - so this ensures that subsurface.exe has been
440        # built before this is run
441        install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DSUBSURFACE_TARGET=${SUBSURFACE_TARGET} -DSUBSURFACE_SOURCE=${SUBSURFACE_SOURCE} -DSTAGING=${WINDOWSSTAGING} -P ${CMAKE_SOURCE_DIR}/cmake/Modules/dlllist.cmake)")
442
443        # create the subsurface-x.y.z.exe installer - this needs to depend
444        # on the install target but cmake doesn't allow that, so we depend
445        # on the fake target instead
446        add_custom_target(
447                fake_install
448                COMMAND "${CMAKE_COMMAND}" --build . --target install
449                DEPENDS ${SUBSURFACE_TARGET}
450        )
451
452        add_custom_target(
453                installer
454                COMMAND ${MAKENSIS} ${WINDOWSSTAGING}/subsurface.nsi
455                DEPENDS fake_install
456        )
457elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
458        install(DIRECTORY marbledata/maps DESTINATION share/subsurface/data)
459        install(DIRECTORY marbledata/bitmaps DESTINATION share/subsurface/data)
460        install(FILES subsurface.debug DESTINATION bin)
461        install(FILES subsurface.desktop DESTINATION share/applications)
462        install(FILES icons/subsurface-icon.svg DESTINATION share/icons/hicolor/scalable/apps)
463        install(DIRECTORY Documentation/images DESTINATION share/subsurface/Documentation)
464        install(FILES ${DOCFILES} DESTINATION share/subsurface/Documentation)
465        install(DIRECTORY theme DESTINATION share/subsurface)
466        install(DIRECTORY printing_templates DESTINATION share/subsurface)
467        install(FILES ${TRANSLATIONS} DESTINATION share/subsurface/translations)
468        install(TARGETS ${SUBSURFACE_TARGET} DESTINATION bin)
469        if(DEFINED LIBMARBLEDEVEL)
470                install(
471                        CODE "file(GLOB SSRFMARBLE_SHLIBS \"${LIBMARBLEDEVEL}/lib/libssrfmarblewidget.so*\")"
472                        CODE "file(INSTALL \${SSRFMARBLE_SHLIBS} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)"
473                )
474        endif()
475endif()
476
477if (MAKE_TESTS)
478        add_subdirectory(tests)
479endif()
480
481# useful for debugging CMake issues
482# print_all_variables()
Note: See TracBrowser for help on using the repository browser.