2022-02-03 22:11:10 +00:00
cmake_minimum_required ( VERSION 3.15 ) # minimum version required by QuaZip
2013-09-26 12:49:58 +01:00
2021-11-03 14:45:42 +00:00
project ( Launcher )
2014-04-06 17:12:48 +01:00
string ( COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BUILD_DIR}" IS_IN_SOURCE_BUILD )
if ( IS_IN_SOURCE_BUILD )
2021-10-13 00:59:25 +01:00
message ( FATAL_ERROR "You are building the Launcher in-source. Please separate the build tree from the source tree." )
2020-05-28 22:17:50 +01:00
endif ( )
2018-01-22 03:28:07 +00:00
##################################### Set CMake options #####################################
2014-04-06 18:43:09 +01:00
set ( CMAKE_AUTOMOC ON )
2021-12-31 21:36:59 +00:00
set ( CMAKE_AUTORCC ON )
2014-04-06 18:43:09 +01:00
set ( CMAKE_INCLUDE_CURRENT_DIR ON )
2013-01-11 01:25:40 +00:00
2014-04-06 18:43:09 +01:00
set ( CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/" )
2015-09-28 19:53:46 +01:00
2016-05-01 02:49:46 +01:00
# Output all executables and shared libs in the main build folder, not in subfolders.
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ PROJECT_BINARY_DIR } )
if ( UNIX )
2018-07-15 13:51:05 +01:00
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ PROJECT_BINARY_DIR } )
2016-05-01 02:49:46 +01:00
endif ( )
2016-03-12 23:44:37 +00:00
set ( CMAKE_JAVA_TARGET_OUTPUT_DIR ${ PROJECT_BINARY_DIR } /jars )
2014-01-11 01:06:22 +00:00
2013-02-21 18:35:33 +00:00
######## Set compiler flags ########
2015-09-28 19:53:46 +01:00
set ( CMAKE_CXX_STANDARD_REQUIRED true )
set ( CMAKE_C_STANDARD_REQUIRED true )
2022-07-20 13:21:44 +01:00
set ( CMAKE_CXX_STANDARD 17 )
2022-07-30 15:35:48 +01:00
set ( CMAKE_C_STANDARD 11 )
2015-09-05 17:46:57 +01:00
include ( GenerateExportHeader )
2022-10-26 01:44:30 +01:00
if ( MSVC )
2022-12-16 21:05:12 +00:00
# /GS Adds buffer security checks, default on but incuded anyway to mirror gcc's fstack-protector flag
2022-10-26 01:44:30 +01:00
# /permissive- specify standards-conforming compiler behavior, also enabled by Qt6, default on with std:c++20
2022-12-15 23:33:03 +00:00
# Use /W4 as /Wall includes unnesserey warnings such as added padding to structs
2022-12-16 21:05:12 +00:00
set ( CMAKE_CXX_FLAGS "/GS /permissive- /W4 ${CMAKE_CXX_FLAGS}" )
2022-05-16 21:37:26 +01:00
2022-10-26 01:44:30 +01:00
# LINK accepts /SUBSYSTEM whics sets if we are a WINDOWS (gui) or a CONSOLE programs
# This implicitly selects an entrypoint specific to the subsystem selected
# qtmain/QtEntryPointLib provides the correct entrypoint (wWinMain) for gui programs
# Additinaly LINK autodetects we use a GUI so we can omit /SUBSYSTEM
# This allows tests to still use have console without using seperate linker flags
2022-12-15 23:33:03 +00:00
# /LTCG allows for linking wholy optimizated programs
2022-10-26 01:44:30 +01:00
# /MANIFEST:NO disables generating a manifest file, we instead provide our own
# /STACK sets the stack reserve size, ATL's pack list needs 3-4 MiB as of November 2022, provide 8 MiB
2022-12-15 23:33:03 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "/LTCG /MANIFEST:NO /STACK:8388608 ${CMAKE_EXE_LINKER_FLAGS}" )
2022-10-26 01:44:30 +01:00
2022-12-16 21:05:12 +00:00
# /GL enables whole program optimizations
# /Gw helps reduce binary size
# /Gy allows the compiler to package individual functions
# /guard:cf enables control flow guard
foreach ( lang C CXX )
set ( "CMAKE_${lang}_FLAGS_RELEASE" "/GL /Gw /Gy /guard:cf" )
endforeach ( )
2022-10-26 01:44:30 +01:00
# See https://github.com/ccache/ccache/issues/1040
# Note, CMake 3.25 replaces this with CMAKE_MSVC_DEBUG_INFORMATION_FORMAT
# See https://cmake.org/cmake/help/v3.25/variable/CMAKE_MSVC_DEBUG_INFORMATION_FORMAT.html
foreach ( config DEBUG RELWITHDEBINFO )
foreach ( lang C CXX )
set ( flags_var "CMAKE_${lang}_FLAGS_${config}" )
string ( REGEX REPLACE "/Z[Ii]" "/Z7" ${ flags_var } "${${flags_var}}" )
endforeach ( )
endforeach ( )
2022-10-29 21:58:08 +01:00
if ( CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreadedDLL" )
set ( CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release "" )
set ( CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release "" )
endif ( )
2022-10-26 01:44:30 +01:00
else ( )
set ( CMAKE_CXX_FLAGS "-Wall -pedantic -fstack-protector-strong --param=ssp-buffer-size=4 ${CMAKE_CXX_FLAGS}" )
# ATL's pack list needs more than the default 1 Mib stack on windows
if ( WIN32 )
set ( CMAKE_EXE_LINKER_FLAGS "-Wl,--stack,8388608 ${CMAKE_EXE_LINKER_FLAGS}" )
endif ( )
2022-11-02 20:08:08 +00:00
endif ( )
2022-05-16 21:37:26 +01:00
# Fix build with Qt 5.13
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DQT_NO_DEPRECATED_WARNINGS=Y" )
2022-02-03 22:11:10 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DQT_DISABLE_DEPRECATED_BEFORE=0x050C00" )
2021-12-12 00:35:46 +00:00
2022-11-15 20:23:20 +00:00
# Fix aarch64 build for toml++
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DTOML_ENABLE_FLOAT16=0" )
2022-05-22 19:50:37 +01:00
# set CXXFLAGS for build targets
2022-06-08 20:04:27 +01:00
set ( CMAKE_CXX_FLAGS_RELEASE "-O2 -D_FORTIFY_SOURCE=2 ${CMAKE_CXX_FLAGS_RELEASE}" )
2022-05-22 19:50:37 +01:00
2023-08-12 08:06:27 +01:00
option ( DEBUG_ADDRESS_SANITIZER "Enable Address Sanitizer in Debug builds" OFF )
2023-07-04 01:42:57 +01:00
# If this is a Debug build turn on address sanitiser
if ( CMAKE_BUILD_TYPE STREQUAL "Debug" AND DEBUG_ADDRESS_SANITIZER )
2023-07-05 07:43:39 +01:00
message ( STATUS "Address Sanitizer enabled for Debug builds, Turn it off with -DDEBUG_ADDRESS_SANITIZER=off" )
2023-07-04 01:42:57 +01:00
if ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
2023-07-04 04:04:24 +01:00
if ( CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC" )
# using clang with clang-cl front end
message ( STATUS "Address Sanitizer available on Clang MSVC frontend" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address /O1 /Oy-" )
2023-07-05 19:51:37 +01:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /fsanitize=address /O1 /Oy-" )
2023-07-04 04:04:24 +01:00
else ( )
# AppleClang and Clang
message ( STATUS "Address Sanitizer available on Clang" )
2023-07-05 11:02:20 +01:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -O1 -fno-omit-frame-pointer" )
2023-07-05 19:51:37 +01:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -O1 -fno-omit-frame-pointer" )
2023-07-04 04:04:24 +01:00
endif ( )
2023-07-04 01:42:57 +01:00
elseif ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" )
# GCC
2023-07-04 04:04:24 +01:00
message ( STATUS "Address Sanitizer available on GCC" )
2023-07-05 07:43:39 +01:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -O1 -fno-omit-frame-pointer" )
2023-07-05 19:51:37 +01:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -O1 -fno-omit-frame-pointer" )
link_libraries ( "asan" )
2023-07-04 01:42:57 +01:00
elseif ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" )
2023-07-04 04:04:24 +01:00
message ( STATUS "Address Sanitizer available on MSVC" )
2023-07-04 02:07:59 +01:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address /O1 /Oy-" )
2023-07-05 19:51:37 +01:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /fsanitize=address /O1 /Oy-" )
2023-07-04 01:42:57 +01:00
else ( )
2023-07-05 03:43:22 +01:00
message ( STATUS "Address Sanitizer not available on compiler ${CMAKE_CXX_COMPILER_ID}" )
2023-07-04 01:42:57 +01:00
endif ( )
endif ( )
2022-03-23 09:05:31 +00:00
option ( ENABLE_LTO "Enable Link Time Optimization" off )
if ( ENABLE_LTO )
include ( CheckIPOSupported )
check_ipo_supported ( RESULT ipo_supported OUTPUT ipo_error )
2022-10-29 16:55:38 +01:00
if ( ipo_supported )
set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE )
set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL TRUE )
if ( CMAKE_BUILD_TYPE )
if ( CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" )
message ( STATUS "IPO / LTO enabled" )
else ( )
message ( STATUS "Not enabling IPO / LTO on debug builds" )
endif ( )
else ( )
message ( STATUS "IPO / LTO will only be enabled for release builds" )
endif ( )
2022-03-23 09:05:31 +00:00
else ( )
message ( STATUS "IPO / LTO not supported: <${ipo_error}>" )
endif ( )
2022-03-19 17:08:28 +00:00
endif ( )
2022-06-12 00:46:30 +01:00
option ( BUILD_TESTING "Build the testing tree." ON )
2022-10-27 22:31:51 +01:00
find_package ( ECM QUIET NO_MODULE )
if ( NOT ECM_FOUND )
if ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libraries/extra-cmake-modules/CMakeLists.txt" )
message ( STATUS "Using bundled ECM" )
set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/libraries/extra-cmake-modules/modules;${CMAKE_MODULE_PATH}" )
else ( )
message ( FATAL_ERROR
" C o u l d n o t f i n d E C M \ n \ n "
" E i t h e r i n s t a l l E C M u s i n g t h e s y s t e m p a c k a g e m a n a g e r o r c l o n e s u b m o d u l e s \ n "
" S u b m o d u l e s c a n b e c l o n e d w i t h ' g i t s u b m o d u l e u p d a t e - - i n i t - - r e c u r s i v e ' " )
endif ( )
else ( )
set ( CMAKE_MODULE_PATH "${ECM_MODULE_PATH};${CMAKE_MODULE_PATH}" )
endif ( )
2022-06-14 20:42:44 +01:00
include ( CTest )
include ( ECMAddTests )
2022-09-11 21:25:18 +01:00
if ( BUILD_TESTING )
2022-06-12 00:46:30 +01:00
enable_testing ( )
endif ( )
2018-01-22 03:28:07 +00:00
##################################### Set Application options #####################################
2022-02-10 11:55:07 +00:00
######## Set URLs ########
2022-10-19 22:03:18 +01:00
set ( Launcher_NEWS_RSS_URL "https://prismlauncher.org/feed/feed.xml" CACHE STRING "URL to fetch Prism Launcher's news RSS feed from." )
2022-10-18 08:01:48 +01:00
set ( Launcher_NEWS_OPEN_URL "https://prismlauncher.org/news" CACHE STRING "URL that gets opened when the user clicks 'More News'" )
set ( Launcher_HELP_URL "https://prismlauncher.org/wiki/help-pages/%1" CACHE STRING "URL (with arg %1 to be substituted with page-id) that gets opened when the user requests help" )
2022-02-10 11:55:07 +00:00
2018-01-22 03:28:07 +00:00
######## Set version numbers ########
2023-06-14 17:45:08 +01:00
set ( Launcher_VERSION_MAJOR 8 )
2022-07-23 13:20:52 +01:00
set ( Launcher_VERSION_MINOR 0 )
2018-01-22 03:28:07 +00:00
2022-07-23 13:20:52 +01:00
set ( Launcher_VERSION_NAME "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}" )
set ( Launcher_VERSION_NAME4 "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.0.0" )
set ( Launcher_VERSION_NAME4_COMMA "${Launcher_VERSION_MAJOR},${Launcher_VERSION_MINOR},0,0" )
2018-01-22 03:28:07 +00:00
# Build platform.
2023-06-26 10:55:48 +01:00
set ( Launcher_BUILD_PLATFORM "unknown" CACHE STRING "A short string identifying the platform that this build was built for. Only used to display in the about dialog." )
2018-01-22 03:28:07 +00:00
# Channel list URL
2021-10-13 00:59:25 +01:00
set ( Launcher_UPDATER_BASE "" CACHE STRING "Base URL for the updater." )
2018-01-22 03:28:07 +00:00
2020-07-18 15:18:02 +01:00
# The metadata server
2022-10-18 08:01:48 +01:00
set ( Launcher_META_URL "https://meta.prismlauncher.org/v1/" CACHE STRING "URL to fetch Launcher's meta files from." )
2020-07-18 15:18:02 +01:00
2021-07-01 19:49:38 +01:00
# Imgur API Client ID
2021-10-13 00:59:25 +01:00
set ( Launcher_IMGUR_CLIENT_ID "5b97b0713fba4a3" CACHE STRING "Client ID you can get from Imgur when you register an application" )
2021-07-01 19:49:38 +01:00
2021-06-18 12:24:20 +01:00
# Bug tracker URL
2022-10-18 08:01:48 +01:00
set ( Launcher_BUG_TRACKER_URL "https://github.com/PrismLauncher/PrismLauncher/issues" CACHE STRING "URL for the bug tracker." )
2021-06-18 12:24:20 +01:00
2022-02-10 13:55:52 +00:00
# Translations Platform URL
2022-10-18 18:03:00 +01:00
set ( Launcher_TRANSLATIONS_URL "https://hosted.weblate.org/projects/prismlauncher/launcher/" CACHE STRING "URL for the translations platform." )
2022-02-10 13:55:52 +00:00
2022-03-08 17:41:23 +00:00
# Matrix Space
2023-05-19 17:34:54 +01:00
set ( Launcher_MATRIX_URL "https://prismlauncher.org/matrix" CACHE STRING "URL to the Matrix Space" )
2022-03-08 17:41:23 +00:00
2021-06-18 12:24:20 +01:00
# Discord URL
2023-05-19 17:34:54 +01:00
set ( Launcher_DISCORD_URL "https://prismlauncher.org/discord" CACHE STRING "URL for the Discord guild." )
2021-06-18 12:24:20 +01:00
# Subreddit URL
2023-05-19 17:34:54 +01:00
set ( Launcher_SUBREDDIT_URL "https://prismlauncher.org/reddit" CACHE STRING "URL for the subreddit." )
2021-06-18 12:24:20 +01:00
2022-01-24 21:55:57 +00:00
# Builds
2022-04-16 14:10:13 +01:00
set ( Launcher_FORCE_BUNDLED_LIBS OFF CACHE BOOL "Prevent using system libraries, if they are available as submodules" )
2023-03-08 10:03:50 +00:00
set ( Launcher_QT_VERSION_MAJOR "6" CACHE STRING "Major Qt version to build against" )
2022-01-24 21:55:57 +00:00
2022-05-28 11:07:01 +01:00
# API Keys
# NOTE: These API keys are here for convenience. If you rebrand this software or intend to break the terms of service
# of these platforms, please change these API keys beforehand.
# Be aware that if you were to use these API keys for malicious purposes they might get revoked, which might cause
# breakage to thousands of users.
# If you don't plan to use these features of this software, you can just remove these values.
# By using this key in your builds you accept the terms of use laid down in
# https://docs.microsoft.com/en-us/legal/microsoft-identity-platform/terms-of-use
2022-10-18 09:37:35 +01:00
set ( Launcher_MSA_CLIENT_ID "c36a9fb6-4f2a-41ff-90bd-ae7cc92031eb" CACHE STRING "Client ID you can get from Microsoft Identity Platform when you register an application" )
2022-05-28 11:07:01 +01:00
# By using this key in your builds you accept the terms and conditions laid down in
# https://support.curseforge.com/en/support/solutions/articles/9000207405-curse-forge-3rd-party-api-terms-and-conditions
# NOTE: CurseForge requires you to change this if you make any kind of derivative work.
2022-10-18 12:24:57 +01:00
# This key was issued specifically for Prism Launcher
set ( Launcher_CURSEFORGE_API_KEY "$2a$10$wuAJuNZuted3NORVmpgUC.m8sI.pv1tOPKZyBgLFGjxFp/br0lZCC" CACHE STRING "API key for the CurseForge platform" )
2022-05-28 11:07:01 +01:00
2022-01-24 21:55:57 +00:00
2018-01-22 03:28:07 +00:00
#### Check the current Git commit and branch
include ( GetGitRevisionDescription )
2022-06-17 20:55:55 +01:00
git_get_exact_tag ( Launcher_GIT_TAG )
2021-10-13 00:59:25 +01:00
get_git_head_revision ( Launcher_GIT_REFSPEC Launcher_GIT_COMMIT )
2018-01-22 03:28:07 +00:00
2021-10-13 00:59:25 +01:00
message ( STATUS "Git commit: ${Launcher_GIT_COMMIT}" )
2022-06-17 20:55:55 +01:00
message ( STATUS "Git tag: ${Launcher_GIT_TAG}" )
2021-10-13 00:59:25 +01:00
message ( STATUS "Git refspec: ${Launcher_GIT_REFSPEC}" )
2018-01-22 03:28:07 +00:00
2022-02-09 07:19:34 +00:00
string ( TIMESTAMP TODAY "%Y-%m-%d" )
2022-07-23 13:20:52 +01:00
set ( Launcher_BUILD_TIMESTAMP "${TODAY}" )
2018-01-22 03:28:07 +00:00
2018-01-27 22:53:10 +00:00
################################ 3rd Party Libs ################################
2023-01-08 18:12:14 +00:00
# Successive configurations of cmake without cleaning the build dir will cause zlib fallback to fail due to cached values
# Record when fallback triggered and skip this find_package
if ( NOT Launcher_FORCE_BUNDLED_LIBS AND NOT FORCE_BUNDLED_ZLIB )
2022-10-26 01:44:30 +01:00
find_package ( ZLIB QUIET )
endif ( )
2023-01-08 18:12:14 +00:00
if ( NOT ZLIB_FOUND )
set ( FORCE_BUNDLED_ZLIB TRUE CACHE BOOL "" )
mark_as_advanced ( FORCE_BUNDLED_ZLIB )
endif ( )
2022-10-26 01:44:30 +01:00
2018-01-27 22:53:10 +00:00
# Find the required Qt parts
2022-05-02 20:34:09 +01:00
include ( QtVersionlessBackport )
2022-01-27 11:52:12 +00:00
if ( Launcher_QT_VERSION_MAJOR EQUAL 5 )
set ( QT_VERSION_MAJOR 5 )
find_package ( Qt5 REQUIRED COMPONENTS Core Widgets Concurrent Network Test Xml )
if ( NOT Launcher_FORCE_BUNDLED_LIBS )
2022-05-23 22:27:35 +01:00
find_package ( QuaZip-Qt5 1.3 QUIET )
2022-01-27 11:52:12 +00:00
endif ( )
if ( NOT QuaZip-Qt5_FOUND )
set ( QUAZIP_QT_MAJOR_VERSION ${ QT_VERSION_MAJOR } CACHE STRING "Qt version to use (4, 5 or 6), defaults to ${QT_VERSION_MAJOR}" FORCE )
set ( FORCE_BUNDLED_QUAZIP 1 )
endif ( )
2022-07-03 16:15:37 +01:00
# Qt 6 sets these by default. Notably causes Windows APIs to use UNICODE strings.
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUNICODE -D_UNICODE" )
2022-05-02 20:34:09 +01:00
elseif ( Launcher_QT_VERSION_MAJOR EQUAL 6 )
set ( QT_VERSION_MAJOR 6 )
2022-11-25 03:54:15 +00:00
find_package ( Qt6 REQUIRED COMPONENTS Core CoreTools Widgets Concurrent Network Test Xml Core5Compat )
2022-05-02 20:34:09 +01:00
list ( APPEND Launcher_QT_LIBS Qt6::Core5Compat )
if ( NOT Launcher_FORCE_BUNDLED_LIBS )
find_package ( QuaZip-Qt6 1.3 QUIET )
endif ( )
if ( NOT QuaZip-Qt6_FOUND )
set ( QUAZIP_QT_MAJOR_VERSION ${ QT_VERSION_MAJOR } CACHE STRING "Qt version to use (4, 5 or 6), defaults to ${QT_VERSION_MAJOR}" FORCE )
set ( FORCE_BUNDLED_QUAZIP 1 )
endif ( )
2022-01-24 21:55:57 +00:00
else ( )
2022-01-27 11:52:12 +00:00
message ( FATAL_ERROR "Qt version ${Launcher_QT_VERSION_MAJOR} is not supported" )
2022-01-24 21:55:57 +00:00
endif ( )
2022-01-20 19:40:56 +00:00
2022-11-24 11:53:29 +00:00
if ( Launcher_QT_VERSION_MAJOR EQUAL 5 )
include ( ECMQueryQt )
ecm_query_qt ( QT_PLUGINS_DIR QT_INSTALL_PLUGINS )
ecm_query_qt ( QT_LIBS_DIR QT_INSTALL_LIBS )
ecm_query_qt ( QT_LIBEXECS_DIR QT_INSTALL_LIBEXECS )
else ( )
set ( QT_PLUGINS_DIR ${ QT${QT_VERSION_MAJOR } _INSTALL_PREFIX}/ ${ QT${QT_VERSION_MAJOR } _INSTALL_PLUGINS} )
set ( QT_LIBS_DIR ${ QT${QT_VERSION_MAJOR } _INSTALL_PREFIX}/ ${ QT${QT_VERSION_MAJOR } _INSTALL_LIBS} )
set ( QT_LIBEXECS_DIR ${ QT${QT_VERSION_MAJOR } _INSTALL_PREFIX}/ ${ QT${QT_VERSION_MAJOR } _INSTALL_LIBEXECS} )
endif ( )
2018-01-27 22:53:10 +00:00
2022-07-03 21:40:05 +01:00
# NOTE: Qt 6 already sets this by default
2018-01-27 22:53:10 +00:00
if ( Qt5_POSITION_INDEPENDENT_CODE )
SET ( CMAKE_POSITION_INDEPENDENT_CODE ON )
endif ( )
2022-09-26 12:43:26 +01:00
if ( NOT Launcher_FORCE_BUNDLED_LIBS )
2022-10-15 12:13:34 +01:00
# Find toml++
2022-09-26 12:43:26 +01:00
find_package ( tomlplusplus 3.2.0 QUIET )
2022-10-15 12:13:34 +01:00
# Find ghc_filesystem
find_package ( ghc_filesystem QUIET )
2023-01-07 13:57:13 +00:00
# Find cmark
find_package ( cmark QUIET )
2022-10-15 12:13:34 +01:00
endif ( )
2022-10-14 15:45:13 +01:00
2022-12-27 16:23:44 +00:00
include ( ECMQtDeclareLoggingCategory )
2022-01-09 18:34:01 +00:00
####################################### Program Info #######################################
2021-10-13 00:59:25 +01:00
2022-10-18 08:01:48 +01:00
set ( Launcher_APP_BINARY_NAME "prismlauncher" CACHE STRING "Name of the Launcher binary" )
2021-12-20 02:41:08 +00:00
add_subdirectory ( program_info )
2021-10-13 00:59:25 +01:00
2018-01-22 03:28:07 +00:00
####################################### Install layout #######################################
2023-07-27 08:37:56 +01:00
set ( Launcher_ENABLE_UPDATER NO )
2022-03-23 13:38:58 +00:00
if ( NOT ( UNIX AND APPLE ) )
# Install "portable.txt" if selected component is "portable"
2022-03-23 13:42:56 +00:00
install ( FILES "${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_Portable_File}" DESTINATION "." COMPONENT portable EXCLUDE_FROM_ALL )
2022-03-23 13:38:58 +00:00
endif ( )
2018-01-22 03:28:07 +00:00
2022-02-12 03:46:22 +00:00
if ( UNIX AND APPLE )
2021-10-13 00:59:25 +01:00
set ( BINARY_DEST_DIR "${Launcher_Name}.app/Contents/MacOS" )
set ( LIBRARY_DEST_DIR "${Launcher_Name}.app/Contents/MacOS" )
set ( PLUGIN_DEST_DIR "${Launcher_Name}.app/Contents/MacOS" )
2022-05-15 18:56:58 +01:00
set ( FRAMEWORK_DEST_DIR "${Launcher_Name}.app/Contents/Frameworks" )
2021-10-13 00:59:25 +01:00
set ( RESOURCES_DEST_DIR "${Launcher_Name}.app/Contents/Resources" )
set ( JARS_DEST_DIR "${Launcher_Name}.app/Contents/MacOS/jars" )
2018-01-22 03:28:07 +00:00
2018-07-15 13:51:05 +01:00
# Apps to bundle
2021-10-13 00:59:25 +01:00
set ( APPS "\${CMAKE_INSTALL_PREFIX}/${Launcher_Name}.app" )
2018-01-22 03:28:07 +00:00
2018-07-15 13:51:05 +01:00
# Mac bundle settings
2022-10-22 14:00:52 +01:00
set ( MACOSX_BUNDLE_BUNDLE_NAME "${Launcher_DisplayName}" )
set ( MACOSX_BUNDLE_INFO_STRING "${Launcher_DisplayName}: A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once." )
2022-10-18 08:01:48 +01:00
set ( MACOSX_BUNDLE_GUI_IDENTIFIER "org.prismlauncher.${Launcher_Name}" )
2022-07-23 13:20:52 +01:00
set ( MACOSX_BUNDLE_BUNDLE_VERSION "${Launcher_VERSION_NAME}" )
set ( MACOSX_BUNDLE_SHORT_VERSION_STRING "${Launcher_VERSION_NAME}" )
set ( MACOSX_BUNDLE_LONG_VERSION_STRING "${Launcher_VERSION_NAME}" )
2021-10-13 00:59:25 +01:00
set ( MACOSX_BUNDLE_ICON_FILE ${ Launcher_Name } .icns )
2023-08-02 10:35:54 +01:00
set ( MACOSX_BUNDLE_COPYRIGHT "© 2022-2023 ${Launcher_Copyright_Mac}" )
2023-07-26 22:27:52 +01:00
set ( MACOSX_SPARKLE_UPDATE_PUBLIC_KEY "v55ZWWD6QlPoXGV6VLzOTZxZUggWeE51X8cRQyQh6vA=" CACHE STRING "Public key for Sparkle update feed" )
set ( MACOSX_SPARKLE_UPDATE_FEED_URL "https://prismlauncher.org/feed/appcast.xml" CACHE STRING "URL for Sparkle update feed" )
2018-01-22 03:28:07 +00:00
2022-05-15 18:56:58 +01:00
set ( MACOSX_SPARKLE_DOWNLOAD_URL "https://github.com/sparkle-project/Sparkle/releases/download/2.1.0/Sparkle-2.1.0.tar.xz" CACHE STRING "URL to Sparkle release archive" )
set ( MACOSX_SPARKLE_SHA256 "bf6ac1caa9f8d321d5784859c88da874f28412f37fb327bc21b7b14c5d61ef94" CACHE STRING "SHA256 checksum for Sparkle release archive" )
set ( MACOSX_SPARKLE_DIR "${CMAKE_BINARY_DIR}/frameworks/Sparkle" )
2018-07-15 13:51:05 +01:00
# directories to look for dependencies
2022-05-15 18:56:58 +01:00
set ( DIRS ${ QT_LIBS_DIR } ${ QT_LIBEXECS_DIR } ${ CMAKE_LIBRARY_OUTPUT_DIRECTORY } ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY } ${ MACOSX_SPARKLE_DIR } )
2018-01-22 03:28:07 +00:00
2023-07-27 08:37:56 +01:00
if ( NOT MACOSX_SPARKLE_UPDATE_PUBLIC_KEY STREQUAL "" AND NOT MACOSX_SPARKLE_UPDATE_FEED_URL STREQUAL "" )
set ( Launcher_ENABLE_UPDATER YES )
endif ( )
2018-07-15 13:51:05 +01:00
# install as bundle
2023-07-27 00:03:14 +01:00
set ( INSTALL_BUNDLE "full" CACHE STRING "Use fixup_bundle to bundle dependencies" )
2018-01-22 03:28:07 +00:00
2018-07-15 13:51:05 +01:00
# Add the icon
2021-11-25 23:14:28 +00:00
install ( FILES ${ Launcher_Branding_ICNS } DESTINATION ${ RESOURCES_DEST_DIR } RENAME ${ Launcher_Name } .icns )
2018-01-22 03:28:07 +00:00
2022-02-12 03:46:22 +00:00
elseif ( UNIX )
2022-11-04 17:29:19 +00:00
include ( KDEInstallDirs )
2018-07-15 13:51:05 +01:00
set ( BINARY_DEST_DIR "bin" )
2022-03-23 12:20:14 +00:00
set ( LIBRARY_DEST_DIR "lib${LIB_SUFFIX}" )
2023-07-14 03:56:36 +01:00
set ( JARS_DEST_DIR "share/${Launcher_Name}" )
2021-12-30 16:53:17 +00:00
# install as bundle with no dependencies included
2023-07-27 00:03:14 +01:00
set ( INSTALL_BUNDLE "nodeps" CACHE STRING "Use fixup_bundle to bundle dependencies" )
2021-12-17 17:52:13 +00:00
2022-02-12 03:46:22 +00:00
# Set RPATH
SET ( Launcher_BINARY_RPATH "$ORIGIN/" )
2022-11-04 17:29:19 +00:00
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } / ${ Launcher_Desktop } DESTINATION ${ KDE_INSTALL_APPDIR } )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } / ${ Launcher_MetaInfo } DESTINATION ${ KDE_INSTALL_METAINFODIR } )
2022-11-05 09:42:44 +00:00
install ( FILES ${ CMAKE_CURRENT_SOURCE_DIR } / ${ Launcher_SVG } DESTINATION "${KDE_INSTALL_ICONDIR}/hicolor/scalable/apps" )
2022-11-04 17:29:19 +00:00
install ( FILES ${ CMAKE_CURRENT_SOURCE_DIR } / ${ Launcher_mrpack_MIMEInfo } DESTINATION ${ KDE_INSTALL_MIMEDIR } )
2022-06-26 18:36:48 +01:00
2023-07-14 03:56:36 +01:00
install ( FILES "${CMAKE_CURRENT_SOURCE_DIR}/launcher/qtlogging.ini" DESTINATION "share/${Launcher_Name}" )
2023-04-03 23:14:24 +01:00
2022-06-26 18:36:48 +01:00
if ( Launcher_ManPage )
2022-11-04 22:43:18 +00:00
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } / ${ Launcher_ManPage } DESTINATION "${KDE_INSTALL_MANDIR}/man6" )
2022-06-26 18:36:48 +01:00
endif ( )
2022-03-23 12:20:14 +00:00
# Install basic runner script if component "portable" is selected
configure_file ( launcher/Launcher.in "${CMAKE_CURRENT_BINARY_DIR}/LauncherScript" @ONLY )
2022-03-23 13:42:56 +00:00
install ( PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/LauncherScript" DESTINATION "." RENAME ${ Launcher_Name } COMPONENT portable EXCLUDE_FROM_ALL )
2022-03-23 12:20:14 +00:00
2022-02-12 03:46:22 +00:00
elseif ( WIN32 )
2018-07-15 13:51:05 +01:00
set ( BINARY_DEST_DIR "." )
set ( LIBRARY_DEST_DIR "." )
set ( PLUGIN_DEST_DIR "." )
set ( RESOURCES_DEST_DIR "." )
set ( JARS_DEST_DIR "jars" )
2018-01-22 03:28:07 +00:00
2018-07-15 13:51:05 +01:00
# Apps to bundle
2021-10-13 00:59:25 +01:00
set ( APPS "\${CMAKE_INSTALL_PREFIX}/${Launcher_Name}.exe" )
2018-01-22 03:28:07 +00:00
2018-07-15 13:51:05 +01:00
# directories to look for dependencies
set ( DIRS ${ QT_LIBS_DIR } ${ QT_LIBEXECS_DIR } ${ CMAKE_LIBRARY_OUTPUT_DIRECTORY } ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY } )
2018-01-22 03:28:07 +00:00
2018-07-15 13:51:05 +01:00
# install as bundle
2023-07-27 00:03:14 +01:00
set ( INSTALL_BUNDLE "full" CACHE STRING "Use fixup_bundle to bundle dependencies" )
2018-01-22 03:28:07 +00:00
else ( )
2022-02-12 03:46:22 +00:00
message ( FATAL_ERROR "Platform not supported" )
2018-01-22 03:28:07 +00:00
endif ( )
2023-04-03 23:14:24 +01:00
2014-01-08 00:27:40 +00:00
################################ Included Libs ################################
2015-02-12 21:01:20 +00:00
include ( ExternalProject )
set_directory_properties ( PROPERTIES EP_BASE External )
2022-02-07 14:44:46 +00:00
option ( NBT_BUILD_SHARED "Build NBT shared library" OFF )
2015-09-28 20:20:27 +01:00
option ( NBT_USE_ZLIB "Build NBT library with zlib support" OFF )
option ( NBT_BUILD_TESTS "Build NBT library tests" OFF ) #FIXME: fix unit tests.
2016-04-10 14:53:05 +01:00
add_subdirectory ( libraries/libnbtplusplus )
2014-01-08 00:27:40 +00:00
2017-01-01 18:59:46 +00:00
add_subdirectory ( libraries/systeminfo ) # system information library
2016-04-10 14:53:05 +01:00
add_subdirectory ( libraries/launcher ) # java based launcher part for Minecraft
add_subdirectory ( libraries/javacheck ) # java compatibility checker
2023-01-08 18:12:14 +00:00
if ( FORCE_BUNDLED_ZLIB )
2022-10-26 01:44:30 +01:00
message ( STATUS "Using bundled zlib" )
2023-01-08 18:12:14 +00:00
2022-10-31 01:14:25 +00:00
set ( CMAKE_POLICY_DEFAULT_CMP0069 NEW ) # Suppress cmake warnings and allow INTERPROCEDURAL_OPTIMIZATION for zlib
2022-10-26 01:44:30 +01:00
set ( SKIP_INSTALL_ALL ON )
add_subdirectory ( libraries/zlib EXCLUDE_FROM_ALL )
2023-01-23 19:03:12 +00:00
# On OS where unistd.h exists, zlib's generated header defines `Z_HAVE_UNISTD_H`, while the included header does not.
# We cannot safely undo the rename on those systems, and they generally have packages for zlib anyway.
check_include_file ( unistd.h NEED_GENERATED_ZCONF )
if ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libraries/zlib/zconf.h.included" AND NOT NEED_GENERATED_ZCONF )
# zlib's cmake script renames a file, dirtying the submodule, see https://github.com/madler/zlib/issues/162
message ( STATUS "Undoing Rename" )
message ( STATUS " ${CMAKE_CURRENT_SOURCE_DIR}/libraries/zlib/zconf.h" )
file ( RENAME "${CMAKE_CURRENT_SOURCE_DIR}/libraries/zlib/zconf.h.included" "${CMAKE_CURRENT_SOURCE_DIR}/libraries/zlib/zconf.h" )
endif ( )
set ( ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/libraries/zlib" "${CMAKE_CURRENT_SOURCE_DIR}/libraries/zlib" CACHE STRING "" FORCE )
2022-10-26 01:44:30 +01:00
set_target_properties ( zlibstatic PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIR}" )
add_library ( ZLIB::ZLIB ALIAS zlibstatic )
2022-11-22 19:17:16 +00:00
set ( ZLIB_LIBRARY ZLIB::ZLIB CACHE STRING "zlib library name" )
2022-10-26 01:44:30 +01:00
find_package ( ZLIB REQUIRED )
else ( )
message ( STATUS "Using system zlib" )
endif ( )
2022-01-27 11:52:12 +00:00
if ( FORCE_BUNDLED_QUAZIP )
message ( STATUS "Using bundled QuaZip" )
2022-02-04 12:24:13 +00:00
set ( BUILD_SHARED_LIBS 0 ) # link statically to avoid conflicts.
set ( QUAZIP_INSTALL 0 )
2022-01-24 21:55:57 +00:00
add_subdirectory ( libraries/quazip ) # zip manipulation library
2022-04-16 15:23:42 +01:00
else ( )
message ( STATUS "Using system QuaZip" )
2022-01-24 21:55:57 +00:00
endif ( )
2016-04-10 14:53:05 +01:00
add_subdirectory ( libraries/rainbow ) # Qt extension for colors
2016-10-30 01:37:38 +00:00
add_subdirectory ( libraries/LocalPeer ) # fork of a library from Qt solutions
2022-09-24 22:20:01 +01:00
if ( NOT tomlplusplus_FOUND )
message ( STATUS "Using bundled tomlplusplus" )
add_subdirectory ( libraries/tomlplusplus ) # toml parser
else ( )
message ( STATUS "Using system tomlplusplus" )
endif ( )
2023-01-07 13:57:13 +00:00
if ( NOT cmark_FOUND )
message ( STATUS "Using bundled cmark" )
set ( CMARK_STATIC ON CACHE BOOL "Build static libcmark library" FORCE )
set ( CMARK_SHARED OFF CACHE BOOL "Build shared libcmark library" FORCE )
set ( CMARK_TESTS OFF CACHE BOOL "Build cmark tests and enable testing" FORCE )
add_subdirectory ( libraries/cmark EXCLUDE_FROM_ALL ) # Markdown parser
add_library ( cmark::cmark ALIAS cmark_static )
else ( )
message ( STATUS "Using system cmark" )
endif ( )
2021-07-22 19:15:20 +01:00
add_subdirectory ( libraries/katabasis ) # An OAuth2 library that tried to do too much
2022-06-29 21:37:25 +01:00
add_subdirectory ( libraries/gamemode )
2022-06-03 23:02:11 +01:00
add_subdirectory ( libraries/murmur2 ) # Hash for usage with the CurseForge API
2022-10-15 12:13:34 +01:00
if ( NOT ghc_filesystem_FOUND )
message ( STATUS "Using bundled ghc_filesystem" )
add_subdirectory ( libraries/filesystem ) # Implementation of std::filesystem for old C++, for usage in old macOS
else ( )
message ( STATUS "Using system ghc_filesystem" )
endif ( )
2023-02-12 22:23:15 +00:00
add_subdirectory ( libraries/qdcss ) # css parser
2015-03-01 21:20:57 +00:00
2015-02-11 18:56:06 +00:00
############################### Built Artifacts ###############################
2020-07-18 15:18:02 +01:00
add_subdirectory ( buildconfig )
2018-01-22 03:28:07 +00:00
2022-09-11 21:25:18 +01:00
if ( BUILD_TESTING )
add_subdirectory ( tests )
endif ( )
2018-01-22 03:28:07 +00:00
# NOTE: this must always be last to appease the CMake deity of quirky install command evaluation order.
2021-07-25 18:11:59 +01:00
add_subdirectory ( launcher )