CMAKE_MINIMUM_REQUIRED(VERSION 3.10) IF(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) ENDIF() #FindMySQL is located here so lets make it so CMake can find it SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/" ${CMAKE_MODULE_PATH}) #Our project name is EQEmu PROJECT(EQEmu) #Default build type is set to RelWithDebInfo for generators that honor that like makefiles IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE) ENDIF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/dependencies" "${CMAKE_PREFIX_PATH}") SET(CMAKE_CXX_STANDARD 14) SET(CMAKE_CXX_STANDARD_REQUIRED ON) SET(CMAKE_CXX_EXTENSIONS OFF) IF(MSVC) ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) #crash logging currently only works on windows x86/x64 OPTION(EQEMU_ENABLE_CRASH_LOGGING "Enable crash logging" ON) IF(EQEMU_ENABLE_CRASH_LOGGING) ADD_DEFINITIONS(-DCRASH_LOGGING) ENDIF(EQEMU_ENABLE_CRASH_LOGGING) OPTION(EQEMU_BUILD_MSVC_MP "Enable build with multiple processes." ON) IF(EQEMU_BUILD_MSVC_MP) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") ENDIF(EQEMU_BUILD_MSVC_MP) ADD_DEFINITIONS(-DNOMINMAX) ELSE(MSVC) #Normally set by perl but we don't use the perl flags anymore so we set it. ADD_DEFINITIONS(-DHAS_UNION_SEMUN) ENDIF(MSVC) #FreeBSD support IF(UNIX) IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") ADD_DEFINITIONS(-DFREEBSD) ADD_DEFINITIONS(-D_GLIBCXX_USE_C99) SET(FREEBSD TRUE) ENDIF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") IF(CMAKE_SYSTEM_NAME MATCHES "Darwin") ADD_DEFINITIONS(-DDARWIN) SET(DARWIN TRUE) ENDIF(CMAKE_SYSTEM_NAME MATCHES "Darwin") ENDIF(UNIX) #NPC Types Cache Behavior OPTION(EQEMU_DEPOP_INVALIDATES_CACHE "#repop invalidates the npc_types cache (will cause a larger database hit on #repop but is more convienent)." ON) #Bots are a compile time option so on/off OPTION(EQEMU_ENABLE_BOTS "Enable Bots" OFF) #Enable GM Command log system OPTION(EQEMU_COMMANDS_LOGGING "Enable GM Command logs" ON) IF(EQEMU_COMMANDS_LOGGING) ADD_DEFINITIONS(-DCOMMANDS_LOGGING) ENDIF(EQEMU_COMMANDS_LOGGING) IF(EQEMU_ENABLE_BOTS) ADD_DEFINITIONS(-DBOTS) ENDIF(EQEMU_ENABLE_BOTS) #What to build OPTION(EQEMU_BUILD_SERVER "Build the game server." ON) OPTION(EQEMU_BUILD_HC "Build the headless client." OFF) OPTION(EQEMU_BUILD_TESTS "Build utility tests." OFF) OPTION(EQEMU_BUILD_CLIENT_FILES "Build Client Import/Export Data Programs." ON) ADD_DEFINITIONS(-DGLM_FORCE_RADIANS) ADD_DEFINITIONS(-DGLM_FORCE_CTOR_INIT) ADD_DEFINITIONS(-DGLM_ENABLE_EXPERIMENTAL) #Find everything we need FIND_PACKAGE(MySQL REQUIRED) FIND_PACKAGE(Boost REQUIRED) FIND_PACKAGE(ZLIB) FIND_PACKAGE(OpenSSL) FIND_PACKAGE(Lua51) FIND_PACKAGE(PerlLibs) FIND_PACKAGE(Sodium) FIND_PACKAGE(mbedTLS) MESSAGE(STATUS "**************************************************") MESSAGE(STATUS "* Library Detection *") MESSAGE(STATUS "**************************************************") IF(ZLIB_FOUND) MESSAGE(STATUS "* ZLIB: FOUND *") ELSE() MESSAGE(STATUS "* ZLIB: MISSING *") ENDIF() IF(OpenSSL_FOUND) MESSAGE(STATUS "* OpenSSL: FOUND *") ELSE() MESSAGE(STATUS "* OpenSSL: MISSING *") ENDIF() IF(Lua51_FOUND) MESSAGE(STATUS "* Lua: FOUND *") ELSE() MESSAGE(STATUS "* Lua: MISSING *") ENDIF() IF(PerlLibs_FOUND) MESSAGE(STATUS "* Perl: FOUND *") ELSE() MESSAGE(STATUS "* Perl: MISSING *") ENDIF() IF(SODIUM_FOUND) MESSAGE(STATUS "* libsodium: FOUND *") ELSE() MESSAGE(STATUS "* libsodium: MISSING *") ENDIF() IF(MBEDTLS_FOUND) MESSAGE(STATUS "* mbedTLS: FOUND *") ELSE() MESSAGE(STATUS "* mbedTLS: MISSING *") ENDIF() MESSAGE(STATUS "**************************************************") SET(SERVER_LIBS common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${Boost_LIBRARIES} uv_a fmt RecastNavigation::Detour) IF(WIN32) SET(SERVER_LIBS ${SERVER_LIBS} "ws2_32" "psapi" "iphlpapi" "userenv") ENDIF() IF(UNIX) SET(SERVER_LIBS ${SERVER_LIBS} ${CMAKE_DL_LIBS} "z" "m" "pthread") IF(NOT DARWIN) SET(SERVER_LIBS ${SERVER_LIBS} "rt") ENDIF() SET(SERVER_LIBS ${SERVER_LIBS} "uuid") ENDIF() IF(ZLIB_FOUND) OPTION(EQEMU_BUILD_ZLIB "Build internal version of zlib." OFF) IF(EQEMU_BUILD_ZLIB) INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/zlibng") SET(SERVER_LIBS ${SERVER_LIBS} "zlibstatic") ELSE() INCLUDE_DIRECTORIES(SYSTEM "${ZLIB_INCLUDE_DIRS}") SET(SERVER_LIBS ${SERVER_LIBS} ${ZLIB_LIBRARY}) ENDIF() ELSE() INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/zlibng") SET(SERVER_LIBS ${SERVER_LIBS} "zlibstatic") ENDIF() IF(PerlLibs_FOUND) OPTION(EQEMU_BUILD_PERL "Build Perl parser." ON) IF(EQEMU_BUILD_PERL) INCLUDE_DIRECTORIES(SYSTEM "${PERL_INCLUDE_PATH}") SET(SERVER_LIBS ${SERVER_LIBS} "${PERL_LIBRARY}") ADD_DEFINITIONS(-DEMBPERL) ADD_DEFINITIONS(-DEMBPERL_PLUGIN) ENDIF(EQEMU_BUILD_PERL) ENDIF() IF(Lua51_FOUND) OPTION(EQEMU_BUILD_LUA "Build Lua parser." ON) IF(EQEMU_BUILD_LUA) INCLUDE_DIRECTORIES(SYSTEM "${LUA_INCLUDE_DIR}") INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/luabind") SET(SERVER_LIBS ${SERVER_LIBS} "${LUA_LIBRARY}" luabind) ADD_DEFINITIONS(-DLUA_EQEMU) OPTION(EQEMU_SANITIZE_LUA_LIBS "Sanitize Lua Libraries (Remove OS and IO standard libraries from being able to run)." ON) IF(EQEMU_SANITIZE_LUA_LIBS) ADD_DEFINITIONS(-DSANITIZE_LUA_LIBS) ENDIF(EQEMU_SANITIZE_LUA_LIBS) ENDIF(EQEMU_BUILD_LUA) ENDIF() IF(OpenSSL_FOUND OR MBEDTLS_FOUND) OPTION(EQEMU_BUILD_LOGIN "Build the login server." ON) IF(OpenSSL_FOUND AND MBEDTLS_FOUND) SET(EQEMU_CRYPTO_LIB mbedTLS CACHE STRING "Crypto library to use: OpenSSL mbedTLS" ) IF(EQEMU_CRYPTO_LIB STREQUAL "OpenSSL") INCLUDE_DIRECTORIES(SYSTEM "${OPENSSL_INCLUDE_DIR}") SET(SERVER_LIBS ${SERVER_LIBS} ${OPENSSL_LIBRARIES}) ADD_DEFINITIONS(-DEQEMU_USE_OPENSSL) ELSEIF(EQEMU_CRYPTO_LIB STREQUAL "mbedTLS") INCLUDE_DIRECTORIES(SYSTEM "${MBEDTLS_INCLUDE_DIR}") SET(SERVER_LIBS ${SERVER_LIBS} ${MBEDTLS_LIBRARY} ${MBEDX509_LIBRARY} ${MBEDCRYPTO_LIBRARY}) ADD_DEFINITIONS(-DEQEMU_USE_MBEDTLS) ELSE() MESSAGE(FATAL_ERROR "Unknown crypto library set, must be one of these: mbedTLS, OpenSSL") ENDIF() ELSEIF(OpenSSL_FOUND) INCLUDE_DIRECTORIES(SYSTEM "${OPENSSL_INCLUDE_DIR}") SET(SERVER_LIBS ${SERVER_LIBS} ${OPENSSL_LIBRARIES}) ADD_DEFINITIONS(-DEQEMU_USE_OPENSSL) ELSEIF(MBEDTLS_FOUND) INCLUDE_DIRECTORIES(SYSTEM "${MBEDTLS_INCLUDE_DIR}") SET(SERVER_LIBS ${SERVER_LIBS} ${MBEDTLS_LIBRARY} ${MBEDX509_LIBRARY} ${MBEDCRYPTO_LIBRARY}) ADD_DEFINITIONS(-DEQEMU_USE_MBEDTLS) ENDIF() ENDIF() IF(SODIUM_FOUND AND EQEMU_BUILD_LOGIN) OPTION(EQEMU_ENABLE_SECURITY "Use libsodium for stronger password hashing" ON) IF(EQEMU_ENABLE_SECURITY) INCLUDE_DIRECTORIES(SYSTEM "${SODIUM_INCLUDE_DIRS}") SET(SERVER_LIBS ${SERVER_LIBS} ${SODIUM_LIBRARIES}) ADD_DEFINITIONS(-DENABLE_SECURITY) ENDIF() ENDIF() INCLUDE_DIRECTORIES(SYSTEM "${MySQL_INCLUDE_DIR}") INCLUDE_DIRECTORIES(SYSTEM "${Boost_INCLUDE_DIRS}") INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/glm") INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/cereal/include") INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/fmt/include") INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/libuv/include" ) INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/DebugUtils/Include") INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/Detour/Include") INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/DetourCrowd/Include") INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/DetourTileCache/Include") INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/Recast/Include") INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/websocketpp") IF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS OR EQEMU_BUILD_HC) ADD_SUBDIRECTORY(common) ADD_SUBDIRECTORY(libs) ADD_SUBDIRECTORY(submodules/fmt) ADD_SUBDIRECTORY(submodules/libuv) IF(EQEMU_BUILD_ZLIB) SET(ZLIB_COMPAT ON CACHE BOOL "Compile with zlib compatible API") SET(ZLIB_ENABLE_TESTS OFF CACHE BOOL "Build test binaries") ADD_SUBDIRECTORY(submodules/zlibng) ENDIF() SET(RECASTNAVIGATION_DEMO OFF CACHE BOOL "Build demo") SET(RECASTNAVIGATION_TESTS OFF CACHE BOOL "Build tests") SET(RECASTNAVIGATION_EXAMPLES OFF CACHE BOOL "Build examples") ADD_SUBDIRECTORY(submodules/recastnavigation) ENDIF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS OR EQEMU_BUILD_HC) IF(EQEMU_BUILD_SERVER) ADD_SUBDIRECTORY(shared_memory) ADD_SUBDIRECTORY(world) ADD_SUBDIRECTORY(zone) ADD_SUBDIRECTORY(ucs) ADD_SUBDIRECTORY(queryserv) ADD_SUBDIRECTORY(eqlaunch) ENDIF(EQEMU_BUILD_SERVER) IF(EQEMU_BUILD_LOGIN) ADD_SUBDIRECTORY(loginserver) ENDIF(EQEMU_BUILD_LOGIN) IF(EQEMU_BUILD_HC) ADD_SUBDIRECTORY(hc) ENDIF(EQEMU_BUILD_HC) IF(EQEMU_BUILD_TESTS) ADD_SUBDIRECTORY(tests) ENDIF(EQEMU_BUILD_TESTS) IF(EQEMU_BUILD_CLIENT_FILES) ADD_SUBDIRECTORY(client_files) ENDIF(EQEMU_BUILD_CLIENT_FILES)