284 lines
8.7 KiB
CMake
284 lines
8.7 KiB
CMake
cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
|
project(WorldSpawn C CXX)
|
|
|
|
option(BUILD_RADIANT "Build the GUI" ON)
|
|
option(BUILD_VMAP "Build the Compiler" ON)
|
|
|
|
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
|
set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/install" CACHE PATH "..." FORCE)
|
|
endif ()
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Version
|
|
#-----------------------------------------------------------------------
|
|
|
|
# CMake 3.0+ would allow this in project()
|
|
set(WorldSpawn_VERSION_MAJOR 1)
|
|
set(WorldSpawn_VERSION_MINOR 1)
|
|
set(WorldSpawn_VERSION_PATCH 0)
|
|
set(WorldSpawn_VERSION "${WorldSpawn_VERSION_MAJOR}.${WorldSpawn_VERSION_MINOR}.${WorldSpawn_VERSION_PATCH}")
|
|
|
|
#SET(CMAKE_C_COMPILER gcc-9)
|
|
#SET(CMAKE_CXX_COMPILER g++-9)
|
|
|
|
file(WRITE "${PROJECT_BINARY_DIR}/WorldSpawn_MAJOR" ${WorldSpawn_VERSION_MAJOR})
|
|
file(WRITE "${PROJECT_BINARY_DIR}/WorldSpawn_MINOR" ${WorldSpawn_VERSION_MINOR})
|
|
file(WRITE "${PROJECT_BINARY_DIR}/WorldSpawn_PATCH" ${WorldSpawn_VERSION_PATCH})
|
|
|
|
#set(WorldSpawn_ABOUTMSG "Custom build" CACHE STRING "About message")
|
|
|
|
find_package(Git REQUIRED)
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
|
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
OUTPUT_VARIABLE GIT_VERSION
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
set(WorldSpawn_VERSION_STRING "${WorldSpawn_VERSION}n")
|
|
if (GIT_VERSION)
|
|
set(WorldSpawn_VERSION_STRING "${WorldSpawn_VERSION_STRING}-git-${GIT_VERSION}")
|
|
endif ()
|
|
|
|
message(STATUS "Building ${PROJECT_NAME} ${WorldSpawn_VERSION_STRING} ${WorldSpawn_ABOUTMSG}")
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Language standard
|
|
#-----------------------------------------------------------------------
|
|
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
if (CMAKE_VERSION VERSION_LESS "3.1")
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCXX)
|
|
include(CheckCXXCompilerFlag)
|
|
check_cxx_compiler_flag(--std=c++${CMAKE_CXX_STANDARD} STD_CXX)
|
|
if (STD_CXX)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++${CMAKE_CXX_STANDARD}")
|
|
else ()
|
|
message(SEND_ERROR "Requires C++${CMAKE_CXX_STANDARD} or better")
|
|
endif ()
|
|
else ()
|
|
message(WARNING "Unrecognized compiler: ${CMAKE_CXX_COMPILER_ID}, make sure it supports C++${CMAKE_CXX_STANDARD}")
|
|
endif ()
|
|
endif ()
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Flags
|
|
#-----------------------------------------------------------------------
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti")
|
|
macro(addflags_c args)
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${args}")
|
|
endmacro()
|
|
macro(addflags_cxx args)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${args}")
|
|
endmacro()
|
|
macro(addflags args)
|
|
addflags_c("${args}")
|
|
addflags_cxx("${args}")
|
|
endmacro()
|
|
addflags("-fno-strict-aliasing")
|
|
if (NOT WIN32)
|
|
addflags("-fvisibility=hidden")
|
|
endif ()
|
|
|
|
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
|
|
#disabled due to GTK bug addflags("-Werror")
|
|
addflags("-pedantic-errors")
|
|
endif ()
|
|
|
|
addflags("-Wall")
|
|
addflags("-Wextra")
|
|
addflags("-pedantic")
|
|
|
|
addflags_c("-Wno-deprecated-declarations") # vfs.c: g_strdown
|
|
|
|
addflags("-Wno-unused-function")
|
|
addflags("-Wno-unused-variable")
|
|
addflags("-Wno-unused-parameter")
|
|
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE 1)
|
|
set(GTK_TARGET 2 CACHE STRING "GTK target")
|
|
add_definitions(-DGTK_TARGET=${GTK_TARGET})
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Defs
|
|
#-----------------------------------------------------------------------
|
|
|
|
add_definitions(-DWorldSpawn_VERSION="${WorldSpawn_VERSION}")
|
|
add_definitions(-DWorldSpawn_MAJOR_VERSION="${WorldSpawn_VERSION_MAJOR}")
|
|
add_definitions(-DWorldSpawn_MINOR_VERSION="${WorldSpawn_VERSION_MINOR}")
|
|
add_definitions(-DWorldSpawn_PATCH_VERSION="${WorldSpawn_VERSION_PATCH}")
|
|
|
|
add_definitions(-DWorldSpawn_ABOUTMSG="${WorldSpawn_ABOUT}")
|
|
|
|
if (NOT CMAKE_BUILD_TYPE MATCHES Release)
|
|
add_definitions(-D_DEBUG=1)
|
|
endif ()
|
|
|
|
macro(disable_deprecated name gtk2only)
|
|
add_definitions(-D${name}_DISABLE_SINGLE_INCLUDES)
|
|
if ((${gtk2only} EQUAL 0) OR (GTK_TARGET EQUAL 2))
|
|
add_definitions(-D${name}_DISABLE_DEPRECATED)
|
|
endif ()
|
|
endmacro()
|
|
|
|
disable_deprecated(ATK 0)
|
|
disable_deprecated(G 0)
|
|
disable_deprecated(GDK 0)
|
|
disable_deprecated(GDK_PIXBUF 0)
|
|
disable_deprecated(GTK 1)
|
|
disable_deprecated(PANGO 0)
|
|
|
|
if (APPLE)
|
|
option(XWINDOWS "Build against X11" ON)
|
|
add_definitions(
|
|
-DPOSIX=1
|
|
)
|
|
elseif (WIN32)
|
|
add_definitions(
|
|
-DWIN32=1
|
|
-D_WIN32=1
|
|
)
|
|
else ()
|
|
set(XWINDOWS ON)
|
|
add_definitions(
|
|
-DPOSIX=1
|
|
)
|
|
endif ()
|
|
|
|
if (XWINDOWS)
|
|
find_package(X11 REQUIRED)
|
|
include_directories(${X11_INCLUDE_DIR})
|
|
add_definitions(-DXWINDOWS=1)
|
|
endif ()
|
|
|
|
include_directories("${PROJECT_SOURCE_DIR}/include")
|
|
include_directories("${PROJECT_SOURCE_DIR}/libs")
|
|
|
|
# For our OpenBSD friends, because CMake isn't smart enough to figure that out?
|
|
include_directories("/usr/local/include")
|
|
link_directories("/usr/local/lib")
|
|
include_directories("/usr/X11R6/include")
|
|
link_directories("/usr/X11R6/lib")
|
|
|
|
if (WIN32 AND NOT CMAKE_CROSSCOMPILING)
|
|
set(BUNDLE_LIBRARIES_DEFAULT ON)
|
|
else ()
|
|
set(BUNDLE_LIBRARIES_DEFAULT OFF)
|
|
endif ()
|
|
option(BUNDLE_LIBRARIES "Bundle libraries" ${BUNDLE_LIBRARIES_DEFAULT})
|
|
|
|
macro(copy_dlls target)
|
|
if (BUNDLE_LIBRARIES)
|
|
add_custom_command(TARGET ${target} POST_BUILD
|
|
COMMAND bash
|
|
ARGS -c "ldd '$<TARGET_FILE:${target}>' | grep -v /c/Windows | awk '{ print $1 }' | while read dll; do cp \"$(which $dll)\" '${PROJECT_BINARY_DIR}'; done"
|
|
VERBATIM
|
|
)
|
|
endif ()
|
|
endmacro()
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Libraries
|
|
#-----------------------------------------------------------------------
|
|
|
|
add_subdirectory(libs)
|
|
add_subdirectory(include)
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Plugins
|
|
#-----------------------------------------------------------------------
|
|
|
|
if (BUILD_RADIANT)
|
|
add_subdirectory(contrib)
|
|
endif ()
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Modules
|
|
#-----------------------------------------------------------------------
|
|
|
|
if (BUILD_RADIANT)
|
|
add_subdirectory(plugins)
|
|
endif ()
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Radiant
|
|
#-----------------------------------------------------------------------
|
|
|
|
if (CMAKE_EXECUTABLE_SUFFIX)
|
|
string(REGEX REPLACE "^[.]" "" WorldSpawn_EXECUTABLE ${CMAKE_EXECUTABLE_SUFFIX})
|
|
else ()
|
|
execute_process(
|
|
COMMAND uname -m
|
|
OUTPUT_VARIABLE WorldSpawn_EXECUTABLE
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
endif ()
|
|
|
|
macro(radiant_tool name)
|
|
add_executable(${name} ${ARGN})
|
|
install(
|
|
TARGETS ${name}
|
|
RUNTIME DESTINATION .
|
|
)
|
|
if (NOT (CMAKE_EXECUTABLE_SUFFIX STREQUAL ".${WorldSpawn_EXECUTABLE}"))
|
|
add_custom_command(TARGET ${name} POST_BUILD
|
|
COMMAND ln -f -s "$<TARGET_FILE_NAME:${name}>" "${PROJECT_BINARY_DIR}/${name}.${WorldSpawn_EXECUTABLE}"
|
|
VERBATIM
|
|
)
|
|
install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
|
|
${name}${CMAKE_EXECUTABLE_SUFFIX} ${CMAKE_INSTALL_PREFIX}/${name}.${WorldSpawn_EXECUTABLE})
|
|
")
|
|
endif ()
|
|
endmacro()
|
|
|
|
if (BUILD_RADIANT)
|
|
add_subdirectory(radiant _radiant)
|
|
set_target_properties(worldspawn PROPERTIES
|
|
COMPILE_DEFINITIONS WorldSpawn_EXECUTABLE="${WorldSpawn_EXECUTABLE}"
|
|
)
|
|
endif ()
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Tools
|
|
#-----------------------------------------------------------------------
|
|
|
|
if (BUILD_VMAP)
|
|
add_subdirectory(tools)
|
|
endif ()
|
|
|
|
file(GLOB DATA_FILES "${PROJECT_SOURCE_DIR}/resources/*")
|
|
|
|
if (NOT (PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR))
|
|
# Copy data files from sources to the build directory
|
|
message(STATUS "Copying data files")
|
|
file(COPY ${DATA_FILES} DESTINATION "${PROJECT_BINARY_DIR}")
|
|
endif ()
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Install
|
|
#-----------------------------------------------------------------------
|
|
|
|
install(
|
|
FILES
|
|
"${PROJECT_BINARY_DIR}/WorldSpawn_MAJOR"
|
|
"${PROJECT_BINARY_DIR}/WorldSpawn_MINOR"
|
|
"${PROJECT_BINARY_DIR}/WorldSpawn_PATCH"
|
|
DESTINATION .
|
|
)
|
|
|
|
install(
|
|
DIRECTORY
|
|
resources/
|
|
DESTINATION .
|
|
)
|
|
|
|
install(
|
|
DIRECTORY
|
|
DESTINATION .
|
|
OPTIONAL
|
|
)
|
|
|
|
include(cmake/scripts/package.cmake)
|