From faddeb2c130157496cd2fd2853fd33a4fc95a0d1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 21 Feb 2013 10:32:13 -0600 Subject: [PATCH] Reorganized the main CMakeLists file and added an icon on Windows. --- CMakeLists.txt | 197 +++++++++++++++++++++--------------- multimc.rc | 1 + resources/icons/MultiMC.ico | Bin 0 -> 76126 bytes 3 files changed, 117 insertions(+), 81 deletions(-) create mode 100644 multimc.rc create mode 100644 resources/icons/MultiMC.ico diff --git a/CMakeLists.txt b/CMakeLists.txt index eea4ded5..e6a1d0cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,31 +1,34 @@ cmake_minimum_required(VERSION 2.8.9) project(MultiMC) -set(CMAKE_AUTOMOC ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) +######## Set CMake options ######## +SET(CMAKE_AUTOMOC ON) +SET(CMAKE_INCLUDE_CURRENT_DIR ON) +# Output all executables and shared libs in the main build folder, not in subfolders. SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) -#### Check for machine endianness #### -INCLUDE(TestBigEndian) -TEST_BIG_ENDIAN(BIGENDIAN) -IF(${BIGENDIAN}) - ADD_DEFINITIONS(-DMULTIMC_BIG_ENDIAN) -ENDIF(${BIGENDIAN}) + +################################ INCLUDE LIBRARIES ################################ # First, include header overrides include_directories(hacks) -#### Find the required Qt parts #### + +######## 3rd Party Libs ######## + +# Find the required Qt parts find_package(Qt5Widgets REQUIRED) find_package(Qt5Network REQUIRED) -#find_package(Qt5Declarative) include_directories(${Qt5Widgets_INCLUDE_DIRS}) -# find ZLIB for quazip +# Find ZLIB for quazip find_package(ZLIB REQUIRED) + +######## Included Libs ######## + # Add quazip add_subdirectory(quazip) @@ -37,6 +40,8 @@ include_directories(patchlib) add_subdirectory(launcher) +######## MultiMC Libs ######## + # Add the util library. add_subdirectory(libutil) include_directories(${LIBMMCUTIL_INCLUDE_DIR}) @@ -53,64 +58,84 @@ include_directories(${LIBMMCINST_INCLUDE_DIR}) add_subdirectory(plugins/stdinstance) + +################################ SET UP BUILD OPTIONS ################################ + +######## Check endianness ######## +INCLUDE(TestBigEndian) +TEST_BIG_ENDIAN(BIGENDIAN) +IF(${BIGENDIAN}) + ADD_DEFINITIONS(-DMULTIMC_BIG_ENDIAN) +ENDIF(${BIGENDIAN}) + + +######## Set module path ######## +SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}") + + +######## Set compiler flags ######## IF(APPLE) - # assume clang 4.1.0+, add C++0x/C++11 stuff - message(STATUS "Using APPLE CMAKE_CXX_FLAGS") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -stdlib=libc++") + # assume clang 4.1.0+, add C++0x/C++11 stuff + message(STATUS "Using APPLE CMAKE_CXX_FLAGS") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -stdlib=libc++") ELSEIF(UNIX) - # assume GCC, add C++0x/C++11 stuff - message(STATUS "Using UNIX CMAKE_CXX_FLAGS") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") + # assume GCC, add C++0x/C++11 stuff + MESSAGE(STATUS "Using UNIX CMAKE_CXX_FLAGS") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") ELSEIF(MINGW) - message(STATUS "Using MINGW CMAKE_CXX_FLAGS") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x") + MESSAGE(STATUS "Using MINGW CMAKE_CXX_FLAGS") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x") ENDIF() -# Set the path where CMake will look for modules. -set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}") +######## Set version numbers ######## +SET(MultiMC_VERSION_MAJOR 5) +SET(MultiMC_VERSION_MINOR 0) +SET(MultiMC_VERSION_REV 0) -set(MultiMC_VERSION_MAJOR 5) -set(MultiMC_VERSION_MINOR 0) -set(MultiMC_VERSION_REV 0) - +# Jenkins build number. SET(MultiMC_VERSION_BUILD 0 CACHE STRING "Build number.") -message(STATUS "MultiMC build #${MultiMC_VERSION_BUILD}") +MESSAGE(STATUS "MultiMC build #${MultiMC_VERSION_BUILD}") -IF (DEFINED MultiMC_BUILD_TAG) - message(STATUS "Build tag: ${MultiMC_BUILD_TAG}") -ELSE () - message(STATUS "No build tag specified.") -ENDIF () -if( CMAKE_SIZEOF_VOID_P EQUAL 8 ) - set (MultiMC_ARCH "x64" - CACHE STRING "Architecture we're building for.") -else() - set (MultiMC_ARCH "x86" - CACHE STRING "Architecture we're building for.") -endif() -message (STATUS "Architecture is ${MultiMC_ARCH}") - -SET(MultiMC_Extra_Label "") - -IF (WIN32) - SET(MultiMC_JOB_NAME "MultiMC4Windows" CACHE STRING "Jenkins job name.") -ELSEIF(UNIX AND APPLE) - SET(MultiMC_JOB_NAME "MultiMC4OSX" CACHE STRING "Jenkins job name.") - # This is here because the scheme doesn't exactly apply to every kind of build... - SET(MultiMC_Extra_Label ",label=osx") +######## Set Jenkins info ######## +# Jenkins build tag +IF(DEFINED MultiMC_BUILD_TAG) + MESSAGE(STATUS "Build tag: ${MultiMC_BUILD_TAG}") ELSE() - SET(MultiMC_JOB_NAME "MultiMC4Linux" CACHE STRING "Jenkins job name.") + MESSAGE(STATUS "No build tag specified.") ENDIF() +# Architecture detection +IF(CMAKE_SIZEOF_VOID_P EQUAL 8) + SET(MultiMC_ARCH "x64" CACHE STRING "Architecture we're building for.") +ELSE() + SET(MultiMC_ARCH "x86" CACHE STRING "Architecture we're building for.") +ENDIF() +MESSAGE(STATUS "Architecture is ${MultiMC_ARCH}") + +# Jenkins job name +IF(WIN32) + SET(MultiMC_JOB_NAME "MultiMC5Windows" CACHE STRING "Jenkins job name.") +ELSEIF(UNIX AND APPLE) + SET(MultiMC_JOB_NAME "MultiMC5OSX" CACHE STRING "Jenkins job name.") +ELSE() + SET(MultiMC_JOB_NAME "MultiMC5Linux" CACHE STRING "Jenkins job name.") +ENDIF() + +# Jenkins URL SET(MultiMC_JOB_URL "http://ci.forkk.net/job/${MultiMC_JOB_NAME}/arch=${MultiMC_ARCH}${MultiMC_Extra_Label}/" CACHE STRING "URL of the jenkins job to pull updates from.") -message(STATUS "Job URL: ${MultiMC_JOB_URL}") +MESSAGE(STATUS "Job URL: ${MultiMC_JOB_URL}") +######## Configure header ######## configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h") + +################################ FILES ################################ + +######## Headers ######## SET(MULTIMC_HEADERS gui/mainwindow.h gui/modeditwindow.h @@ -139,6 +164,8 @@ tasks/task.h tasks/logintask.h ) + +######## Sources ######## SET(MULTIMC_SOURCES main.cpp @@ -162,7 +189,9 @@ tasks/task.cpp tasks/logintask.cpp ) -SET(MULTIMC5_UIS + +######## UIs ######## +SET(MULTIMC_UIS gui/mainwindow.ui gui/modeditwindow.ui gui/settingsdialog.ui @@ -171,39 +200,51 @@ gui/logindialog.ui gui/taskdialog.ui ) -################################ Install ################################ -################ ICNS File ################ +######## Windows resource files ######## +IF(WIN32) +SET(MULTIMC_RCS multimc.rc) +ENDIF() + +################################ COMPILE ################################ + +# ICNS file for OS X IF(APPLE) SET(MACOSX_BUNDLE_ICON_FILE MultiMC.icns) SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/MultiMC.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) SET(MULTIMC_SOURCES ${MULTIMC_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/MultiMC.icns) ENDIF(APPLE) - -################ Build ################ - -IF (WIN32) +# Link additional libraries +IF(WIN32) SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS} - Qt5::WinMain + Qt5::WinMain # Link WinMain ) -ENDIF (WIN32) +ENDIF(WIN32) +# Tell CMake that MultiMCLauncher.jar is generated. SET_SOURCE_FILES_PROPERTIES(resources/MultiMCLauncher.jar GENERATED) -QT5_WRAP_UI(MULTIMC_UI ${MULTIMC5_UIS}) +# Qt 5 stuff +QT5_WRAP_UI(MULTIMC_UI ${MULTIMC_UIS}) QT5_ADD_RESOURCES(MULTIMC_QRC multimc.qrc) -add_executable(MultiMC MACOSX_BUNDLE WIN32 ${MULTIMC_SOURCES} ${MULTIMC_HEADERS} ${MULTIMC_UI} ${MULTIMC_QRC}) -qt5_use_modules(MultiMC Widgets Network) -target_link_libraries(MultiMC quazip patchlib -libmmcutil libmmcsettings libmmcinst +# Add executable +ADD_EXECUTABLE(MultiMC MACOSX_BUNDLE WIN32 + ${MULTIMC_SOURCES} ${MULTIMC_HEADERS} ${MULTIMC_UI} ${MULTIMC_QRC} ${MULTIMC_RCS}) + +# Link +QT5_USE_MODULES(MultiMC Widgets Network) +TARGET_LINK_LIBRARIES(MultiMC quazip patchlib +libmmcutil libmmcsettings libmmcinst ${MultiMC_LINK_ADDITIONAL_LIBS}) -add_dependencies(MultiMC MultiMCLauncher libmmcutil libmmcsettings libmmcinst) +ADD_DEPENDENCIES(MultiMC MultiMCLauncher libmmcutil libmmcsettings libmmcinst) -################ Dirs ################ +################################ INSTALLATION AND PACKAGING ################################ + +######## Plugin and library folders ######## SET(PLUGIN_DEST_DIR bin) SET(QTCONF_DEST_DIR bin) @@ -214,6 +255,7 @@ IF(WIN32) SET(QTCONF_DEST_DIR .) SET(APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.exe") ENDIF() + IF(APPLE) SET(PLUGIN_DEST_DIR MultiMC.app/Contents/MacOS) SET(QTCONF_DEST_DIR MultiMC.app/Contents/Resources) @@ -224,19 +266,20 @@ SET(QT_PLUGINS_DIR ${Qt5_DIR}/plugins) SET(QT_LIBRARY_DIRS ${Qt5_DIR}/lib) -################ OS X Bundle Info ################ +######## OS X Bundle Info ######## IF(APPLE) SET(MACOSX_BUNDLE_BUNDLE_NAME "MultiMC") SET(MACOSX_BUNDLE_INFO_STRING "MultiMC Minecraft launcher and management utility.") - SET(MACOSX_BUNDLE_BUNDLE_VERSION "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_REV}.${MultiMC_VERSION_BUILD}") + SET(MACOSX_BUNDLE_BUNDLE_VERSION + "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_REV}.${MultiMC_VERSION_BUILD}") #SET(MACOSX_BUNDLE_GUI_IDENTIFIER "") SET(MACOSX_BUNDLE_ICON_FILE MultiMC.icns) ENDIF(APPLE) -################ Install ################ +######## Install ######## -# Executable +#### Executable #### IF(WIN32) INSTALL(TARGETS MultiMC BUNDLE DESTINATION . COMPONENT Runtime @@ -257,7 +300,8 @@ INSTALL(TARGETS MultiMC ENDIF() ENDIF() -# Plugins + +#### Plugins #### # Image formats INSTALL(DIRECTORY "${QT_PLUGINS_DIR}/imageformats" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime) @@ -286,16 +330,7 @@ INSTALL(CODE " " COMPONENT Runtime) -#GET_TARGET_PROPERTY(BINARY_LOCATION MultiMC LOCATION) -#CONFIGURE_FILE( -# "${CMAKE_CURRENT_SOURCE_DIR}/dependencies.cmake.in" -# "${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake" -# @ONLY -# ) -#INSTALL(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake") - - -################ Package ################ +######## Package ######## # Package with CPack IF(UNIX) diff --git a/multimc.rc b/multimc.rc new file mode 100644 index 00000000..decf7d3a --- /dev/null +++ b/multimc.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "resources/icons/MultiMC.ico" diff --git a/resources/icons/MultiMC.ico b/resources/icons/MultiMC.ico new file mode 100644 index 0000000000000000000000000000000000000000..734af0fb1004cc7afc5115cc1d689980d009ec44 GIT binary patch literal 76126 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 Masb=Ue=-FA4`IH%B>(^b literal 0 HcmV?d00001