* ci: Add vcpkg submodule * cmake: Fix NSIS not detecting platform arch * cmake: Add QTDIR(64|32) This change adds a new var for QTDIR(32|64) which makes it easier to specify a specific directory for Qt, rather than having to edit the prefix path directly, which can get pretty messy. Functionally, this shouldn't affect any builds that are already finding Qt as part of path, and should not affect Linux/macOS. * cmake: Bump min cmake version * ci: Add GitHub Actions for Windows
286 lines
9.7 KiB
CMake
286 lines
9.7 KiB
CMake
# Cockatrice's main CMakeLists.txt
|
|
#
|
|
# This is basically a wrapper to enable/disable the compilation
|
|
# of the different projects: servatrice, cockatrice, test
|
|
# This file sets all the variables shared between the projects
|
|
# like the installation path, compilation flags etc..
|
|
|
|
# Cmake 3.1 is required to enable C++11 support correctly
|
|
cmake_minimum_required(VERSION 3.10)
|
|
|
|
# Default to "Release" build type
|
|
# User-provided value for CMAKE_BUILD_TYPE must be checked before the PROJECT() call
|
|
IF(DEFINED CMAKE_BUILD_TYPE)
|
|
SET(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Type of build")
|
|
ELSE()
|
|
SET(CMAKE_BUILD_TYPE Release CACHE STRING "Type of build")
|
|
ENDIF()
|
|
|
|
# Early detect ccache
|
|
OPTION(USE_CCACHE "Cache the build results with ccache" ON)
|
|
if(USE_CCACHE)
|
|
find_program(CCACHE_PROGRAM ccache)
|
|
if(CCACHE_PROGRAM)
|
|
# Support Unix Makefiles and Ninja
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
|
|
MESSAGE(STATUS "Found CCache ${CCACHE_PROGRAM}")
|
|
endif()
|
|
endif()
|
|
|
|
if(WIN32)
|
|
# Use vcpkg toolchain on Windows
|
|
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake
|
|
CACHE STRING "Vcpkg toolchain file")
|
|
# Qt path set by user or env var
|
|
if (QTDIR OR DEFINED ENV{QTDIR} OR DEFINED ENV{QTDIR32} OR DEFINED ENV{QTDIR64})
|
|
else()
|
|
set(QTDIR "" CACHE PATH "Path to Qt (e.g. C:/Qt/5.7/msvc2015_64)")
|
|
message(WARNING "QTDIR variable is missing. Please set this variable to specify path to Qt (e.g. C:/Qt/5.7/msvc2015_64)")
|
|
endif()
|
|
endif()
|
|
# A project name is needed for CPack
|
|
# Version can be overriden by git tags, see cmake/getversion.cmake
|
|
PROJECT("Cockatrice" VERSION 2.7.6)
|
|
|
|
# Use c++11 for all targets
|
|
set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ ISO Standard")
|
|
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
|
|
|
# Set conventional loops
|
|
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
|
|
|
|
# Search path for cmake modules
|
|
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
|
|
|
|
# Retrieve git version hash
|
|
include(getversion)
|
|
|
|
# Create a header and a cpp file containing the version hash
|
|
include(createversionfile)
|
|
|
|
# Define a proper install path
|
|
if(UNIX)
|
|
if(APPLE)
|
|
# macOS
|
|
# Due to the special bundle structure ignore
|
|
# the prefix eventually set by the user.
|
|
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/release)
|
|
|
|
# Force ccache usage if available
|
|
get_property(RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
|
|
if(RULE_LAUNCH_COMPILE)
|
|
MESSAGE(STATUS "Force enabling CCache usage under macOS")
|
|
# Set up wrapper scripts
|
|
configure_file(${CMAKE_MODULE_PATH}/launch-c.in launch-c)
|
|
configure_file(${CMAKE_MODULE_PATH}/launch-cxx.in launch-cxx)
|
|
execute_process(COMMAND chmod a+rx
|
|
"${CMAKE_BINARY_DIR}/launch-c"
|
|
"${CMAKE_BINARY_DIR}/launch-cxx")
|
|
|
|
# Set Xcode project attributes to route compilation through our scripts
|
|
set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_BINARY_DIR}/launch-c")
|
|
set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_BINARY_DIR}/launch-cxx")
|
|
set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_BINARY_DIR}/launch-c")
|
|
set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_BINARY_DIR}/launch-cxx")
|
|
endif()
|
|
else()
|
|
# Linux / BSD
|
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
|
#fix package build
|
|
if(PREFIX)
|
|
set(CMAKE_INSTALL_PREFIX ${PREFIX})
|
|
else()
|
|
set(CMAKE_INSTALL_PREFIX /usr/local)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
elseif(WIN32)
|
|
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/release)
|
|
endif()
|
|
|
|
# Treat warnings as errors (Debug builds only)
|
|
option(WARNING_AS_ERROR "Treat warnings as errors in debug builds" ON)
|
|
|
|
# Define proper compilation flags
|
|
IF(MSVC)
|
|
# Visual Studio:
|
|
# Maximum optimization
|
|
# Disable warning C4251
|
|
set(CMAKE_CXX_FLAGS_RELEASE "/Ox /MD /wd4251")
|
|
# Generate complete debugging information
|
|
#set(CMAKE_CXX_FLAGS_DEBUG "/Zi")
|
|
ELSEIF (CMAKE_COMPILER_IS_GNUCXX)
|
|
# linux/gcc, bsd/gcc, windows/mingw
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-s -O2")
|
|
if(WARNING_AS_ERROR)
|
|
set(CMAKE_CXX_FLAGS_DEBUG "-ggdb -O0 -Wall -Wextra -Werror")
|
|
else()
|
|
set(CMAKE_CXX_FLAGS_DEBUG "-ggdb -O0 -Wall -Wextra")
|
|
endif()
|
|
|
|
set(ADDITIONAL_DEBUG_FLAGS -Wcast-align -Wmissing-declarations -Wno-long-long -Wno-error=extra -Wno-error=delete-non-virtual-dtor -Wno-error=sign-compare -Wno-error=missing-declarations)
|
|
|
|
FOREACH(FLAG ${ADDITIONAL_DEBUG_FLAGS})
|
|
CHECK_CXX_COMPILER_FLAG("${FLAG}" CXX_HAS_WARNING_${FLAG})
|
|
IF(CXX_HAS_WARNING_${FLAG})
|
|
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${FLAG}")
|
|
ENDIF()
|
|
ENDFOREACH()
|
|
ELSE()
|
|
# other: osx/llvm, bsd/llvm
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
|
|
ENDIF()
|
|
|
|
# GNU systems need to define the Mersenne exponent for the RNG to compile w/o warning
|
|
IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
|
ADD_DEFINITIONS("-DSFMT_MEXP=19937")
|
|
ENDIF()
|
|
|
|
FIND_PACKAGE(Threads REQUIRED)
|
|
|
|
# Find Qt5
|
|
if(DEFINED QTDIR${_lib_suffix})
|
|
list(APPEND CMAKE_PREFIX_PATH "${QTDIR${_lib_suffix}}")
|
|
elseif(DEFINED QTDIR)
|
|
list(APPEND CMAKE_PREFIX_PATH "${QTDIR}")
|
|
elseif(DEFINED ENV{QTDIR${_lib_suffix}})
|
|
list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR${_lib_suffix}}")
|
|
elseif(DEFINED ENV{QTDIR})
|
|
list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR}")
|
|
endif()
|
|
|
|
FIND_PACKAGE(Qt5Core 5.5.0 REQUIRED)
|
|
|
|
IF(Qt5Core_FOUND)
|
|
MESSAGE(STATUS "Found Qt ${Qt5Core_VERSION_STRING}")
|
|
|
|
# FIX: Qt was built with -reduce-relocations
|
|
if (Qt5_POSITION_INDEPENDENT_CODE)
|
|
SET(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
endif()
|
|
|
|
# guess plugins and libraries directory
|
|
set(QT_PLUGINS_DIR "${Qt5Core_DIR}/../../../plugins")
|
|
get_target_property(QT_LIBRARY_DIR Qt5::Core LOCATION)
|
|
get_filename_component(QT_LIBRARY_DIR ${QT_LIBRARY_DIR} PATH)
|
|
|
|
ELSE()
|
|
MESSAGE(FATAL_ERROR "No Qt5 found!")
|
|
ENDIF()
|
|
|
|
# Check for translation updates
|
|
OPTION(UPDATE_TRANSLATIONS "Update translations on compile" OFF)
|
|
MESSAGE(STATUS "UPDATE TRANSLATIONS: ${UPDATE_TRANSLATIONS}")
|
|
|
|
set(CMAKE_AUTOMOC TRUE)
|
|
|
|
# Find other needed libraries
|
|
FIND_PACKAGE(Protobuf REQUIRED)
|
|
IF(NOT EXISTS "${Protobuf_PROTOC_EXECUTABLE}")
|
|
MESSAGE(FATAL_ERROR "No protoc command found!")
|
|
ENDIF()
|
|
|
|
#Find OpenSSL
|
|
IF(WIN32)
|
|
FIND_PACKAGE(Win32SslRuntime)
|
|
ENDIF()
|
|
|
|
#Find VCredist
|
|
IF(MSVC)
|
|
FIND_PACKAGE(VCredistRuntime)
|
|
ENDIF()
|
|
|
|
# Package builder
|
|
set(CPACK_PACKAGE_CONTACT "Zach Halpern <zahalpern+github@gmail.com>")
|
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_NAME})
|
|
set(CPACK_PACKAGE_VENDOR "Cockatrice Development Team")
|
|
set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.md")
|
|
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
|
set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
|
|
set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}")
|
|
set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}")
|
|
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_VERSION_FILENAME}")
|
|
|
|
if(UNIX)
|
|
if(APPLE)
|
|
set(CPACK_GENERATOR DragNDrop ${CPACK_GENERATOR})
|
|
set(CPACK_GENERATOR "DragNDrop")
|
|
set(CPACK_DMG_FORMAT "UDBZ")
|
|
set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME}")
|
|
set(CPACK_SYSTEM_NAME "OSX")
|
|
set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/cockatrice/resources/appicon.icns")
|
|
else()
|
|
# linux
|
|
IF(CPACK_GENERATOR STREQUAL "RPM")
|
|
set(CPACK_RPM_PACKAGE_LICENSE "GPLv2")
|
|
set(CPACK_RPM_PACKAGE_REQUIRES "protobuf, qt5-qttools, qt5-qtsvg, qt5-qtmultimedia")
|
|
set(CPACK_RPM_PACKAGE_GROUP "Amusements/Games")
|
|
set(CPACK_RPM_PACKAGE_URL "http://github.com/Cockatrice/Cockatrice")
|
|
ELSE()
|
|
set(CPACK_GENERATOR DEB)
|
|
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
|
set(CPACK_DEBIAN_PACKAGE_SECTION "games")
|
|
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "http://github.com/Cockatrice/Cockatrice")
|
|
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5multimedia5-plugins, libqt5svg5")
|
|
ENDIF()
|
|
endif()
|
|
elseif(WIN32)
|
|
set(CPACK_GENERATOR NSIS ${CPACK_GENERATOR})
|
|
if("${CMAKE_GENERATOR_PLATFORM}" MATCHES "(x64)")
|
|
set(TRICE_IS_64_BIT 1)
|
|
else()
|
|
set(TRICE_IS_64_BIT 0)
|
|
endif()
|
|
|
|
# Configure file with custom definitions for NSIS.
|
|
configure_file(
|
|
${CMAKE_MODULE_PATH}/NSIS.definitions.nsh.in
|
|
${PROJECT_BINARY_DIR}/NSIS.definitions.nsh
|
|
)
|
|
|
|
# include vcredist into the package; NSIS will take care of running it
|
|
if(VCREDISTRUNTIME_FOUND)
|
|
INSTALL(FILES "${VCREDISTRUNTIME_FILE}" DESTINATION ./)
|
|
endif()
|
|
endif()
|
|
|
|
include(CPack)
|
|
|
|
# Compile servatrice (default off)
|
|
option(WITH_SERVER "build servatrice" OFF)
|
|
add_subdirectory(common)
|
|
if(WITH_SERVER)
|
|
add_subdirectory(servatrice)
|
|
SET(CPACK_INSTALL_CMAKE_PROJECTS "Servatrice;Servatrice;ALL;/" ${CPACK_INSTALL_CMAKE_PROJECTS})
|
|
endif()
|
|
|
|
# Compile cockatrice (default on)
|
|
option(WITH_CLIENT "build cockatrice" ON)
|
|
if(WITH_CLIENT)
|
|
add_subdirectory(cockatrice)
|
|
SET(CPACK_INSTALL_CMAKE_PROJECTS "Cockatrice;Cockatrice;ALL;/" ${CPACK_INSTALL_CMAKE_PROJECTS})
|
|
endif()
|
|
|
|
# Compile oracle (default on)
|
|
option(WITH_ORACLE "build oracle" ON)
|
|
if(WITH_ORACLE)
|
|
add_subdirectory(oracle)
|
|
SET(CPACK_INSTALL_CMAKE_PROJECTS "Oracle;Oracle;ALL;/" ${CPACK_INSTALL_CMAKE_PROJECTS})
|
|
endif()
|
|
|
|
# Compile dbconverter (default on)
|
|
option(WITH_DBCONVERTER "build oracle" ON)
|
|
if(WITH_DBCONVERTER)
|
|
add_subdirectory(dbconverter)
|
|
SET(CPACK_INSTALL_CMAKE_PROJECTS "Dbconverter;Dbconverter;ALL;/" ${CPACK_INSTALL_CMAKE_PROJECTS})
|
|
endif()
|
|
|
|
# Compile tests (default off)
|
|
option(TEST "build tests" OFF)
|
|
if(TEST)
|
|
include(CTest)
|
|
add_subdirectory(tests)
|
|
endif()
|