cmake_minimum_required(VERSION 3.10) set(CMAKE_OSX_DEPLOYMENT_TARGET 10.12) # Has to be set before `project()`, and ignored on non-macos project(lokinet-gui VERSION 0.3.4 DESCRIPTION "Lokinet graphical control panel" LANGUAGES CXX) if(WIN32) enable_language(RC) endif() set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) option(BUILD_STATIC_DEPS "build every dep statically (ON/OFF)" OFF) if(BUILD_STATIC_DEPS) find_package(Git) if(GIT_FOUND) function(check_submodule relative_path) execute_process(COMMAND git rev-parse "HEAD" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${relative_path} OUTPUT_VARIABLE localHead) execute_process(COMMAND git rev-parse "HEAD:${relative_path}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE checkedHead) string(COMPARE EQUAL "${localHead}" "${checkedHead}" upToDate) if (upToDate) message(STATUS "Submodule '${relative_path}' is up-to-date") else() message(FATAL_ERROR "Submodule '${relative_path}' is not up-to-date. Please update with\ngit submodule update --init --recursive\nor run cmake with -DSUBMODULE_CHECK=OFF") endif() endfunction () message(STATUS "Checking submodules") check_submodule(external/loki-mq) endif() include(StaticBuild) add_subdirectory(external/loki-mq) else() add_library(oxenmq INTERFACE) if(OXENMQ_LIBRARIES) # Private option for the macos bundled gui build target_link_libraries(oxenmq INTERFACE ${OXENMQ_LIBRARIES}) target_include_directories(oxenmq INTERFACE ${OXENMQ_INCLUDE_DIRS}) else() find_package(PkgConfig REQUIRED) pkg_check_modules(oxenmq REQUIRED liboxenmq>=1.2.2 IMPORTED_TARGET) target_link_libraries(oxenmq INTERFACE PkgConfig::oxenmq) endif() add_library(oxenmq::oxenmq ALIAS oxenmq) endif() find_package(Qt5 COMPONENTS Qml Quick Widgets Charts Svg REQUIRED) find_package(Threads) add_executable(lokinet-gui src/main.cpp src/QmlClipboardAdapter.cpp src/HttpClient.cpp src/LokinetApiClient.cpp src/ApiPoller.cpp src/PlatformDetails.cpp src/BandwidthChartData.cpp src/process/LokinetProcessManager.cpp res/resources.qrc ) target_link_libraries(lokinet-gui PRIVATE Qt5::Core Qt5::Qml Qt5::Quick Qt5::Widgets Qt5::Charts Qt5::Svg Threads::Threads oxenmq ) if (WIN32) set(CMAKE_EXE_LINKER_FLAGS "-mwindows -fstack-protector") endif() set_target_properties(lokinet-gui PROPERTIES CXX_STANDARD 17 CXX_EXTENSIONS OFF CXX_STANDARD_REQUIRED ON AUTORCC ON # Enables processing *.qrc in sources AUTOMOC ON # Does... whatever automoc is ) if(APPLE) option(MACOS_APP "Build a LokinetGUI.app bundle instead of a binary" OFF) set(MACOS_SIGN "" CACHE STRING "enable codesigning -- use a 'Apple Distribution' key (or key description) from `security find-identity -v`") target_sources(lokinet-gui PRIVATE src/process/MacOSLokinetProcessManager.cpp) if(MACOS_APP) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lokinet-gui.icns COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/mk-icns.sh ${CMAKE_CURRENT_SOURCE_DIR}/res/images/icon.svg ${CMAKE_CURRENT_BINARY_DIR}/lokinet-gui.icns DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/res/images/icon.svg ${CMAKE_CURRENT_SOURCE_DIR}/tools/mk-icns.sh) target_sources(lokinet-gui PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/lokinet-gui.icns) set_target_properties(lokinet-gui PROPERTIES MACOSX_BUNDLE TRUE OUTPUT_NAME LokinetGUI RESOURCE "${CMAKE_CURRENT_BINARY_DIR}/lokinet-gui.icns") set(MACOSX_BUNDLE_BUNDLE_NAME LokinetGUI) set(MACOSX_BUNDLE_GUI_IDENTIFIER org.lokinet.lokinet-gui) set(MACOSX_BUNDLE_INFO_STRING "Lokinet control panel") set(MACOSX_BUNDLE_ICON_FILE lokinet-gui.icns) set(MACOSX_BUNDLE_LONG_VERSION_STRING ${PROJECT_VERSION}) set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION}) set(MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}) set(MACOSX_BUNDLE_COPYRIGHT "© 2020, The Loki Project") get_target_property(uic_location Qt5::uic IMPORTED_LOCATION) get_filename_component(qt_dir ${uic_location} DIRECTORY) if(MACOS_SIGN) add_custom_command(TARGET lokinet-gui POST_BUILD COMMAND echo "Running qt magic macos deploy script" COMMAND "${qt_dir}/macdeployqt" LokinetGUI.app -always-overwrite -qmldir=${PROJECT_SOURCE_DIR}/res COMMAND echo "Signing LokinetGUI.app and everything inside it" COMMAND codesign -s "${MACOS_SIGN}" --deep --strict --options runtime --force -vvv LokinetGUI.app ) else() add_custom_command(TARGET lokinet-gui POST_BUILD COMMAND echo "Running qt magic macos deploy script" COMMAND "${qt_dir}/macdeployqt" LokinetGUI.app -always-overwrite -qmldir=${PROJECT_SOURCE_DIR}/res ) endif() endif() elseif(WIN32) target_sources(lokinet-gui PRIVATE src/process/WindowsLokinetProcessManager.cpp src/version.rc) else() option(SYSTEMD "Enable systemd support" OFF) if(SYSTEMD) target_sources(lokinet-gui PRIVATE src/process/SystemdLokinetProcessManager.cpp) target_compile_definitions(lokinet-gui PRIVATE SYSTEMD) else() target_sources(lokinet-gui PRIVATE src/process/LinuxLokinetProcessManager.cpp) endif() endif() install(TARGETS lokinet-gui RUNTIME DESTINATION bin BUNDLE DESTINATION . RESOURCE DESTINATION .)