summaryrefslogtreecommitdiffstats
path: root/CMake
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--CMake/AddDependencies.cmake81
-rw-r--r--CMake/StampBuild.cmake60
-rw-r--r--CMakeLists.txt232
3 files changed, 161 insertions, 212 deletions
diff --git a/CMake/AddDependencies.cmake b/CMake/AddDependencies.cmake
new file mode 100644
index 000000000..72eead340
--- /dev/null
+++ b/CMake/AddDependencies.cmake
@@ -0,0 +1,81 @@
+# Set options for SQLiteCpp, disable all their tests and lints:
+set(SQLITECPP_RUN_CPPLINT OFF CACHE BOOL "Run cpplint.py tool for Google C++ StyleGuide.")
+set(SQLITECPP_RUN_CPPCHECK OFF CACHE BOOL "Run cppcheck C++ static analysis tool.")
+set(SQLITECPP_RUN_DOXYGEN OFF CACHE BOOL "Run Doxygen C++ documentation tool.")
+set(SQLITECPP_BUILD_EXAMPLES OFF CACHE BOOL "Build examples.")
+set(SQLITECPP_BUILD_TESTS OFF CACHE BOOL "Build and run tests.")
+set(SQLITECPP_INTERNAL_SQLITE ON CACHE BOOL "Add the internal SQLite3 source to the project.")
+set(SQLITE_ENABLE_COLUMN_METADATA OFF CACHE BOOL "Enable Column::getColumnOriginName(). Require support from sqlite3 library.")
+
+# Set options for LibEvent, disable all their tests and benchmarks:
+set(EVENT__DISABLE_OPENSSL YES CACHE BOOL "Disable OpenSSL in LibEvent")
+set(EVENT__DISABLE_BENCHMARK YES CACHE BOOL "Disable LibEvent benchmarks")
+set(EVENT__DISABLE_TESTS YES CACHE BOOL "Disable LibEvent tests")
+set(EVENT__DISABLE_REGRESS YES CACHE BOOL "Disable LibEvent regression tests")
+set(EVENT__DISABLE_SAMPLES YES CACHE BOOL "Disable LibEvent samples")
+set(EVENT__LIBRARY_TYPE "STATIC" CACHE STRING "Use static LibEvent libraries")
+
+# Set options for JsonCPP, disabling all of their tests:
+set(JSONCPP_WITH_TESTS OFF CACHE BOOL "Compile and (for jsoncpp_check) run JsonCpp test executables")
+set(JSONCPP_WITH_POST_BUILD_UNITTEST OFF CACHE BOOL "Automatically run unit-tests as a post build step")
+set(JSONCPP_WITH_PKGCONFIG_SUPPORT OFF CACHE BOOL "Generate and install .pc files")
+
+# Set options for mbedtls:
+set(ENABLE_PROGRAMS OFF CACHE BOOL "Build mbed TLS programs.")
+set(ENABLE_TESTING OFF CACHE BOOL "Build mbed TLS tests.")
+
+# Enumerate all submodule libraries
+# SQLiteCpp needs to be included before sqlite so the lsqlite target is available:
+set(DEPENDENCIES expat fmt jsoncpp libevent lua luaexpat mbedtls SQLiteCpp sqlite tolua++ zlib)
+foreach(DEPENDENCY ${DEPENDENCIES})
+ # Check that the libraries are present:
+ if (NOT EXISTS "${PROJECT_SOURCE_DIR}/lib/${DEPENDENCY}/CMakeLists.txt")
+ message(FATAL_ERROR "${DEPENDENCY} is missing in folder lib/${DEPENDENCY}. Have you initialized and updated the submodules / downloaded the extra libraries?")
+ endif()
+
+ # Include all the libraries
+ # We use EXCLUDE_FROM_ALL so that only the explicit dependencies are compiled
+ # (mbedTLS also has test and example programs in their CMakeLists.txt, we don't want those):
+ add_subdirectory("lib/${DEPENDENCY}" EXCLUDE_FROM_ALL)
+endforeach()
+
+# Add required includes:
+target_include_directories(
+ ${CMAKE_PROJECT_NAME} SYSTEM PRIVATE
+ lib/mbedtls/include
+ lib/TCLAP/include
+ lib # TODO fix files including zlib/x instead of x
+)
+
+# Link dependencies as private:
+target_link_libraries(
+ ${CMAKE_PROJECT_NAME} PRIVATE
+ event_core
+ event_extra
+ fmt::fmt
+ jsoncpp_lib
+ lsqlite
+ lua
+ luaexpat
+ mbedtls
+ SQLiteCpp
+ tolualib
+ zlib
+)
+
+# Link process information library:
+if (WIN32)
+ target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Psapi.lib)
+endif()
+
+# Special case handling for libevent pthreads:
+if(NOT WIN32)
+ target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE event_pthreads)
+endif()
+
+# Prettify jsoncpp_lib name in VS solution explorer:
+set_property(TARGET jsoncpp_lib PROPERTY PROJECT_LABEL "jsoncpp")
+
+if (WIN32)
+ add_subdirectory(lib/luaproxy)
+endif()
diff --git a/CMake/StampBuild.cmake b/CMake/StampBuild.cmake
new file mode 100644
index 000000000..db234b761
--- /dev/null
+++ b/CMake/StampBuild.cmake
@@ -0,0 +1,60 @@
+# These env variables are used for configuring Travis CI builds.
+if(DEFINED ENV{TRAVIS_CUBERITE_FORCE32})
+ set(FORCE32 $ENV{TRAVIS_CUBERITE_FORCE32})
+endif()
+
+if(DEFINED ENV{TRAVIS_BUILD_WITH_COVERAGE})
+ set(BUILD_WITH_COVERAGE $ENV{TRAVIS_BUILD_WITH_COVERAGE})
+endif()
+
+if(DEFINED ENV{CUBERITE_BUILD_ID})
+ # The build info is defined by the build system (Travis / Jenkins)
+ set(BUILD_ID $ENV{CUBERITE_BUILD_ID})
+ set(BUILD_SERIES_NAME $ENV{CUBERITE_BUILD_SERIES_NAME})
+ set(BUILD_DATETIME $ENV{CUBERITE_BUILD_DATETIME})
+ if(DEFINED ENV{CUBERITE_BUILD_COMMIT_ID})
+ set(BUILD_COMMIT_ID $ENV{CUBERITE_BUILD_COMMIT_ID})
+ else()
+ message("Commit id not set, attempting to determine id from git")
+ execute_process(
+ COMMAND git rev-parse HEAD
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+ RESULT_VARIABLE GIT_EXECUTED
+ OUTPUT_VARIABLE BUILD_COMMIT_ID
+ )
+ string(STRIP ${BUILD_COMMIT_ID} BUILD_COMMIT_ID)
+ if (NOT (GIT_EXECUTED EQUAL 0))
+ message(FATAL_ERROR "Could not identifiy git commit id")
+ endif()
+ endif()
+else()
+ # This is a local build, stuff in some basic info:
+ set(BUILD_ID "Unknown")
+ set(BUILD_SERIES_NAME "local build")
+ execute_process(
+ COMMAND git rev-parse HEAD
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+ RESULT_VARIABLE GIT_EXECUTED
+ OUTPUT_VARIABLE BUILD_COMMIT_ID
+ )
+ if (NOT(GIT_EXECUTED EQUAL 0))
+ set(BUILD_COMMIT_ID "Unknown")
+ endif()
+ string(STRIP ${BUILD_COMMIT_ID} BUILD_COMMIT_ID)
+ execute_process(
+ COMMAND git log -1 --date=iso --pretty=format:%ai
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+ RESULT_VARIABLE GIT_EXECUTED
+ OUTPUT_VARIABLE BUILD_DATETIME
+ )
+ if (NOT(GIT_EXECUTED EQUAL 0))
+ set(BUILD_DATETIME "Unknown")
+ endif()
+ string(STRIP ${BUILD_DATETIME} BUILD_DATETIME)
+
+ # The BUILD_COMMIT_ID and BUILD_DATETIME aren't updated on each repo pull
+ # They are only updated when cmake re-configures the project
+ # Therefore mark them as "approx: "
+ set(BUILD_COMMIT_ID "approx: ${BUILD_COMMIT_ID}")
+ set(BUILD_DATETIME "approx: ${BUILD_DATETIME}")
+endif()
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9f58696fe..f31f33f13 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,6 +14,7 @@
cmake_minimum_required (VERSION 3.13)
+cmake_policy(VERSION 3.13...3.17.2)
project(
Cuberite
DESCRIPTION "A lightweight, fast and extensible game server for Minecraft"
@@ -22,76 +23,11 @@ project(
)
option(BUILD_TOOLS "Sets up additional executables to be built along with the server" OFF)
+option(WHOLE_PROGRAM_OPTIMISATION "Enables link time optimisation for Release" ON)
option(PRECOMPILE_HEADERS "Enable precompiled headers for faster builds" ON)
option(SELF_TEST "Enables testing code to be built" OFF)
option(UNITY_BUILDS "Enables source aggregation for faster builds" ON)
-# These env variables are used for configuring Travis CI builds.
-if(DEFINED ENV{TRAVIS_CUBERITE_BUILD_TYPE})
- message("Setting build type to $ENV{TRAVIS_CUBERITE_BUILD_TYPE}")
- set(CMAKE_BUILD_TYPE $ENV{TRAVIS_CUBERITE_BUILD_TYPE})
-endif()
-
-if(DEFINED ENV{TRAVIS_CUBERITE_FORCE32})
- set(FORCE32 $ENV{TRAVIS_CUBERITE_FORCE32})
-endif()
-
-if(DEFINED ENV{TRAVIS_BUILD_WITH_COVERAGE})
- set(BUILD_WITH_COVERAGE $ENV{TRAVIS_BUILD_WITH_COVERAGE})
-endif()
-
-if(DEFINED ENV{CUBERITE_BUILD_ID})
- # The build info is defined by the build system (Travis / Jenkins)
- set(BUILD_ID $ENV{CUBERITE_BUILD_ID})
- set(BUILD_SERIES_NAME $ENV{CUBERITE_BUILD_SERIES_NAME})
- set(BUILD_DATETIME $ENV{CUBERITE_BUILD_DATETIME})
- if(DEFINED ENV{CUBERITE_BUILD_COMMIT_ID})
- set(BUILD_COMMIT_ID $ENV{CUBERITE_BUILD_COMMIT_ID})
- else()
- message("Commit id not set, attempting to determine id from git")
- execute_process(
- COMMAND git rev-parse HEAD
- WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
- RESULT_VARIABLE GIT_EXECUTED
- OUTPUT_VARIABLE BUILD_COMMIT_ID
- )
- string(STRIP ${BUILD_COMMIT_ID} BUILD_COMMIT_ID)
- if (NOT (GIT_EXECUTED EQUAL 0))
- message(FATAL_ERROR "Could not identifiy git commit id")
- endif()
- endif()
-else()
- # This is a local build, stuff in some basic info:
- set(BUILD_ID "Unknown")
- set(BUILD_SERIES_NAME "local build")
- execute_process(
- COMMAND git rev-parse HEAD
- WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
- RESULT_VARIABLE GIT_EXECUTED
- OUTPUT_VARIABLE BUILD_COMMIT_ID
- )
- if (NOT(GIT_EXECUTED EQUAL 0))
- set(BUILD_COMMIT_ID "Unknown")
- endif()
- string(STRIP ${BUILD_COMMIT_ID} BUILD_COMMIT_ID)
- execute_process(
- COMMAND git log -1 --date=iso --pretty=format:%ai
- WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
- RESULT_VARIABLE GIT_EXECUTED
- OUTPUT_VARIABLE BUILD_DATETIME
- )
- if (NOT(GIT_EXECUTED EQUAL 0))
- set(BUILD_DATETIME "Unknown")
- endif()
- string(STRIP ${BUILD_DATETIME} BUILD_DATETIME)
-
- # The BUILD_COMMIT_ID and BUILD_DATETIME aren't updated on each repo pull
- # They are only updated when cmake re-configures the project
- # Therefore mark them as "approx: "
- set(BUILD_COMMIT_ID "approx: ${BUILD_COMMIT_ID}")
- set(BUILD_DATETIME "approx: ${BUILD_DATETIME}")
-endif()
-
# We need C++17 features
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -107,108 +43,9 @@ endif()
# Static CRT
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
-# This has to be done before any flags have been set up.
-if(${BUILD_TOOLS})
- message("Building tools")
- add_subdirectory(Tools/GrownBiomeGenVisualiser/)
- add_subdirectory(Tools/MCADefrag/)
- add_subdirectory(Tools/NoiseSpeedTest/)
- add_subdirectory(Tools/ProtoProxy/)
-endif()
-
-if(${BUILD_UNSTABLE_TOOLS})
- message("Building unstable tools")
- add_subdirectory(Tools/GeneratorPerformanceTest/)
-endif()
-
-include(SetFlags.cmake)
-set_flags()
-set_lib_flags()
-enable_profile()
-
-# Set options for SQLiteCpp, disable all their tests and lints:
-set(SQLITECPP_RUN_CPPLINT OFF CACHE BOOL "Run cpplint.py tool for Google C++ StyleGuide." FORCE)
-set(SQLITECPP_RUN_CPPCHECK OFF CACHE BOOL "Run cppcheck C++ static analysis tool." FORCE)
-set(SQLITECPP_RUN_DOXYGEN OFF CACHE BOOL "Run Doxygen C++ documentation tool." FORCE)
-set(SQLITECPP_BUILD_EXAMPLES OFF CACHE BOOL "Build examples." FORCE)
-set(SQLITECPP_BUILD_TESTS OFF CACHE BOOL "Build and run tests." FORCE)
-set(SQLITECPP_INTERNAL_SQLITE ON CACHE BOOL "Add the internal SQLite3 source to the project." FORCE)
-set(SQLITE_ENABLE_COLUMN_METADATA OFF CACHE BOOL "" FORCE)
-
-# Set options for LibEvent, disable all their tests and benchmarks:
-set(EVENT__DISABLE_OPENSSL YES CACHE BOOL "Disable OpenSSL in LibEvent" FORCE)
-set(EVENT__DISABLE_BENCHMARK YES CACHE BOOL "Disable LibEvent benchmarks" FORCE)
-set(EVENT__DISABLE_TESTS YES CACHE BOOL "Disable LibEvent tests" FORCE)
-set(EVENT__DISABLE_REGRESS YES CACHE BOOL "Disable LibEvent regression tests" FORCE)
-set(EVENT__DISABLE_SAMPLES YES CACHE BOOL "Disable LibEvent samples" FORCE)
-set(EVENT__LIBRARY_TYPE "STATIC" CACHE STRING "Use static LibEvent libraries" FORCE)
-
-# Set options for JsonCPP, disabling all of their tests:
-set(JSONCPP_WITH_TESTS OFF CACHE BOOL "Compile and (for jsoncpp_check) run JsonCpp test executables")
-set(JSONCPP_WITH_POST_BUILD_UNITTEST OFF CACHE BOOL "Automatically run unit-tests as a post build step")
-set(JSONCPP_WITH_PKGCONFIG_SUPPORT OFF CACHE BOOL "Generate and install .pc files")
-
-# Set options for mbedtls:
-set(ENABLE_PROGRAMS OFF CACHE BOOL "Build mbed TLS programs.")
-set(ENABLE_TESTING OFF CACHE BOOL "Build mbed TLS tests.")
-
-# Check that the libraries are present:
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/SQLiteCpp/CMakeLists.txt)
- message(FATAL_ERROR "SQLiteCpp is missing in folder lib/SQLiteCpp. Have you initialized the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/mbedtls/CMakeLists.txt)
- message(FATAL_ERROR "mbedTLS is missing in folder lib/mbedtls. Have you initialized the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/libevent/CMakeLists.txt)
- message(FATAL_ERROR "LibEvent is missing in folder lib/libevent. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/jsoncpp/CMakeLists.txt)
- message(FATAL_ERROR "JsonCPP is missing in folder lib/jsoncpp. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/cmake-coverage/CodeCoverage.cmake)
- message(FATAL_ERROR "cmake-coverage is missing in folder lib/cmake-coverage. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/expat/CMakeLists.txt)
- message(FATAL_ERROR "expat is missing in folder lib/expat. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/fmt/CMakeLists.txt)
- message(FATAL_ERROR "fmt is missing in folder lib/fmt. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/lua/CMakeLists.txt)
- message(FATAL_ERROR "lua is missing in folder lib/lua. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/luaexpat/CMakeLists.txt)
- message(FATAL_ERROR "luaexpat is missing in folder lib/luaexpat. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/luaproxy/CMakeLists.txt)
- message(FATAL_ERROR "luaproxy is missing in folder lib/luaproxy. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/sqlite/CMakeLists.txt)
- message(FATAL_ERROR "sqlite is missing in folder lib/sqlite. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/tolua++/CMakeLists.txt)
- message(FATAL_ERROR "tolua++ is missing in folder lib/tolua++. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/zlib/CMakeLists.txt)
- message(FATAL_ERROR "zlib is missing in folder lib/zlib. Have you initialized and updated the submodules / downloaded the extra libraries?")
-endif()
-
-# Include all the libraries
-# We use EXCLUDE_FROM_ALL so that only the explicit dependencies are compiled
-# (mbedTLS also has test and example programs in their CMakeLists.txt, we don't want those):
-add_subdirectory(lib/expat)
-add_subdirectory(lib/fmt)
-add_subdirectory(lib/jsoncpp EXCLUDE_FROM_ALL)
-add_subdirectory(lib/libevent EXCLUDE_FROM_ALL)
-add_subdirectory(lib/lua)
-add_subdirectory(lib/luaexpat)
-add_subdirectory(lib/mbedtls)
-add_subdirectory(lib/SQLiteCpp) # SQLiteCpp needs to be included before sqlite so the lsqlite target is available
-add_subdirectory(lib/sqlite)
-add_subdirectory(lib/tolua++ EXCLUDE_FROM_ALL)
-add_subdirectory(lib/zlib)
+# Add build timestamp and details:
+include("CMake/StampBuild.cmake")
-set_exe_flags()
add_executable(${CMAKE_PROJECT_NAME})
add_subdirectory(src)
@@ -222,54 +59,11 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.16")
target_precompile_headers(${CMAKE_PROJECT_NAME} PRIVATE src/Globals.h)
endif()
- if (UNITY_BUILDS)
- set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES UNITY_BUILD ON)
- endif()
+ set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES UNITY_BUILD ${UNITY_BUILDS})
else()
message(WARNING "Precompiled headers for FASTER BUILDS not enabled, upgrade to CMake 1.16 or newer!")
endif()
-# Add required includes:
-target_include_directories(
- ${CMAKE_PROJECT_NAME} SYSTEM PRIVATE
- lib/mbedtls/include
- lib/TCLAP/include
- lib # TODO fix files including zlib/x instead of x
-)
-
-# Link dependencies as private:
-target_link_libraries(
- ${CMAKE_PROJECT_NAME} PRIVATE
- event_core
- event_extra
- fmt::fmt
- jsoncpp_lib
- lsqlite
- lua
- luaexpat
- mbedtls
- SQLiteCpp
- tolualib
- zlib
-)
-
-# Link process information library:
-if (WIN32)
- target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Psapi.lib)
-endif()
-
-# Special case handling for libevent pthreads:
-if(NOT WIN32)
- target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE event_pthreads_static)
-endif()
-
-# Prettify jsoncpp_lib name in VS solution explorer:
-set_property(TARGET jsoncpp_lib PROPERTY PROJECT_LABEL "jsoncpp")
-
-if (WIN32)
- add_subdirectory(lib/luaproxy)
-endif()
-
# Selectively disable warnings in the level where the target is created:
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# Generated file has old-style casts, missing prototypes, and deprecated declarations
@@ -279,6 +73,19 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set_source_files_properties("${CMAKE_SOURCE_DIR}/src/IniFile.cpp" PROPERTIES COMPILE_OPTIONS -Wno-header-hygiene)
endif()
+if(${BUILD_TOOLS})
+ message("Building tools")
+ add_subdirectory(Tools/GrownBiomeGenVisualiser/)
+ add_subdirectory(Tools/MCADefrag/)
+ add_subdirectory(Tools/NoiseSpeedTest/)
+ add_subdirectory(Tools/ProtoProxy/)
+endif()
+
+if(${BUILD_UNSTABLE_TOOLS})
+ message("Building unstable tools")
+ add_subdirectory(Tools/GeneratorPerformanceTest/)
+endif()
+
# Self Test Mode enables extra checks at startup
if(${SELF_TEST})
message("Tests enabled")
@@ -286,7 +93,8 @@ if(${SELF_TEST})
add_subdirectory(tests)
endif()
+include("CMake/AddDependencies.cmake")
include("CMake/Fixups.cmake")
include("CMake/GenerateBindings.cmake")
include("CMake/GroupSources.cmake")
-# TODO: include("CMake/SetCompilerFlags.cmake")
+include("SetFlags.cmake")