2015-09-29 00:23:46 +05:30
cmake_minimum_required ( VERSION 3.1 )
2013-09-26 17:19:58 +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 )
2014-04-06 23:13:09 +05:30
message ( AUTHOR_WARNING "You are building MultiMC in-source. This is NOT recommended!" )
2014-04-06 21:42:48 +05:30
endif ( )
2014-04-06 23:13:09 +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 ( )
2013-09-26 17:19:58 +05:30
2015-09-29 00:23:46 +05:30
project ( MultiMC )
2013-12-14 18:47:59 +05:30
enable_testing ( )
2013-01-11 06:55:40 +05:30
2018-01-22 08:58:07 +05:30
##################################### Set CMake options #####################################
2014-04-06 23:13:09 +05:30
set ( CMAKE_AUTOMOC ON )
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 )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ PROJECT_BINARY_DIR } )
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 )
2016-01-09 06:09:51 +05:30
set ( CMAKE_CXX_FLAGS " -Wall -D_GLIBCXX_USE_CXX11_ABI=0 ${CMAKE_CXX_FLAGS}" )
2016-02-19 05:27:46 +05:30
if ( UNIX AND APPLE )
set ( CMAKE_CXX_FLAGS " -stdlib=libc++ ${CMAKE_CXX_FLAGS}" )
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
2018-01-22 08:58:07 +05:30
##################################### Set Application options #####################################
######## Set URLs ########
set ( MultiMC_NEWS_RSS_URL "http://multimc.org/rss.xml" CACHE STRING "URL to fetch MultiMC's news RSS feed from." )
######## Set version numbers ########
set ( MultiMC_VERSION_MAJOR 0 )
set ( MultiMC_VERSION_MINOR 6 )
set ( MultiMC_VERSION_HOTFIX 0 )
# Build number
set ( MultiMC_VERSION_BUILD -1 CACHE STRING "Build number. -1 for no build number." )
# Build platform.
set ( MultiMC_BUILD_PLATFORM "" CACHE STRING "A short string identifying the platform that this build was built for. Only used by the notification system and to display in the about dialog." )
# Channel list URL
set ( MultiMC_CHANLIST_URL "" CACHE STRING "URL for the channel list." )
# Notification URL
set ( MultiMC_NOTIFICATION_URL "" CACHE STRING "URL for checking for notifications." )
# paste.ee API key
set ( MultiMC_PASTE_EE_API_KEY "" CACHE STRING "API key you can get from paste.ee when you register an account" )
# Google analytics ID
set ( MultiMC_ANALYTICS_ID "" CACHE STRING "ID you can get from Google analytics" )
#### Check the current Git commit and branch
include ( GetGitRevisionDescription )
get_git_head_revision ( MultiMC_GIT_REFSPEC MultiMC_GIT_COMMIT )
message ( STATUS "Git commit: ${MultiMC_GIT_COMMIT}" )
message ( STATUS "Git refspec: ${MultiMC_GIT_REFSPEC}" )
set ( MultiMC_RELEASE_VERSION_NAME "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_HOTFIX}" )
#### Custom target to just print the version.
add_custom_target ( version echo "Version: ${MultiMC_RELEASE_VERSION_NAME}" )
####################################### Install layout #######################################
# How to install the build results
set ( MultiMC_LAYOUT "auto" CACHE STRING "The layout for MultiMC installation (auto, win-bundle, lin-bundle, lin-nodeps, lin-system, mac-bundle)" )
set_property ( CACHE MultiMC_LAYOUT PROPERTY STRINGS auto win-bundle lin-bundle lin-nodeps lin-system mac-bundle )
if ( MultiMC_LAYOUT STREQUAL "auto" )
if ( UNIX AND APPLE )
set ( MultiMC_LAYOUT_REAL "mac-bundle" )
elseif ( UNIX )
set ( MultiMC_LAYOUT_REAL "lin-nodeps" )
elseif ( WIN32 )
set ( MultiMC_LAYOUT_REAL "win-bundle" )
else ( )
message ( FATAL_ERROR "Cannot choose a sensible install layout for your platform." )
endif ( )
else ( )
set ( MultiMC_LAYOUT_REAL ${ MultiMC_LAYOUT } )
endif ( )
if ( MultiMC_LAYOUT_REAL STREQUAL "mac-bundle" )
set ( BINARY_DEST_DIR "MultiMC.app/Contents/MacOS" )
set ( LIBRARY_DEST_DIR "MultiMC.app/Contents/MacOS" )
set ( PLUGIN_DEST_DIR "MultiMC.app/Contents/MacOS" )
set ( RESOURCES_DEST_DIR "MultiMC.app/Contents/Resources" )
set ( JARS_DEST_DIR "MultiMC.app/Contents/MacOS/jars" )
set ( BUNDLE_DEST_DIR "." )
# Apps to bundle
set ( APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.app" )
# Mac bundle settings
set ( MACOSX_BUNDLE_BUNDLE_NAME "MultiMC" )
set ( MACOSX_BUNDLE_INFO_STRING "MultiMC Minecraft launcher and management utility." )
set ( MACOSX_BUNDLE_GUI_IDENTIFIER "org.multimc.MultiMC5" )
set ( MACOSX_BUNDLE_BUNDLE_VERSION "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_HOTFIX}.${MultiMC_VERSION_BUILD}" )
set ( MACOSX_BUNDLE_SHORT_VERSION_STRING "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_HOTFIX}.${MultiMC_VERSION_BUILD}" )
set ( MACOSX_BUNDLE_LONG_VERSION_STRING "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_HOTFIX}.${MultiMC_VERSION_BUILD}" )
set ( MACOSX_BUNDLE_ICON_FILE MultiMC.icns )
set ( MACOSX_BUNDLE_COPYRIGHT "Copyright 2015-2017 MultiMC Contributors" )
# directories to look for dependencies
set ( DIRS ${ QT_LIBS_DIR } ${ QT_LIBEXECS_DIR } ${ CMAKE_LIBRARY_OUTPUT_DIRECTORY } ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY } )
# install as bundle
set ( INSTALL_BUNDLE "full" )
# Add the icon
install ( FILES application/resources/MultiMC.icns DESTINATION ${ RESOURCES_DEST_DIR } )
elseif ( MultiMC_LAYOUT_REAL STREQUAL "lin-bundle" )
set ( BINARY_DEST_DIR "bin" )
set ( LIBRARY_DEST_DIR "bin" )
set ( PLUGIN_DEST_DIR "plugins" )
set ( BUNDLE_DEST_DIR "." )
set ( RESOURCES_DEST_DIR "." )
set ( JARS_DEST_DIR "bin/jars" )
# Apps to bundle
set ( APPS "\${CMAKE_INSTALL_PREFIX}/bin/MultiMC" )
# directories to look for dependencies
set ( DIRS ${ QT_LIBS_DIR } ${ QT_LIBEXECS_DIR } ${ CMAKE_LIBRARY_OUTPUT_DIRECTORY } ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY } )
# install as bundle
set ( INSTALL_BUNDLE "full" )
# Set RPATH
SET ( MultiMC_BINARY_RPATH "$ORIGIN/" )
# Install basic runner script
install ( PROGRAMS application/package/linux/MultiMC DESTINATION ${ BUNDLE_DEST_DIR } )
elseif ( MultiMC_LAYOUT_REAL STREQUAL "lin-nodeps" )
set ( BINARY_DEST_DIR "bin" )
set ( LIBRARY_DEST_DIR "bin" )
set ( PLUGIN_DEST_DIR "plugins" )
set ( BUNDLE_DEST_DIR "." )
set ( RESOURCES_DEST_DIR "." )
set ( JARS_DEST_DIR "bin/jars" )
# install as bundle with no dependencies included
set ( INSTALL_BUNDLE "nodeps" )
# Set RPATH
SET ( MultiMC_BINARY_RPATH "$ORIGIN/" )
# Install basic runner script
install ( PROGRAMS application/package/linux/MultiMC DESTINATION ${ BUNDLE_DEST_DIR } )
elseif ( MultiMC_LAYOUT_REAL STREQUAL "lin-system" )
set ( MultiMC_APP_BINARY_NAME "multimc" CACHE STRING "Name of the MultiMC binary" )
set ( MultiMC_BINARY_DEST_DIR "bin" CACHE STRING "Path to the binary directory" )
set ( MultiMC_LIBRARY_DEST_DIR "lib${LIB_SUFFIX}" CACHE STRING "Path to the library directory" )
set ( MultiMC_SHARE_DEST_DIR "share/multimc" CACHE STRING "Path to the shared data directory" )
set ( JARS_DEST_DIR "${MultiMC_SHARE_DEST_DIR}/jars" )
set ( BINARY_DEST_DIR ${ MultiMC_BINARY_DEST_DIR } )
set ( LIBRARY_DEST_DIR ${ MultiMC_LIBRARY_DEST_DIR } )
MESSAGE ( STATUS "Compiling for linux system with ${MultiMC_SHARE_DEST_DIR} and MULTIMC_LINUX_DATADIR" )
target_compile_definitions ( MultiMC PRIVATE "-DMULTIMC_JARS_LOCATION=${CMAKE_INSTALL_PREFIX}/${JARS_DEST_DIR}" "-DMULTIMC_LINUX_DATADIR" )
# install as bundle with no dependencies included
set ( INSTALL_BUNDLE "nodeps" )
elseif ( MultiMC_LAYOUT_REAL STREQUAL "win-bundle" )
set ( BINARY_DEST_DIR "." )
set ( LIBRARY_DEST_DIR "." )
set ( PLUGIN_DEST_DIR "." )
set ( BUNDLE_DEST_DIR "." )
set ( RESOURCES_DEST_DIR "." )
set ( JARS_DEST_DIR "jars" )
# Apps to bundle
set ( APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.exe" )
# directories to look for dependencies
set ( DIRS ${ QT_LIBS_DIR } ${ QT_LIBEXECS_DIR } ${ CMAKE_LIBRARY_OUTPUT_DIRECTORY } ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY } )
# install as bundle
set ( INSTALL_BUNDLE "full" )
else ( )
message ( FATAL_ERROR "No sensible install layout set." )
endif ( )
2015-02-12 00:26:06 +05:30
2014-01-08 05:57:40 +05:30
################################ 3rd Party Libs ################################
2013-02-21 22:02:13 +05:30
# Find the required Qt parts
2017-05-09 03:04:23 +05:30
find_package ( Qt5Core REQUIRED )
find_package ( Qt5Widgets REQUIRED )
find_package ( Qt5Concurrent REQUIRED )
find_package ( Qt5Network REQUIRED )
find_package ( Qt5Test REQUIRED )
find_package ( Qt5Xml REQUIRED )
2013-01-11 06:55:40 +05:30
2013-12-01 21:04:51 +05:30
# The Qt5 cmake files don't provide its install paths, so ask qmake.
2014-04-06 21:42:48 +05:30
include ( QMakeQuery )
2013-12-01 21:04:51 +05:30
query_qmake ( QT_INSTALL_PLUGINS QT_PLUGINS_DIR )
query_qmake ( QT_INSTALL_IMPORTS QT_IMPORTS_DIR )
query_qmake ( QT_INSTALL_LIBS QT_LIBS_DIR )
2015-03-17 02:48:40 +05:30
query_qmake ( QT_INSTALL_LIBEXECS QT_LIBEXECS_DIR )
2013-12-01 21:04:51 +05:30
query_qmake ( QT_HOST_DATA QT_DATA_DIR )
set ( QT_MKSPECS_DIR ${ QT_DATA_DIR } /mkspecs )
2015-05-27 02:08:01 +05:30
if ( Qt5_POSITION_INDEPENDENT_CODE )
SET ( CMAKE_POSITION_INDEPENDENT_CODE ON )
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 )
2015-09-29 00:50:27 +05:30
option ( NBT_BUILD_SHARED "Build NBT shared library" ON )
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-12-28 21:53:48 +05:30
set ( NBT_NAME MultiMC_nbt++ )
2018-01-22 08:58:07 +05:30
set ( NBT_DEST_DIR ${ LIBRARY_DEST_DIR } )
2016-04-10 19:23:05 +05:30
add_subdirectory ( libraries/libnbtplusplus )
2014-01-08 05:57:40 +05:30
2016-11-20 16:34:29 +05:30
add_subdirectory ( libraries/ganalytics ) # google analytics library
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
2017-05-06 20:52:14 +05:30
add_subdirectory ( libraries/quazip ) # zip manipulation library
2016-04-10 19:23:05 +05:30
add_subdirectory ( libraries/pack200 ) # java pack200 compression
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
2017-09-27 19:09:13 +05:30
add_subdirectory ( libraries/classparser ) # google analytics library
2015-03-02 02:50:57 +05:30
2015-02-12 00:26:06 +05:30
############################### Built Artifacts ###############################
2016-04-10 19:23:05 +05:30
add_subdirectory ( api/logic )
add_subdirectory ( api/gui )
2015-02-09 06:21:14 +05:30
add_subdirectory ( application )
2018-01-22 08:58:07 +05:30
# Bundle utilities are used to complete the portable packages - they add all the libraries that would otherwise be missing on the target system.
# NOTE: this must always be last to appease the CMake deity of quirky install command evaluation order.
if ( INSTALL_BUNDLE STREQUAL "full" )
add_subdirectory ( bundle )
endif ( )