2022-03-19 22:38:28 +05:30
cmake_minimum_required ( VERSION 3.9.4 )
2013-09-26 17:19:58 +05:30
2021-11-03 20:15:42 +05:30
if ( WIN32 )
# In Qt 5.1+ we have our own main() function, don't autolink to qtmain on Windows
cmake_policy ( SET CMP0020 OLD )
endif ( )
project ( Launcher )
2022-03-24 00:18:03 +05:30
include ( CTest )
2021-11-03 20:15:42 +05:30
2014-04-06 21:42:48 +05:30
string ( COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BUILD_DIR}" IS_IN_SOURCE_BUILD )
if ( IS_IN_SOURCE_BUILD )
2021-10-13 05:29:25 +05:30
message ( FATAL_ERROR "You are building the Launcher in-source. Please separate the build tree from the source tree." )
2020-05-29 02:47:50 +05:30
endif ( )
2018-01-22 08:58:07 +05:30
##################################### Set CMake options #####################################
2014-04-06 23:13:09 +05:30
set ( CMAKE_AUTOMOC ON )
2022-01-01 03:06:59 +05:30
set ( CMAKE_AUTORCC ON )
2014-04-06 23:13:09 +05:30
set ( CMAKE_INCLUDE_CURRENT_DIR ON )
2013-01-11 06:55:40 +05:30
2014-04-06 23:13:09 +05:30
set ( CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/" )
2015-09-29 00:23:46 +05:30
2016-05-01 07:19:46 +05:30
# 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 18:21:05 +05:30
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ PROJECT_BINARY_DIR } )
2016-05-01 07:19:46 +05:30
endif ( )
2016-03-13 05:14:37 +05:30
set ( CMAKE_JAVA_TARGET_OUTPUT_DIR ${ PROJECT_BINARY_DIR } /jars )
2014-01-11 06:36:22 +05:30
2013-02-22 00:05:33 +05:30
######## Set compiler flags ########
2015-09-29 00:23:46 +05:30
set ( CMAKE_CXX_STANDARD_REQUIRED true )
set ( CMAKE_C_STANDARD_REQUIRED true )
2016-01-09 06:09:51 +05:30
set ( CMAKE_CXX_STANDARD 11 )
2015-09-29 00:23:46 +05:30
set ( CMAKE_C_STANDARD 11 )
2015-09-05 22:16:57 +05:30
include ( GenerateExportHeader )
2019-07-03 04:41:18 +05:30
set ( CMAKE_CXX_FLAGS " -Wall -pedantic -Werror -Wno-deprecated-declarations -D_GLIBCXX_USE_CXX11_ABI=0 -fstack-protector-strong --param=ssp-buffer-size=4 -O3 -D_FORTIFY_SOURCE=2 ${CMAKE_CXX_FLAGS}" )
2016-02-19 05:27:46 +05:30
if ( UNIX AND APPLE )
2018-07-15 18:21:05 +05:30
set ( CMAKE_CXX_FLAGS " -stdlib=libc++ ${CMAKE_CXX_FLAGS}" )
2016-02-19 05:27:46 +05:30
endif ( )
2015-10-11 23:36:46 +05:30
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Werror=return-type" )
2013-02-21 22:02:13 +05:30
2021-12-12 06:05:46 +05:30
# Fix build with Qt 5.13
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DQT_NO_DEPRECATED_WARNINGS=Y" )
2022-03-23 14:35:31 +05:30
option ( ENABLE_LTO "Enable Link Time Optimization" off )
if ( ENABLE_LTO )
include ( CheckIPOSupported )
check_ipo_supported ( RESULT ipo_supported OUTPUT ipo_error )
if ( ipo_supported AND ( CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" ) )
message ( STATUS "IPO / LTO enabled" )
set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE )
elseif ( ipo_supported )
message ( STATUS "Not enabling IPO / LTO on debug builds" )
else ( )
message ( STATUS "IPO / LTO not supported: <${ipo_error}>" )
endif ( )
2022-03-19 22:38:28 +05:30
endif ( )
2018-01-22 08:58:07 +05:30
##################################### Set Application options #####################################
2022-02-10 17:25:07 +05:30
######## Set URLs ########
2022-03-06 16:02:06 +05:30
set ( Launcher_NEWS_RSS_URL "https://polymc.org/feed/feed.xml" CACHE STRING "URL to fetch PolyMC's news RSS feed from." )
set ( Launcher_NEWS_OPEN_URL "https://polymc.org/news" CACHE STRING "URL that gets opened when the user clicks 'More News'" )
2022-04-15 14:37:42 +05:30
set ( Launcher_HELP_URL "https://polymc.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 17:25:07 +05:30
2018-01-22 08:58:07 +05:30
######## Set version numbers ########
2022-01-04 04:16:05 +05:30
set ( Launcher_VERSION_MAJOR 1 )
2022-03-06 16:10:11 +05:30
set ( Launcher_VERSION_MINOR 1 )
2022-03-20 19:41:43 +05:30
set ( Launcher_VERSION_HOTFIX 1 )
2018-01-22 08:58:07 +05:30
# Build number
2021-10-13 05:29:25 +05:30
set ( Launcher_VERSION_BUILD -1 CACHE STRING "Build number. -1 for no build number." )
2018-01-22 08:58:07 +05:30
# Build platform.
2022-02-21 05:53:08 +05:30
set ( Launcher_BUILD_PLATFORM "" 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 08:58:07 +05:30
# Channel list URL
2021-10-13 05:29:25 +05:30
set ( Launcher_UPDATER_BASE "" CACHE STRING "Base URL for the updater." )
2018-01-22 08:58:07 +05:30
2020-07-18 19:48:02 +05:30
# The metadata server
2022-01-28 03:28:28 +05:30
set ( Launcher_META_URL "https://meta.polymc.org/v1/" CACHE STRING "URL to fetch Launcher's meta files from." )
2020-07-18 19:48:02 +05:30
2021-07-02 00:19:38 +05:30
# Imgur API Client ID
2021-10-13 05:29:25 +05:30
set ( Launcher_IMGUR_CLIENT_ID "5b97b0713fba4a3" CACHE STRING "Client ID you can get from Imgur when you register an application" )
2021-07-02 00:19:38 +05:30
2021-12-20 08:11:08 +05:30
# MSA Client ID
2022-02-16 21:33:13 +05:30
set ( Launcher_MSA_CLIENT_ID "549033b2-1532-4d4e-ae77-1bbaa46f9d74" CACHE STRING "Client ID you can get from Microsoft Identity Platform when you register an application" )
2018-01-22 08:58:07 +05:30
2021-06-18 16:54:20 +05:30
# Bug tracker URL
2021-12-20 08:11:08 +05:30
set ( Launcher_BUG_TRACKER_URL "https://github.com/PolyMC/PolyMC/issues" CACHE STRING "URL for the bug tracker." )
2021-06-18 16:54:20 +05:30
2022-02-10 19:25:52 +05:30
# Translations Platform URL
set ( Launcher_TRANSLATIONS_URL "https://hosted.weblate.org/projects/polymc/polymc/" CACHE STRING "URL for the translations platform." )
2022-03-08 23:11:23 +05:30
# Matrix Space
2022-04-03 16:09:44 +05:30
set ( Launcher_MATRIX_URL "https://matrix.to/#/#polymc:matrix.org" CACHE STRING "URL to the Matrix Space" )
2022-03-08 23:11:23 +05:30
2021-06-18 16:54:20 +05:30
# Discord URL
2022-01-10 00:21:46 +05:30
set ( Launcher_DISCORD_URL "https://discord.gg/Z52pwxWCHP" CACHE STRING "URL for the Discord guild." )
2021-06-18 16:54:20 +05:30
2022-03-08 23:11:23 +05:30
2021-06-18 16:54:20 +05:30
# Subreddit URL
2022-04-03 16:09:44 +05:30
set ( Launcher_SUBREDDIT_URL "https://www.reddit.com/r/PolyMCLauncher/" CACHE STRING "URL for the subreddit." )
2021-06-18 16:54:20 +05:30
2022-01-25 03:25:57 +05:30
# Builds
2022-01-27 17:22:58 +05:30
# TODO: Launcher_FORCE_BUNDLED_LIBS should be off in the future, but as of QuaZip 1.2, we can't do that yet.
set ( Launcher_FORCE_BUNDLED_LIBS ON CACHE BOOL "Prevent using system libraries, if they are available as submodules" )
2022-01-25 03:25:57 +05:30
set ( Launcher_QT_VERSION_MAJOR "5" CACHE STRING "Major Qt version to build against" )
2018-01-22 08:58:07 +05:30
#### Check the current Git commit and branch
include ( GetGitRevisionDescription )
2021-10-13 05:29:25 +05:30
get_git_head_revision ( Launcher_GIT_REFSPEC Launcher_GIT_COMMIT )
2018-01-22 08:58:07 +05:30
2021-10-13 05:29:25 +05:30
message ( STATUS "Git commit: ${Launcher_GIT_COMMIT}" )
message ( STATUS "Git refspec: ${Launcher_GIT_REFSPEC}" )
2018-01-22 08:58:07 +05:30
2021-10-13 05:29:25 +05:30
set ( Launcher_RELEASE_VERSION_NAME "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.${Launcher_VERSION_HOTFIX}" )
2022-02-09 12:49:34 +05:30
string ( TIMESTAMP TODAY "%Y-%m-%d" )
set ( Launcher_RELEASE_TIMESTAMP "${TODAY}" )
2018-01-22 08:58:07 +05:30
#### Custom target to just print the version.
2021-10-13 05:29:25 +05:30
add_custom_target ( version echo "Version: ${Launcher_RELEASE_VERSION_NAME}" )
add_custom_target ( tcversion echo "\\#\\#teamcity[setParameter name=\\'env.LAUNCHER_VERSION\\' value=\\'${Launcher_RELEASE_VERSION_NAME}\\']" )
2018-01-22 08:58:07 +05:30
2018-01-28 04:23:10 +05:30
################################ 3rd Party Libs ################################
# Find the required Qt parts
2022-01-27 17:22:12 +05:30
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 )
find_package ( QuaZip-Qt5 REQUIRED )
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-01-25 03:25:57 +05:30
else ( )
2022-01-27 17:22:12 +05:30
message ( FATAL_ERROR "Qt version ${Launcher_QT_VERSION_MAJOR} is not supported" )
2022-01-25 03:25:57 +05:30
endif ( )
2022-01-21 01:10:56 +05:30
2018-01-28 04:23:10 +05:30
# The Qt5 cmake files don't provide its install paths, so ask qmake.
include ( QMakeQuery )
query_qmake ( QT_INSTALL_PLUGINS QT_PLUGINS_DIR )
query_qmake ( QT_INSTALL_IMPORTS QT_IMPORTS_DIR )
query_qmake ( QT_INSTALL_LIBS QT_LIBS_DIR )
query_qmake ( QT_INSTALL_LIBEXECS QT_LIBEXECS_DIR )
query_qmake ( QT_HOST_DATA QT_DATA_DIR )
set ( QT_MKSPECS_DIR ${ QT_DATA_DIR } /mkspecs )
if ( Qt5_POSITION_INDEPENDENT_CODE )
SET ( CMAKE_POSITION_INDEPENDENT_CODE ON )
endif ( )
2022-01-10 00:04:01 +05:30
####################################### Program Info #######################################
2021-10-13 05:29:25 +05:30
2022-01-10 00:04:01 +05:30
set ( Launcher_APP_BINARY_NAME "polymc" CACHE STRING "Name of the Launcher binary" )
2021-12-20 08:11:08 +05:30
add_subdirectory ( program_info )
2021-10-13 05:29:25 +05:30
2018-01-22 08:58:07 +05:30
####################################### Install layout #######################################
2022-03-23 19:08:58 +05:30
if ( NOT ( UNIX AND APPLE ) )
# Install "portable.txt" if selected component is "portable"
2022-03-23 19:12:56 +05:30
install ( FILES "${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_Portable_File}" DESTINATION "." COMPONENT portable EXCLUDE_FROM_ALL )
2022-03-23 19:08:58 +05:30
endif ( )
2018-01-22 08:58:07 +05:30
2022-02-12 09:16:22 +05:30
if ( UNIX AND APPLE )
2021-10-13 05:29:25 +05:30
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" )
set ( RESOURCES_DEST_DIR "${Launcher_Name}.app/Contents/Resources" )
set ( JARS_DEST_DIR "${Launcher_Name}.app/Contents/MacOS/jars" )
2018-01-22 08:58:07 +05:30
2018-07-15 18:21:05 +05:30
# Apps to bundle
2021-10-13 05:29:25 +05:30
set ( APPS "\${CMAKE_INSTALL_PREFIX}/${Launcher_Name}.app" )
2018-01-22 08:58:07 +05:30
2018-07-15 18:21:05 +05:30
# Mac bundle settings
2021-10-13 05:29:25 +05:30
set ( MACOSX_BUNDLE_BUNDLE_NAME "${Launcher_Name}" )
2022-03-13 22:27:25 +05:30
set ( MACOSX_BUNDLE_INFO_STRING "${Launcher_Name}: A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once." )
2022-02-16 20:15:16 +05:30
set ( MACOSX_BUNDLE_GUI_IDENTIFIER "org.polymc.${Launcher_Name}" )
2021-10-13 05:29:25 +05:30
set ( MACOSX_BUNDLE_BUNDLE_VERSION "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.${Launcher_VERSION_HOTFIX}.${Launcher_VERSION_BUILD}" )
set ( MACOSX_BUNDLE_SHORT_VERSION_STRING "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.${Launcher_VERSION_HOTFIX}.${Launcher_VERSION_BUILD}" )
set ( MACOSX_BUNDLE_LONG_VERSION_STRING "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.${Launcher_VERSION_HOTFIX}.${Launcher_VERSION_BUILD}" )
set ( MACOSX_BUNDLE_ICON_FILE ${ Launcher_Name } .icns )
2022-03-13 22:27:25 +05:30
set ( MACOSX_BUNDLE_COPYRIGHT "Copyright 2021-2022 ${Launcher_Copyright}" )
2018-01-22 08:58:07 +05:30
2018-07-15 18:21:05 +05:30
# directories to look for dependencies
set ( DIRS ${ QT_LIBS_DIR } ${ QT_LIBEXECS_DIR } ${ CMAKE_LIBRARY_OUTPUT_DIRECTORY } ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY } )
2018-01-22 08:58:07 +05:30
2018-07-15 18:21:05 +05:30
# install as bundle
set ( INSTALL_BUNDLE "full" )
2018-01-22 08:58:07 +05:30
2018-07-15 18:21:05 +05:30
# Add the icon
2021-11-26 04:44:28 +05:30
install ( FILES ${ Launcher_Branding_ICNS } DESTINATION ${ RESOURCES_DEST_DIR } RENAME ${ Launcher_Name } .icns )
2018-01-22 08:58:07 +05:30
2022-02-12 09:16:22 +05:30
elseif ( UNIX )
2018-07-15 18:21:05 +05:30
set ( BINARY_DEST_DIR "bin" )
2022-03-23 17:50:14 +05:30
set ( LIBRARY_DEST_DIR "lib${LIB_SUFFIX}" )
set ( JARS_DEST_DIR "share/jars" )
set ( LAUNCHER_DESKTOP_DEST_DIR "share/applications" CACHE STRING "Path to the desktop file directory" )
set ( LAUNCHER_METAINFO_DEST_DIR "share/metainfo" CACHE STRING "Path to the metainfo directory" )
set ( LAUNCHER_ICON_DEST_DIR "share/icons/hicolor/scalable/apps" CACHE STRING "Path to the scalable icon directory" )
set ( LAUNCHER_MAN_DEST_DIR "share/man/man6" CACHE STRING "Path to the man page directory" )
2021-12-30 22:23:17 +05:30
# install as bundle with no dependencies included
set ( INSTALL_BUNDLE "nodeps" )
2021-12-17 23:22:13 +05:30
2022-02-12 09:16:22 +05:30
# Set RPATH
SET ( Launcher_BINARY_RPATH "$ORIGIN/" )
2022-03-23 17:50:14 +05:30
# jars path is determined on runtime, relative to "Application root path", generally /usr or the root of the portable bundle
set ( Launcher_APP_BINARY_DEFS "-DLAUNCHER_JARS_LOCATION=${JARS_DEST_DIR}" )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } / ${ Launcher_Desktop } DESTINATION ${ LAUNCHER_DESKTOP_DEST_DIR } )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } / ${ Launcher_MetaInfo } DESTINATION ${ LAUNCHER_METAINFO_DEST_DIR } )
install ( FILES ${ CMAKE_CURRENT_SOURCE_DIR } / ${ Launcher_SVG } DESTINATION ${ LAUNCHER_ICON_DEST_DIR } )
install ( FILES ${ CMAKE_CURRENT_SOURCE_DIR } / ${ Launcher_ManPage } DESTINATION ${ LAUNCHER_MAN_DEST_DIR } RENAME "${Launcher_APP_BINARY_NAME}.6" )
# Install basic runner script if component "portable" is selected
configure_file ( launcher/Launcher.in "${CMAKE_CURRENT_BINARY_DIR}/LauncherScript" @ONLY )
2022-03-23 19:12:56 +05:30
install ( PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/LauncherScript" DESTINATION "." RENAME ${ Launcher_Name } COMPONENT portable EXCLUDE_FROM_ALL )
2022-03-23 17:50:14 +05:30
2022-02-12 09:16:22 +05:30
elseif ( WIN32 )
2018-07-15 18:21:05 +05:30
set ( BINARY_DEST_DIR "." )
set ( LIBRARY_DEST_DIR "." )
set ( PLUGIN_DEST_DIR "." )
set ( RESOURCES_DEST_DIR "." )
set ( JARS_DEST_DIR "jars" )
2018-01-22 08:58:07 +05:30
2018-07-15 18:21:05 +05:30
# Apps to bundle
2021-10-13 05:29:25 +05:30
set ( APPS "\${CMAKE_INSTALL_PREFIX}/${Launcher_Name}.exe" )
2018-01-22 08:58:07 +05:30
2018-07-15 18:21:05 +05:30
# directories to look for dependencies
set ( DIRS ${ QT_LIBS_DIR } ${ QT_LIBEXECS_DIR } ${ CMAKE_LIBRARY_OUTPUT_DIRECTORY } ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY } )
2018-01-22 08:58:07 +05:30
2018-07-15 18:21:05 +05:30
# install as bundle
set ( INSTALL_BUNDLE "full" )
2018-01-22 08:58:07 +05:30
else ( )
2022-02-12 09:16:22 +05:30
message ( FATAL_ERROR "Platform not supported" )
2018-01-22 08:58:07 +05:30
endif ( )
2014-01-08 05:57:40 +05:30
################################ Included Libs ################################
2015-02-13 02:31:20 +05:30
include ( ExternalProject )
set_directory_properties ( PROPERTIES EP_BASE External )
2022-02-07 20:14:46 +05:30
option ( NBT_BUILD_SHARED "Build NBT shared library" OFF )
2015-09-29 00:50:27 +05:30
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 19:23:05 +05:30
add_subdirectory ( libraries/libnbtplusplus )
2014-01-08 05:57:40 +05:30
2017-01-02 00:29:46 +05:30
add_subdirectory ( libraries/systeminfo ) # system information library
2016-04-10 19:23:05 +05:30
add_subdirectory ( libraries/hoedown ) # markdown parser
add_subdirectory ( libraries/launcher ) # java based launcher part for Minecraft
add_subdirectory ( libraries/javacheck ) # java compatibility checker
add_subdirectory ( libraries/xz-embedded ) # xz compression
2022-01-27 17:22:12 +05:30
if ( FORCE_BUNDLED_QUAZIP )
message ( STATUS "Using bundled QuaZip" )
2022-02-04 17:54:13 +05:30
set ( BUILD_SHARED_LIBS 0 ) # link statically to avoid conflicts.
set ( QUAZIP_INSTALL 0 )
2022-01-25 03:25:57 +05:30
add_subdirectory ( libraries/quazip ) # zip manipulation library
endif ( )
2016-04-10 19:23:05 +05:30
add_subdirectory ( libraries/rainbow ) # Qt extension for colors
add_subdirectory ( libraries/iconfix ) # fork of Qt's QIcon loader
2016-10-30 07:07:38 +05:30
add_subdirectory ( libraries/LocalPeer ) # fork of a library from Qt solutions
2021-12-29 21:07:09 +05:30
add_subdirectory ( libraries/classparser ) # class parser library
2021-02-06 20:28:03 +05:30
add_subdirectory ( libraries/optional-bare )
2021-04-17 22:16:11 +05:30
add_subdirectory ( libraries/tomlc99 ) # toml parser
2021-07-22 23:45:20 +05:30
add_subdirectory ( libraries/katabasis ) # An OAuth2 library that tried to do too much
2015-03-02 02:50:57 +05:30
2015-02-12 00:26:06 +05:30
############################### Built Artifacts ###############################
2020-07-18 19:48:02 +05:30
add_subdirectory ( buildconfig )
2018-01-22 08:58:07 +05:30
# NOTE: this must always be last to appease the CMake deity of quirky install command evaluation order.
2021-07-25 22:41:59 +05:30
add_subdirectory ( launcher )