project(application) ######## 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}") ######## Configure header ######## configure_file("${PROJECT_SOURCE_DIR}/BuildConfig.cpp.in" "${PROJECT_BINARY_DIR}/BuildConfig.cpp") ################################ FILES ################################ ######## Sources and headers ######## SET(MULTIMC_SOURCES # Application base main.cpp MultiMC.h MultiMC.cpp BuildConfig.h ${PROJECT_BINARY_DIR}/BuildConfig.cpp UpdateController.cpp UpdateController.h # GUI - general utilities GuiUtil.h GuiUtil.cpp ColumnResizer.h ColumnResizer.cpp InstanceProxyModel.h InstanceProxyModel.cpp VersionProxyModel.h VersionProxyModel.cpp ColorCache.h ColorCache.cpp HoeDown.h # GUI - windows MainWindow.h MainWindow.cpp InstanceWindow.h InstanceWindow.cpp # GUI - setup wizard setupwizard/SetupWizard.h setupwizard/SetupWizard.cpp setupwizard/AnalyticsWizardPage.cpp setupwizard/AnalyticsWizardPage.h setupwizard/BaseWizardPage.h setupwizard/JavaWizardPage.cpp setupwizard/JavaWizardPage.h setupwizard/LanguageWizardPage.cpp setupwizard/LanguageWizardPage.h # GUI - themes themes/FusionTheme.cpp themes/FusionTheme.h themes/BrightTheme.cpp themes/BrightTheme.h themes/CustomTheme.cpp themes/CustomTheme.h themes/DarkTheme.cpp themes/DarkTheme.h themes/ITheme.cpp themes/ITheme.h themes/SystemTheme.cpp themes/SystemTheme.h # GUI - settings-specific wrappers for paged dialog SettingsUI.h # Processes LaunchController.h LaunchController.cpp # page provider for instances InstancePageProvider.h # Common java checking UI JavaCommon.h JavaCommon.cpp # GUI - page dialog pages pages/BasePage.h pages/BasePageContainer.h pages/VersionPage.cpp pages/VersionPage.h pages/TexturePackPage.h pages/ResourcePackPage.h pages/ModFolderPage.cpp pages/ModFolderPage.h pages/NotesPage.cpp pages/NotesPage.h pages/LogPage.cpp pages/LogPage.h pages/InstanceSettingsPage.cpp pages/InstanceSettingsPage.h pages/ScreenshotsPage.cpp pages/ScreenshotsPage.h pages/OtherLogsPage.cpp pages/OtherLogsPage.h pages/LegacyUpgradePage.cpp pages/LegacyUpgradePage.h pages/WorldListPage.cpp pages/WorldListPage.h # GUI - global settings pages pages/global/AccountListPage.cpp pages/global/AccountListPage.h pages/global/ExternalToolsPage.cpp pages/global/ExternalToolsPage.h pages/global/JavaPage.cpp pages/global/JavaPage.h pages/global/MinecraftPage.cpp pages/global/MinecraftPage.h pages/global/MultiMCPage.cpp pages/global/MultiMCPage.h pages/global/ProxyPage.cpp pages/global/ProxyPage.h pages/global/PasteEEPage.cpp pages/global/PasteEEPage.h pages/global/PackagesPage.cpp pages/global/PackagesPage.h # GUI - dialogs dialogs/AboutDialog.cpp dialogs/AboutDialog.h dialogs/ProfileSelectDialog.cpp dialogs/ProfileSelectDialog.h dialogs/CopyInstanceDialog.cpp dialogs/CopyInstanceDialog.h dialogs/CustomMessageBox.cpp dialogs/CustomMessageBox.h dialogs/EditAccountDialog.cpp dialogs/EditAccountDialog.h dialogs/ExportInstanceDialog.cpp dialogs/ExportInstanceDialog.h dialogs/IconPickerDialog.cpp dialogs/IconPickerDialog.h dialogs/LoginDialog.cpp dialogs/LoginDialog.h dialogs/ModEditDialogCommon.cpp dialogs/ModEditDialogCommon.h dialogs/NewInstanceDialog.cpp dialogs/NewInstanceDialog.h dialogs/NotificationDialog.cpp dialogs/NotificationDialog.h pagedialog/PageDialog.cpp pagedialog/PageDialog.h dialogs/ProgressDialog.cpp dialogs/ProgressDialog.h dialogs/UpdateDialog.cpp dialogs/UpdateDialog.h dialogs/VersionSelectDialog.cpp dialogs/VersionSelectDialog.h dialogs/SkinUploadDialog.cpp dialogs/SkinUploadDialog.h # GUI - widgets widgets/Common.cpp widgets/Common.h widgets/FocusLineEdit.cpp widgets/FocusLineEdit.h widgets/IconLabel.cpp widgets/IconLabel.h widgets/LabeledToolButton.cpp widgets/LabeledToolButton.h widgets/LineSeparator.cpp widgets/LineSeparator.h widgets/LogView.cpp widgets/LogView.h widgets/MCModInfoFrame.cpp widgets/MCModInfoFrame.h widgets/ModListView.cpp widgets/ModListView.h widgets/PageContainer.cpp widgets/PageContainer.h widgets/PageContainer_p.h widgets/ServerStatus.cpp widgets/ServerStatus.h widgets/VersionListView.cpp widgets/VersionListView.h widgets/VersionSelectWidget.cpp widgets/VersionSelectWidget.h widgets/ProgressWidget.h widgets/ProgressWidget.cpp # GUI - instance group view groupview/GroupedProxyModel.cpp groupview/GroupedProxyModel.h groupview/GroupView.cpp groupview/GroupView.h groupview/InstanceDelegate.cpp groupview/InstanceDelegate.h groupview/VisualGroup.cpp groupview/VisualGroup.h ) ######## UIs ######## SET(MULTIMC_UIS # Instance pages pages/VersionPage.ui pages/ModFolderPage.ui pages/LogPage.ui pages/InstanceSettingsPage.ui pages/NotesPage.ui pages/ScreenshotsPage.ui pages/OtherLogsPage.ui pages/LegacyUpgradePage.ui pages/WorldListPage.ui # Global settings pages pages/global/AccountListPage.ui pages/global/ExternalToolsPage.ui pages/global/JavaPage.ui pages/global/MinecraftPage.ui pages/global/MultiMCPage.ui pages/global/ProxyPage.ui pages/global/PasteEEPage.ui pages/global/PackagesPage.ui # Dialogs dialogs/CopyInstanceDialog.ui dialogs/NewInstanceDialog.ui dialogs/AboutDialog.ui dialogs/ProgressDialog.ui dialogs/IconPickerDialog.ui dialogs/ProfileSelectDialog.ui dialogs/EditAccountDialog.ui dialogs/ExportInstanceDialog.ui dialogs/LoginDialog.ui dialogs/UpdateDialog.ui dialogs/NotificationDialog.ui dialogs/SkinUploadDialog.ui # Widgets/other widgets/MCModInfoFrame.ui ) set(MULTIMC_QRCS resources/backgrounds/backgrounds.qrc resources/multimc/multimc.qrc resources/pe_dark/pe_dark.qrc resources/pe_light/pe_light.qrc resources/pe_colored/pe_colored.qrc resources/pe_blue/pe_blue.qrc resources/OSX/OSX.qrc resources/iOS/iOS.qrc resources/documents/documents.qrc ) ######## Windows resource files ######## if(WIN32) set(MULTIMC_RCS resources/multimc.rc) endif() # Qt 5 stuff qt5_wrap_ui(MULTIMC_UI ${MULTIMC_UIS}) qt5_add_resources(MULTIMC_RESOURCES ${MULTIMC_QRCS}) # Add executable add_executable(MultiMC MACOSX_BUNDLE WIN32 ${MULTIMC_SOURCES} ${MULTIMC_UI} ${MULTIMC_RESOURCES} ${MULTIMC_RCS}) target_link_libraries(MultiMC MultiMC_gui ${QUAZIP_LIBRARIES} hoedown MultiMC_rainbow LocalPeer ganalytics) ################################ INSTALLATION AND PACKAGING ################################ ######## Packaging/install paths setup ######## # 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-bundle") 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") 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 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") # 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_TARGET_PROPERTIES(MultiMC PROPERTIES INSTALL_RPATH "$ORIGIN/") # Install basic runner script install(PROGRAMS 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") # install as bundle with no dependencies included set(INSTALL_BUNDLE "nodeps") # Set RPATH SET_TARGET_PROPERTIES(MultiMC PROPERTIES INSTALL_RPATH "$ORIGIN/") # Install basic runner script install(PROGRAMS package/linux/MultiMC DESTINATION ${BUNDLE_DEST_DIR}) elseif(MultiMC_LAYOUT_REAL STREQUAL "lin-system") set(MultiMC_BINARY_DEST_DIR "usr/bin" CACHE STRING "Relative path from packaging root to the binary directory") set(MultiMC_LIBRARY_DEST_DIR "usr/lib" CACHE STRING "Relative path from packaging root to the library directory") set(MultiMC_SHARE_DEST_DIR "usr/share/multimc" CACHE STRING "Relative path from packaging root to the shared data directory") set(MultiMC_APP_BINARY_NAME "multimc" CACHE STRING "Name of the MultiMC binary for the purposes of linux packaging") set(JARS_DEST_DIR "${MultiMC_SHARE_DEST_DIR}") 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") set_target_properties(MultiMC PROPERTIES OUTPUT_NAME ${MultiMC_APP_BINARY_NAME}) target_compile_definitions(MultiMC PRIVATE "-DMULTIMC_JARS_LOCATION=/${MultiMC_SHARE_DEST_DIR}/jars" "-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 ".") # 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() ######## Install files ######## #### Executable #### install(TARGETS MultiMC BUNDLE DESTINATION ${BUNDLE_DEST_DIR} COMPONENT Runtime LIBRARY DESTINATION ${LIBRARY_DEST_DIR} COMPONENT Runtime RUNTIME DESTINATION ${BINARY_DEST_DIR} COMPONENT Runtime ) install_jar(JavaCheck "${JARS_DEST_DIR}/jars") install_jar(NewLaunch "${JARS_DEST_DIR}/jars") #### Dependency installations #### if(INSTALL_BUNDLE STREQUAL "nodeps") # Just our own stuff # FIXME: this does not remove RPATH. install( FILES $ $ $ $ $ $ $ DESTINATION ${LIBRARY_DEST_DIR} ) elseif(INSTALL_BUNDLE STREQUAL "full") # Add qt.conf - this makes Qt stop looking for things outside the bundle install( CODE "file(WRITE \"\${CMAKE_INSTALL_PREFIX}/${RESOURCES_DEST_DIR}/qt.conf\" \" \")" COMPONENT Runtime ) # Bundle plugins if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") # Image formats install( DIRECTORY "${QT_PLUGINS_DIR}/imageformats" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime REGEX "tga|tiff|mng|webp" EXCLUDE ) # Icon engines install( DIRECTORY "${QT_PLUGINS_DIR}/iconengines" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime REGEX "fontawesome" EXCLUDE ) # Platform plugins install( DIRECTORY "${QT_PLUGINS_DIR}/platforms" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime REGEX "minimal|linuxfb|offscreen" EXCLUDE ) else() # Image formats install( DIRECTORY "${QT_PLUGINS_DIR}/imageformats" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime REGEX "tga|tiff|mng|webp" EXCLUDE REGEX "d\\." EXCLUDE REGEX "_debug\\." EXCLUDE REGEX "\\.dSYM" EXCLUDE ) # Icon engines install( DIRECTORY "${QT_PLUGINS_DIR}/iconengines" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime REGEX "fontawesome" EXCLUDE REGEX "d\\." EXCLUDE REGEX "_debug\\." EXCLUDE REGEX "\\.dSYM" EXCLUDE ) # Platform plugins install( DIRECTORY "${QT_PLUGINS_DIR}/platforms" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime REGEX "minimal|linuxfb|offscreen" EXCLUDE REGEX "d\\." EXCLUDE REGEX "_debug\\." EXCLUDE REGEX "\\.dSYM" EXCLUDE ) endif() configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/install_prereqs.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/install_prereqs.cmake" @ONLY ) install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/install_prereqs.cmake" COMPONENT Runtime) endif()