CMake build system
This commit is contained in:
1 parent
4fed624cff
commit
4c6f3f81eb
40 files changed
+1641
No files matched your search
@@ -0,0 +1,27 @@
|
||||
include_guard(GLOBAL)
|
||||
|
||||
function(add_git_dependency SOURCE_FILE)
|
||||
set(GIT_DIR ${CMAKE_SOURCE_DIR}/.git)
|
||||
if(NOT EXISTS ${GIT_DIR})
|
||||
return()
|
||||
endif()
|
||||
|
||||
set(GIT_FILES)
|
||||
list(APPEND GIT_FILES ${GIT_DIR}/HEAD)
|
||||
list(APPEND GIT_FILES ${GIT_DIR}/packed-refs)
|
||||
|
||||
file(READ ${GIT_DIR}/HEAD GIT_HEAD)
|
||||
string(REGEX MATCH "^ref: (.+)$" HAVE_REF ${GIT_HEAD})
|
||||
if(HAVE_REF)
|
||||
set(GIT_REF_PATH ${CMAKE_MATCH_1})
|
||||
string(STRIP ${GIT_REF_PATH} GIT_REF_PATH)
|
||||
list(APPEND GIT_FILES ${GIT_DIR}/${GIT_REF_PATH})
|
||||
endif()
|
||||
|
||||
foreach(GIT_FILE IN LISTS GIT_FILES)
|
||||
if(EXISTS ${GIT_FILE})
|
||||
set_source_files_properties(${SOURCE_FILE}
|
||||
PROPERTIES OBJECT_DEPENDS ${GIT_FILE})
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
@@ -0,0 +1,23 @@
|
||||
include_guard(GLOBAL)
|
||||
|
||||
set(DETECT_ARCH_C ${CMAKE_BINARY_DIR}/detect_arch.c)
|
||||
|
||||
file(WRITE ${DETECT_ARCH_C}
|
||||
"#include \"${SOURCE_DIR}/qcommon/q_platform.h\"
|
||||
#include <stdio.h>
|
||||
int main()
|
||||
{
|
||||
puts(ARCH_STRING);
|
||||
return 0;
|
||||
}
|
||||
")
|
||||
|
||||
try_run(RUN_EXITCODE COMPILE_SUCCESS
|
||||
${CMAKE_BINARY_DIR} ${DETECT_ARCH_C}
|
||||
RUN_OUTPUT_VARIABLE ARCH)
|
||||
|
||||
string(STRIP ${ARCH} ARCH)
|
||||
|
||||
if(NOT COMPILE_SUCCESS OR RUN_EXITCODE OR NOT ARCH)
|
||||
message(FATAL_ERROR "Architecture detection failed")
|
||||
endif()
|
||||
@@ -0,0 +1,17 @@
|
||||
include_guard(GLOBAL)
|
||||
|
||||
function(disable_warnings)
|
||||
set(SOURCES ${ARGN})
|
||||
|
||||
foreach(FILE IN LISTS SOURCES)
|
||||
if(MSVC)
|
||||
# Annoyingly if you disable all warnings (/w) in combination with enabling
|
||||
# some warnings, which we and/or CMake inevitably do, this causes a
|
||||
# meta-warning D9025, so instead we have to individually disable them:
|
||||
set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS
|
||||
"/wd4131 /wd4245 /wd4100 /wd4127 /wd4244 /wd4310 /wd4457 /wd4456 /wd4701 /wd4305 /wd4189 /wd4232")
|
||||
else()
|
||||
set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS -w)
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
@@ -0,0 +1,37 @@
|
||||
include_guard(GLOBAL)
|
||||
|
||||
function(find_include_dirs OUT_VAR)
|
||||
set(SOURCES ${ARGN})
|
||||
|
||||
# Get top most common directory prefix for all source files
|
||||
set(COMMON_PATH "")
|
||||
foreach(FILE IN LISTS SOURCES)
|
||||
get_filename_component(DIR ${FILE} DIRECTORY)
|
||||
file(REAL_PATH ${DIR} DIR)
|
||||
if(COMMON_PATH STREQUAL "")
|
||||
set(COMMON_PATH ${DIR})
|
||||
else()
|
||||
string(LENGTH ${COMMON_PATH} PREFIX_LEN)
|
||||
while(NOT ${DIR} MATCHES "^${COMMON_PATH}(/|$)" AND PREFIX_LEN GREATER 0)
|
||||
string(SUBSTRING ${COMMON_PATH} 0 ${PREFIX_LEN} COMMON_PATH)
|
||||
math(EXPR PREFIX_LEN "${PREFIX_LEN} - 1")
|
||||
endwhile()
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if(NOT IS_DIRECTORY ${COMMON_PATH})
|
||||
message(FATAL_ERROR "Could not determine common directory for source files")
|
||||
endif()
|
||||
|
||||
# Recursively find directories that contain .h files under common directory
|
||||
file(GLOB_RECURSE HEADER_FILES ${COMMON_PATH}/*.h)
|
||||
set(INCLUDE_DIRS "")
|
||||
foreach(HEADER_FILE IN LISTS HEADER_FILES)
|
||||
get_filename_component(HEADER_DIR ${HEADER_FILE} DIRECTORY)
|
||||
list(APPEND INCLUDE_DIRS ${HEADER_DIR})
|
||||
endforeach()
|
||||
|
||||
list(REMOVE_DUPLICATES INCLUDE_DIRS)
|
||||
|
||||
set(${OUT_VAR} ${INCLUDE_DIRS} PARENT_SCOPE)
|
||||
endfunction()
|
||||
@@ -0,0 +1,83 @@
|
||||
include_guard(GLOBAL)
|
||||
|
||||
if(NOT BUILD_GAME_QVMS)
|
||||
return()
|
||||
endif()
|
||||
|
||||
include(ExternalProject)
|
||||
|
||||
set(TOOLS_DIR ${CMAKE_BINARY_DIR}/tools)
|
||||
|
||||
if(CMAKE_BUILD_TYPE)
|
||||
set(BUILD_TYPE_ARG -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE})
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(qvm_tools
|
||||
SOURCE_DIR ${CMAKE_SOURCE_DIR}/cmake/tools
|
||||
BINARY_DIR ${TOOLS_DIR}
|
||||
CMAKE_ARGS
|
||||
-DSOURCE_DIR=${SOURCE_DIR}
|
||||
-DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}
|
||||
-DCMAKE_MINIMUM_REQUIRED_VERSION=${CMAKE_MINIMUM_REQUIRED_VERSION}
|
||||
${BUILD_TYPE_ARG}
|
||||
INSTALL_COMMAND "")
|
||||
|
||||
set(Q3LCC ${TOOLS_DIR}/$<CONFIG>/q3lcc)
|
||||
set(Q3ASM ${TOOLS_DIR}/$<CONFIG>/q3asm)
|
||||
|
||||
function(add_qvm MODULE_NAME)
|
||||
list(REMOVE_AT ARGV 0)
|
||||
cmake_parse_arguments(ARG "" "" "DEFINITIONS;OUTPUT_NAME;OUTPUT_DIRECTORY;SOURCES" ${ARGV})
|
||||
|
||||
set(QVM_OUTPUT_DIR ${CMAKE_BINARY_DIR}/$<CONFIG>)
|
||||
if(ARG_OUTPUT_DIRECTORY)
|
||||
set(QVM_OUTPUT_DIR ${QVM_OUTPUT_DIR}/${ARG_OUTPUT_DIRECTORY})
|
||||
endif()
|
||||
add_custom_command(
|
||||
OUTPUT ${QVM_OUTPUT_DIR}
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${QVM_OUTPUT_DIR})
|
||||
|
||||
if(ARG_OUTPUT_NAME)
|
||||
set(QVM_FILE ${QVM_OUTPUT_DIR}/${ARG_OUTPUT_NAME}.qvm)
|
||||
else()
|
||||
set(QVM_FILE ${QVM_OUTPUT_DIR}/${MODULE_NAME}.qvm)
|
||||
endif()
|
||||
|
||||
set(QVM_ASM_DIR ${CMAKE_BINARY_DIR}/qvm.dir/${MODULE_NAME})
|
||||
file(MAKE_DIRECTORY ${QVM_ASM_DIR})
|
||||
|
||||
set(LCC_FLAGS "")
|
||||
foreach(DEFINITION IN LISTS ARG_DEFINITIONS)
|
||||
list(APPEND LCC_FLAGS "-D${DEFINITION}")
|
||||
endforeach()
|
||||
|
||||
set(ASM_FILES "")
|
||||
foreach(SOURCE ${ARG_SOURCES})
|
||||
if(${SOURCE} MATCHES "\\.asm$")
|
||||
list(APPEND ASM_FILES ${SOURCE})
|
||||
continue()
|
||||
endif()
|
||||
|
||||
get_filename_component(BASE_FILE ${SOURCE} NAME_WE)
|
||||
set(ASM_FILE ${QVM_ASM_DIR}/${BASE_FILE}.asm)
|
||||
string(REPLACE "${CMAKE_BINARY_DIR}/" "" ASM_FILE_COMMENT ${ASM_FILE})
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${ASM_FILE}
|
||||
COMMAND ${Q3LCC} ${LCC_FLAGS} -o ${ASM_FILE} ${SOURCE}
|
||||
DEPENDS ${SOURCE} qvm_tools
|
||||
COMMENT "Building C object ${ASM_FILE_COMMENT}")
|
||||
|
||||
list(APPEND ASM_FILES ${ASM_FILE})
|
||||
endforeach()
|
||||
|
||||
string(REPLACE "${CMAKE_BINARY_DIR}/" "" QVM_FILE_COMMENT ${QVM_FILE})
|
||||
add_custom_command(
|
||||
OUTPUT ${QVM_FILE}
|
||||
COMMAND ${Q3ASM} -o ${QVM_FILE} ${ASM_FILES}
|
||||
DEPENDS ${ASM_FILES} qvm_tools
|
||||
COMMENT "Linking C QVM library ${QVM_FILE_COMMENT}")
|
||||
|
||||
string(REGEX REPLACE "[^A-Za-z0-9]" "_" TARGET_NAME ${MODULE_NAME})
|
||||
add_custom_target(${TARGET_NAME} ALL DEPENDS ${QVM_FILE})
|
||||
endfunction()
|
||||
@@ -0,0 +1,27 @@
|
||||
include_guard(GLOBAL)
|
||||
|
||||
function(set_output_dirs TARGET)
|
||||
list(REMOVE_AT ARGV 0)
|
||||
cmake_parse_arguments(ARG "" "" "SUBDIRECTORY" ${ARGV})
|
||||
|
||||
if(CMAKE_CONFIGURATION_TYPES) # Multi-config
|
||||
set(CONFIGS ${CMAKE_CONFIGURATION_TYPES})
|
||||
else() # Single-config
|
||||
set(CONFIGS ${CMAKE_BUILD_TYPE})
|
||||
endif()
|
||||
|
||||
foreach(CONFIG ${CONFIGS})
|
||||
string(TOUPPER ${CONFIG} CONFIG_UPPER)
|
||||
|
||||
if(ARG_SUBDIRECTORY)
|
||||
set(OUT_DIR ${CMAKE_BINARY_DIR}/${CONFIG}/${ARG_SUBDIRECTORY})
|
||||
else()
|
||||
set(OUT_DIR ${CMAKE_BINARY_DIR}/${CONFIG})
|
||||
endif()
|
||||
|
||||
set_target_properties(${TARGET} PROPERTIES
|
||||
LIBRARY_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${OUT_DIR}
|
||||
RUNTIME_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${OUT_DIR}
|
||||
ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${OUT_DIR})
|
||||
endforeach()
|
||||
endfunction()
|
||||
@@ -0,0 +1,13 @@
|
||||
# Convert a shader file to a compilable C file
|
||||
|
||||
# INPUT_FILE, OUTPUT_FILE, SHADER_NAME must be set via -D
|
||||
|
||||
file(READ ${INPUT_FILE} CONTENTS)
|
||||
|
||||
string(REPLACE "\\" "\\\\" CONTENTS "${CONTENTS}") # Escape backslashes
|
||||
string(REPLACE "\"" "\\\"" CONTENTS "${CONTENTS}") # Escape double quotes
|
||||
string(REPLACE "\n" "\\n\"\n\"" CONTENTS "${CONTENTS}") # Escape newlines
|
||||
|
||||
set(OUTPUT_CONTENT "const char *fallbackShader_${SHADER_NAME} =\n\"${CONTENTS}\";\n")
|
||||
|
||||
file(WRITE ${OUTPUT_FILE} "${OUTPUT_CONTENT}")
|
||||
Reference in new issue
Block a user