diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 588 |
1 files changed, 452 insertions, 136 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a260e729..cb1ff6618 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,112 +1,205 @@ +# cmake based build of Subsurface + project(Subsurface) cmake_minimum_required(VERSION 2.8.11) -SET(CMAKE_AUTOMOC ON) -SET(CMAKE_AUTOUIC ON) -SET(CMAKE_MODULE_PATH ${${PROJECT_NAME}_SOURCE_DIR}/marbledata) +# global settings + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +option(LIBGIT2_FROM_PKGCONFIG "use pkg-config to retrieve libgit2" OFF) +option(LIBDC_FROM_PKGCONFIG "use pkg-config to retrieve libdivecomputer" OFF) +option(NO_MARBLE "disable the marble widget" OFF) +option(NO_TESTS "disable the tests" OFF) +option(NO_DOCS "disable the docs" OFF) + +set(CMAKE_MODULE_PATH ${${PROJECT_NAME}_SOURCE_DIR}/cmake/Modules) +include_directories(. ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR} qt-ui qt-ui/profile) + +# compiler specific settings if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUXX) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 ") -endif() - -INCLUDE_DIRECTORIES( . ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR} qt-ui qt-ui/profile) -FIND_PACKAGE(PkgConfig) - -MACRO(pkg_config_library LIBNAME pcfile) - pkg_check_modules(${LIBNAME} ${pcfile}) - include_directories(${${LIBNAME}_INCLUDE_DIRS}) - link_directories(${${LIBNAME}_LIBRARY_DIRS}) - add_definitions(${${LIBNAME}_CFLAGS_OTHER}) - set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} ${${LIBNAME}_LIBRARIES}) -ENDMACRO() - -pkg_config_library(LIBXML libxml-2.0) -pkg_config_library(LIBSQLITE3 sqlite3) -pkg_config_library(LIBGIT2 libgit2) -pkg_config_library(LIBXSLT libxslt) - -SET(LIBDCDEVEL "" CACHE STRING "libraries") -IF(NOT (LIBDCDEVEL STREQUAL "")) - cmake_policy(SET CMP0015 OLD) - include_directories(${LIBDCDEVEL}/include ) - link_directories(${LIBDCDEVEL}/src/.libs) -ENDIF() - -STRING(COMPARE EQUAL "${${PROJECT_NAME}_SOURCE_DIR}" "${${PROJECT_NAME}_BINARY_DIR}" insource) -GET_FILENAME_COMPONENT(PARENTDIR ${${PROJECT_NAME}_SOURCE_DIR} PATH) -STRING(COMPARE EQUAL "${${PROJECT_NAME}_SOURCE_DIR}" "${PARENTDIR}" insourcesubdir) -IF(NOT (insource OR insourcedir)) - add_custom_target(link_marble_data ALL COMMAND rm -f marbledata && ln -s ${${PROJECT_NAME}_SOURCE_DIR}/marbledata ${${PROJECT_NAME}_BINARY_DIR}/marbledata) -ENDIF() - -#configure Qt. -FIND_PACKAGE(Qt5Core REQUIRED) -FIND_PACKAGE(Qt5Concurrent REQUIRED) -FIND_PACKAGE(Qt5Widgets REQUIRED) -FIND_PACKAGE(Qt5Network REQUIRED) -FIND_PACKAGE(Qt5WebKitWidgets REQUIRED) -FIND_PACKAGE(Qt5PrintSupport REQUIRED) -FIND_PACKAGE(Qt5Svg REQUIRED) -FIND_PACKAGE(Qt5Test REQUIRED) -SET(QT_LIBRARIES Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network Qt5::WebKitWidgets Qt5::PrintSupport Qt5::Svg) -SET(QT_TEST_LIBRARIES ${QT_LIBRARIES} Qt5::Test) - -FIND_PACKAGE(Marble REQUIRED) -INCLUDE_DIRECTORIES(${MARBLE_INCLUDE_DIR}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 ") +endif() + +# pkgconfig for required libraries +find_package(PkgConfig) +include(cmake/Modules/pkgconfig_helper.cmake) + +pkg_config_library(LIBXML libxml-2.0 REQUIRED) +pkg_config_library(LIBSQLITE3 sqlite3 REQUIRED) +pkg_config_library(LIBXSLT libxslt REQUIRED) +pkg_config_library(LIBZIP libzip REQUIRED) +pkg_config_library(LIBUSB libusb-1.0 QUIET) + +# more libraries with special handling in case we build them ourselves + +if(LIBGIT2_FROM_PKGCONFIG) + pkg_config_library(LIBGIT2 libgit2 REQUIRED) + set(LIBGIT2_LIBRARIES "") +else() + find_package(LIBGIT2 REQUIRED) + include_directories(${LIBGIT2_INCLUDE_DIR}) +endif() + +if(LIBDC_FROM_PKGCONFIG) + pkg_config_library(LIBDC libdivecomputer REQUIRED) + set(LIBDIVECOMPUTER_LIBRARIES "") +else() + find_package(Libdivecomputer REQUIRED) + include_directories(${LIBDIVECOMPUTER_INCLUDE_DIR}) +endif() + +# optional marble + +if(NOT NO_MARBLE) + find_package(Marble QUIET) + if(MARBLE_FOUND) + include_directories(${MARBLE_INCLUDE_DIR}) + else() + set(NO_MARBLE ON) + endif() +endif() + +if(NO_MARBLE) + message(STATUS "building without marble widget support") + add_definitions(-DNO_MARBLE) + set(MARBLE_LIBRARIES "") +endif() + +set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} ${LIBDIVECOMPUTER_LIBRARIES} ${LIBGIT2_LIBRARIES} -lusb-1.0) + +# handle out of tree build correctly + +string(COMPARE EQUAL "${${PROJECT_NAME}_SOURCE_DIR}" "${${PROJECT_NAME}_BINARY_DIR}" insource) +get_filename_component(PARENTDIR ${${PROJECT_NAME}_SOURCE_DIR} PATH) +string(COMPARE EQUAL "${${PROJECT_NAME}_SOURCE_DIR}" "${PARENTDIR}" insourcesubdir) +if(NOT (insource OR insourcedir)) + if(NOT NO_MARBLE) + add_custom_target(link_marble_data ALL COMMAND rm -f marbledata && ln -s ${${PROJECT_NAME}_SOURCE_DIR}/marbledata ${${PROJECT_NAME}_BINARY_DIR}/marbledata) + endif() +endif() + +# configure Qt. + +find_package(Qt5 REQUIRED COMPONENTS Core Concurrent Widgets Network WebKitWidgets PrintSupport Svg Test LinguistTools) +set(QT_LIBRARIES Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network Qt5::WebKitWidgets Qt5::PrintSupport Qt5::Svg) +set(QT_TEST_LIBRARIES ${QT_LIBRARIES} Qt5::Test) # Generate the ssrf-config.h every 'make' -FILE(WRITE ${CMAKE_BINARY_DIR}/version.h.in " - #define VERSION_STRING \"@VERSION_STRING@\" - #define GIT_VERSION_STRING \"@GIT_VERSION_STRING@\" - #define CANONICAL_VERSION_STRING \"@CANONICAL_VERSION_STRING@\" + +file(WRITE ${CMAKE_BINARY_DIR}/version.h.in +"#define VERSION_STRING \"@VERSION_STRING@\" +#define GIT_VERSION_STRING \"@GIT_VERSION_STRING@\" +#define CANONICAL_VERSION_STRING \"@CANONICAL_VERSION_STRING@\" ") -FILE(WRITE ${CMAKE_BINARY_DIR}/version.cmake " - IF (\${APPLE}) - SET(VER_OS darwin) - ELSEIF (\${WIN32}) - SET(VER_OS win) - ELSE () - SET(VER_OS linux) - ENDIF () - EXECUTE_PROCESS( - COMMAND sh scripts/get-version \${VER_OS} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE VERSION_STRING - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - EXECUTE_PROCESS( - COMMAND sh scripts/get-version linux - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_VERSION_STRING - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - EXECUTE_PROCESS( - COMMAND sh scripts/get-version full - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE CANONICAL_VERSION_STRING - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - CONFIGURE_FILE(\${SRC} \${DST} @ONLY) + +file(WRITE ${CMAKE_BINARY_DIR}/version.cmake " + if(\${APPLE}) + set(VER_OS darwin) + elseif(\${WIN32}) + set(VER_OS win) + else() + set(VER_OS linux) + endif() + if(CMAKE_SYSTEM_NAME STREQUAL \"Windows\") + set(VER_OS win) + endif() + execute_process( + COMMAND sh scripts/get-version \${VER_OS} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE VERSION_STRING + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND sh scripts/get-version linux + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_VERSION_STRING + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND sh scripts/get-version full + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE CANONICAL_VERSION_STRING + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + configure_file(\${SRC} \${DST} @ONLY) + if(CMAKE_SYSTEM_NAME STREQUAL \"Windows\") + execute_process( + COMMAND cat ${CMAKE_SOURCE_DIR}/packaging/windows/subsurface.nsi.in + COMMAND sed -e \"s/VERSIONTOKEN/\${GIT_VERSION_STRING}/\" + COMMAND sed -e \"s/PRODVTOKEN/\${CANONICAL_VERSION_STRING}/\" + OUTPUT_FILE ${CMAKE_BINARY_DIR}/staging/subsurface.nsi + ) + endif() ") -ADD_CUSTOM_TARGET(version ALL COMMAND - ${CMAKE_COMMAND} -D SRC=${CMAKE_BINARY_DIR}/version.h.in - -D DST=${CMAKE_BINARY_DIR}/ssrf-version.h - -P ${CMAKE_BINARY_DIR}/version.cmake + +add_custom_target( + version ALL COMMAND ${CMAKE_COMMAND} ${CMAKE_COMMAND} + -D SRC=${CMAKE_BINARY_DIR}/version.h.in + -D DST=${CMAKE_BINARY_DIR}/ssrf-version.h + -D CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -P ${CMAKE_BINARY_DIR}/version.cmake ) +# set up the different target platforms + +set(PLATFORM_SRC unknown_platform.c) +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(FBSUPPORT 1) + set(SUBSURFACE_TARGET subsurface) + set(PLATFORM_SRC linux.c) + # in some builds we appear to be missing libz for some strange reason... + set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lz) +endif() +if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(FBSUPPORT 1) + set(SUBSURFACE_TARGET Subsurface) + set(PLATFORM_SRC macos.c) + find_library(APP_SERVICES_LIBRARY ApplicationServices) + set(EXTRA_LIBS ${APP_SERVICES_LIBRARY}) + set(ICON_FILE ${CMAKE_SOURCE_DIR}/packaging/macosx/Subsurface.icns) + set(MACOSX_BUNDLE_INFO_STRING "Subsurface") + set(MACOSX_BUNDLE_ICON_FILE Subsurface.icns) + set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.subsurface-divelog") + set(MACOSX_BUNDLE_BUNDLE_NAME "Subsurface") + set(MACOSX_BUNDLE_BUNDLE_VERSION "4.4.1") + set(MACOSX_BUNDLE_SHORT_VERSION_STRING "4.4.1") + set(MACOSX_BUNDLE_LONG_VERSION_STRING "4.4.1") + set(MACOSX_BUNDLE_COPYRIGHT "Linus Torvalds, Dirk Hohndel, Tomaz Canabrava, and others") + set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") + set(SUBSURFACE_PKG MACOSX_BUNDLE ${ICON_FILE}) +endif() +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(FBSUPPORT 1) + set(SUBSURFACE_TARGET subsurface) + set(PLATFORM_SRC windows.c) + set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lwsock32) + remove_definitions(-DUNICODE) + add_definitions(-mwindows) +endif() + +# include translations +add_subdirectory(translations) + # compile the core library, in C. -SET(SUBSURFACE_CORE_LIB_SRCS + +set(SUBSURFACE_CORE_LIB_SRCS cochran.c + datatrak.c deco.c device.c dive.c + divesite.c divelist.c equipment.c file.c + git-access.c libdivecomputer.c liquivision.c load-git.c membuffer.c + ostctools.c parse-xml.c planner.c profile.c @@ -122,10 +215,10 @@ SET(SUBSURFACE_CORE_LIB_SRCS time.c uemis.c uemis-downloader.c - linux.c - #gettextfrommoc should be added because we are using it on the c-code. + version.c + # gettextfrommoc should be added because we are using it on the c-code. gettextfromc.cpp - #dirk ported some core functionality to c++. + # dirk ported some core functionality to c++. qthelper.cpp divecomputer.cpp exif.cpp @@ -133,10 +226,17 @@ SET(SUBSURFACE_CORE_LIB_SRCS devicedetails.cpp configuredivecomputer.cpp configuredivecomputerthreads.cpp + divesitehelpers.cpp + ${PLATFORM_SRC} ) -#the interface, in C++ -SET(SUBSURFACE_INTERFACE +if(FBSUPPORT) + add_definitions(-DFBSUPPORT) + set(SOCIALNETWORKS qt-ui/socialnetworks.cpp) +endif() +# the interface, in C++ + +set(SUBSURFACE_INTERFACE qt-ui/updatemanager.cpp qt-ui/about.cpp qt-ui/completionmodels.cpp @@ -153,6 +253,7 @@ SET(SUBSURFACE_INTERFACE qt-ui/modeldelegates.cpp qt-ui/models.cpp qt-ui/metrics.cpp + qt-ui/notificationwidget.cpp qt-ui/preferences.cpp qt-ui/printdialog.cpp qt-ui/printlayout.cpp @@ -170,10 +271,15 @@ SET(SUBSURFACE_INTERFACE qt-ui/usersurvey.cpp qt-ui/configuredivecomputerdialog.cpp qt-ui/filtermodels.cpp + qt-ui/undocommands.cpp + qt-ui/locationinformation.cpp + qt-ui/qtwaitingspinner.cpp + ${SOCIALNETWORKS} ) -#the profile widget -SET(SUBSURFACE_PROFILE_LIB_SRCS +# the profile widget + +set(SUBSURFACE_PROFILE_LIB_SRCS qt-ui/profile/profilewidget2.cpp qt-ui/profile/diverectitem.cpp qt-ui/profile/divepixmapitem.cpp @@ -189,59 +295,269 @@ SET(SUBSURFACE_PROFILE_LIB_SRCS qt-ui/profile/tankitem.cpp ) -#the yearly statistics widget. -SET(SUBSURFACE_STATISTICS_LIB_SRCS +# the yearly statistics widget. + +set(SUBSURFACE_STATISTICS_LIB_SRCS qt-ui/statistics/statisticswidget.cpp qt-ui/statistics/yearstatistics.cpp qt-ui/statistics/statisticsbar.cpp qt-ui/statistics/monthstatistics.cpp ) -#the main app. -SET(SUBSURFACE_APP +# the main app. + +set(SUBSURFACE_APP main.cpp qt-gui.cpp qthelper.cpp ) -FILE(GLOB SUBSURFACE_UI qt-ui/*.ui) -QT5_WRAP_UI( SUBSURFACE_UI_HDRS ${SUBSURFACE_UI} ) - -ADD_LIBRARY(subsurface_corelib STATIC ${SUBSURFACE_CORE_LIB_SRCS} ) -TARGET_LINK_LIBRARIES(subsurface_corelib ${QT_LIBRARIES}) -ADD_LIBRARY(subsurface_profile STATIC ${SUBSURFACE_PROFILE_LIB_SRCS}) -TARGET_LINK_LIBRARIES(subsurface_profile ${QT_LIBRARIES}) -ADD_LIBRARY(subsurface_statistics STATIC ${SUBSURFACE_STATISTICS_LIB_SRCS}) -TARGET_LINK_LIBRARIES(subsurface_statistics ${QT_LIBRARIES}) -ADD_LIBRARY(subsurface_generated_ui STATIC ${SUBSURFACE_UI_HDRS}) -ADD_LIBRARY(subsurface_interface STATIC ${SUBSURFACE_INTERFACE}) -TARGET_LINK_LIBRARIES(subsurface_interface ${QT_LIBRARIES} ${MARBLE_LIBRARIES}) - -ADD_EXECUTABLE(subsurface ${SUBSURFACE_APP} ${SUBSURFACE_QRC_HRDS} ) -target_link_libraries( subsurface - subsurface_generated_ui - subsurface_interface - subsurface_profile - subsurface_statistics - subsurface_corelib - ${SUBSURFACE_LINK_LIBRARIES} - -ldivecomputer - -lzip +# create the libraries + +file(GLOB SUBSURFACE_UI qt-ui/*.ui) +qt5_wrap_ui(SUBSURFACE_UI_HDRS ${SUBSURFACE_UI}) +qt5_add_resources(SUBSURFACE_RESOURCES subsurface.qrc) + +add_library(subsurface_corelib STATIC ${SUBSURFACE_CORE_LIB_SRCS} ) +target_link_libraries(subsurface_corelib ${QT_LIBRARIES}) +add_library(subsurface_profile STATIC ${SUBSURFACE_PROFILE_LIB_SRCS}) +target_link_libraries(subsurface_profile ${QT_LIBRARIES}) +add_library(subsurface_statistics STATIC ${SUBSURFACE_STATISTICS_LIB_SRCS}) +target_link_libraries(subsurface_statistics ${QT_LIBRARIES}) +add_library(subsurface_generated_ui STATIC ${SUBSURFACE_UI_HDRS}) +target_link_libraries(subsurface_generated_ui ${QT_LIBRARIES}) +add_library(subsurface_interface STATIC ${SUBSURFACE_INTERFACE}) +target_link_libraries(subsurface_interface ${QT_LIBRARIES} ${MARBLE_LIBRARIES}) + +# add pthread to the end of the library list on Linux +# this is only needed on Ubuntu (why do these idiots break everything?) +# but shouldn't hurt on other Linux versions +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(SUBSURFACE_LINK_LIBRARIES ${SUBSURFACE_LINK_LIBRARIES} -lpthread) +endif() + +# create the executables + +add_executable(${SUBSURFACE_TARGET} MACOSX_BUNDLE WIN32 ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES}) +target_link_libraries( + ${SUBSURFACE_TARGET} + subsurface_generated_ui + subsurface_interface + subsurface_profile + subsurface_statistics + subsurface_corelib + ${SUBSURFACE_LINK_LIBRARIES} ) -ADD_DEPENDENCIES(subsurface_statistics subsurface_generated_ui) -ADD_DEPENDENCIES(subsurface_profile subsurface_generated_ui) -ADD_DEPENDENCIES(subsurface_interface subsurface_generated_ui) -ADD_DEPENDENCIES(subsurface_generated_ui version) -ADD_DEPENDENCIES(subsurface_corelib version) - -MACRO(test NAME FILE) - ADD_EXECUTABLE(${NAME} tests/${FILE}) - TARGET_LINK_LIBRARIES(${NAME} subsurface_corelib ${QT_TEST_LIBRARIES} ${SUBSURFACE_LINK_LIBRARIES} -lzip -ldivecomputer) - ADD_TEST(NAME ${NAME} COMMAND ${NAME}) -ENDMACRO() - -ENABLE_TESTING() -test(TestUnitConversion testunitconversion.cpp) -test(TestProfile testprofile.cpp) -test(TestGpsCoords testgpscoords.cpp) +add_dependencies(subsurface_statistics subsurface_generated_ui) +add_dependencies(subsurface_profile subsurface_generated_ui) +add_dependencies(subsurface_interface subsurface_generated_ui) +add_dependencies(subsurface_generated_ui version) +add_dependencies(subsurface_corelib version) + +# add platform specific actions +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/qt.conf + COMMAND echo \"[Paths]\" > ${CMAKE_BINARY_DIR}/qt.conf \; echo \"Prefix=.\" >> ${CMAKE_BINARY_DIR}/qt.conf + ) + add_custom_target( + generate_qtconf + DEPENDS ${CMAKE_BINARY_DIR}/qt.conf + ) + add_dependencies(${SUBSURFACE_TARGET} generate_qtconf) +endif() + +# QTest based tests + +macro(TEST NAME FILE) + add_executable(${NAME} EXCLUDE_FROM_ALL tests/${FILE} ${SUBSURFACE_RESOURCES}) + target_link_libraries(${NAME} subsurface_corelib ${QT_TEST_LIBRARIES} ${SUBSURFACE_LINK_LIBRARIES}) + add_test(NAME ${NAME}_build COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${NAME}) + add_test(NAME ${NAME}_run COMMAND ${NAME}) + set_tests_properties(${NAME}_run PROPERTIES DEPENDS ${NAME}_build) +endmacro() + +add_definitions(-DSUBSURFACE_SOURCE="${CMAKE_SOURCE_DIR}") +add_definitions(-g) +if(NOT NO_TESTS) + enable_testing() + TEST(TestUnitConversion testunitconversion.cpp) + TEST(TestProfile testprofile.cpp) + TEST(TestGpsCoords testgpscoords.cpp) + TEST(TestParse testparse.cpp) +endif() + +if(NOT NO_DOCS) + add_custom_target( + documentation ALL + mkdir -p ${CMAKE_BINARY_DIR}/Documentation/ \\; + cp -a ${CMAKE_SOURCE_DIR}/Documentation/images ${CMAKE_BINARY_DIR}/Documentation/ \\; + make -C ${CMAKE_SOURCE_DIR}/Documentation OUT=${CMAKE_BINARY_DIR}/Documentation/ doc + ) +endif() + +# install Subsurface +# first some variables with files that need installing + +set(DOCFILES + README + ReleaseNotes/ReleaseNotes.txt + SupportedDivecomputers.txt + ${CMAKE_BINARY_DIR}/Documentation/user-manual.html + ${CMAKE_BINARY_DIR}/Documentation/user-manual_es.html + ${CMAKE_BINARY_DIR}/Documentation/user-manual_fr.html + ${CMAKE_BINARY_DIR}/Documentation/user-manual_ru.html +) + +set(QTTRANSLATIONS_BASE + qt_da.qm + qt_de.qm + qt_es.qm + qt_fr.qm + qt_he.qm + qt_hu.qm + qt_pl.qm + qt_pt.qm + qt_ru.qm + qt_sk.qm + qt_sv.qm + qt_zh_TW.qm +) + +if(NOT DEFINED QT_TRANSLATION_DIR OR QT_TRANSLATION_DIR STREQUAL "") + set(QT_TRANSLATION_DIR ${Qt5Core_DIR}/../../../translations) +endif() +set(QTTRANSLATIONS "") +foreach(QTTRANSLATION ${QTTRANSLATIONS_BASE}) + if(NOT ${QTTRANSLATION} STREQUAL "") + set(QTTRANSLATIONS ${QTTRANSLATIONS} ${QT_TRANSLATION_DIR}/${QTTRANSLATION}) + endif() +endforeach() + +# now for each platform the install instructions + +if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(RESOURCEDIR ${CMAKE_BINARY_DIR}/Subsurface.app/Contents/Resources) + install(DIRECTORY marbledata/maps DESTINATION ${RESOURCEDIR}/data) + install(DIRECTORY marbledata/bitmaps DESTINATION ${RESOURCEDIR}/data) + install(DIRECTORY Documentation/images DESTINATION ${RESOURCEDIR}/share/Documentation) + install(FILES ${DOCFILES} DESTINATION ${RESOURCEDIR}/share/Documentation) + install(DIRECTORY theme DESTINATION ${RESOURCEDIR}) + install(FILES ${TRANSLATIONS} DESTINATION ${RESOURCEDIR}/translations) + install(FILES ${QTTRANSLATIONS} DESTINATION ${RESOURCEDIR}/translations) + install(FILES ${CMAKE_SOURCE_DIR}/gpl-2.0.txt DESTINATION ${RESOURCEDIR}) + # this is a hack - but I don't know how else to find the macdeployqt program if it's not in the PATH + string(REPLACE moc macdeployqt MACDEPLOYQT ${QT_MOC_EXECUTABLE}) + install(CODE "execute_process(COMMAND ${MACDEPLOYQT} Subsurface.app)") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + # Windows bundling rules + # We don't have a helpful tool like macdeployqt for Windows, so we hardcode + # which libs we need. + # "make install", copies everything into a staging area + # "make installer", uses makensis to create an installer executable + set(WINDOWSSTAGING ${CMAKE_BINARY_DIR}/staging) + install(DIRECTORY marbledata/maps DESTINATION ${WINDOWSSTAGING}/data) + install(DIRECTORY marbledata/bitmaps DESTINATION ${WINDOWSSTAGING}/data) + install(DIRECTORY Documentation/images DESTINATION ${WINDOWSSTAGING}/Documentation) + install(FILES ${DOCFILES} DESTINATION ${WINDOWSSTAGING}/Documentation) + install(DIRECTORY theme DESTINATION ${WINDOWSSTAGING}) + install(FILES ${TRANSLATIONS} DESTINATION ${WINDOWSSTAGING}/translations) + install(FILES ${QTTRANSLATIONS} DESTINATION ${WINDOWSSTAGING}/translations) + install(FILES ${CMAKE_SOURCE_DIR}/gpl-2.0.txt ${CMAKE_SOURCE_DIR}/packaging/windows/subsurface.ico DESTINATION ${WINDOWSSTAGING}) + install(TARGETS ${SUBSURFACE_TARGET} DESTINATION ${WINDOWSSTAGING}) + install(FILES ${CMAKE_BINARY_DIR}/qt.conf DESTINATION ${WINDOWSSTAGING}) + if(NOT DEFINED MAKENSIS) + set(MAKENSIS makensis) + endif() + + # next figure out the DLLs we need to include in the installer + # since this needs to run at install time we create a new cmake + # script that then gets executed at install time with install(CODE...) + file(WRITE ${CMAKE_BINARY_DIR}/dlllist.cmake " + message(STATUS \"processing dlllist.cmake\") + # figure out which command to use for objdump + execute_process( + COMMAND ${CMAKE_C_COMPILER} -dumpmachine + OUTPUT_VARIABLE OBJDUMP + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + # figure out where we should search for libraries + execute_process( + COMMAND ${CMAKE_C_COMPILER} -print-search-dirs + COMMAND sed -nE \"/^libraries: =/{s///;s,/lib/?\\\(:|\\\$\\\$\\\),/bin\\\\1,g;p;q;}\" + OUTPUT_VARIABLE ADDPATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + # since cmake doesn't appear to give us a variable with + # all libraries we link against, grab the link.txt script + # instead and drop the command name from it (before the + # first space) -- this will fail if the full path for the + # linker used contains a space... + execute_process( + COMMAND tail -1 CMakeFiles/subsurface.dir/link.txt + COMMAND cut -d\\ -f 2- + OUTPUT_VARIABLE LINKER_LINE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + # finally run our win-ldd.pl script against that to + # collect all the required dlls + execute_process( + COMMAND sh -c \"OBJDUMP=\${OBJDUMP}-objdump PATH=$ENV{PATH}:\${ADDPATH} perl ${CMAKE_SOURCE_DIR}/scripts/win-ldd.pl ${SUBSURFACE_TARGET}.exe \${LINKER_LINE}\" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + OUTPUT_VARIABLE DLLS + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + # replace newlines with semicolons so this is a cmake list + string(REPLACE \"\\n\" \";\" DLLLIST \${DLLS}) + # executing 'install' as a command seems hacky, but you + # can't use the install() cmake function in a script + foreach(DLL \${DLLLIST}) + execute_process(COMMAND install \${DLL} \${STAGING}) + endforeach() + ") + # the script we created above is now added as a command to run at + # install time - so this ensures that subsurface.exe has been + # built before this is run + install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -DSTAGING=${WINDOWSSTAGING} -P ${CMAKE_BINARY_DIR}/dlllist.cmake)") + + # create the subsurface-x.y.z.exe installer - this needs to depend + # on the install target but cmake doesn't allow that, so we depend + # on the fake target instead + add_custom_target( + fake_install + COMMAND "${CMAKE_COMMAND}" --build . --target install + DEPENDS ${SUBSURFACE_TARGET} + ) + + add_custom_target( + installer + COMMAND ${MAKENSIS} ${WINDOWSSTAGING}/subsurface.nsi + DEPENDS fake_install + ) +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + # Android template directory + set(ANDROID_PACKAGE_SOURCE_DIR, ${CMAKE_BINARY_DIR}/android) +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + install(DIRECTORY marbledata/maps DESTINATION share/subsurface/data) + install(DIRECTORY marbledata/bitmaps DESTINATION share/subsurface/data) + install(FILES subsurface.desktop DESTINATION share/applications) + install(FILES subsurface-icon.svg DESTINATION share/icons/hicolor/scalable/apps) + install(DIRECTORY Documentation/images DESTINATION share/subsurface/Documentation) + install(FILES ${DOCFILES} DESTINATION share/subsurface/Documentation) + install(DIRECTORY theme DESTINATION share/subsurface) + install(FILES ${TRANSLATIONS} DESTINATION share/subsurface/translations) + install(TARGETS ${SUBSURFACE_TARGET} DESTINATION bin) + if(DEFINED LIBMARBLEDEVEL) + install( + CODE "file(GLOB SSRFMARBLE_SHLIBS \"${LIBMARBLEDEVEL}/lib/libssrfmarblewidget.so*\")" + CODE "file(INSTALL \${SSRFMARBLE_SHLIBS} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)" + ) + endif() +endif() |