1
0
Fork 0
2022-untitled-game/CMakeLists.txt

217 lines
5.3 KiB
CMake

cmake_minimum_required(VERSION 3.16)
###########################################################
# COMPILER CONFIGURATION
###########################################################
set(CMAKE_C_COMPILER "clang" CACHE STRING "C compiler" FORCE)
set(CMAKE_CXX_COMPILER "clang++" CACHE STRING "C++ compiler" FORCE)
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2")
set(DEPENDENCY_WARNINGS "-w")
set(PROJECT_WARNINGS
-Werror
-W -Wall -Wextra -Wshadow
-Wno-unused-result -Wno-unused-function -Wno-implicit-fallthrough)
set(PROJECT_PROPERTIES
C_STANDARD 99
C_STANDARD_REQUIRED 99
C_EXTENSIONS OFF)
if(UNIX)
set(PROJECT_PROPERTIES ${PROJECT_PROPERTIES} LINK_FLAGS "-Wl,-rpath,./")
endif()
###########################################################
# PROJECT
###########################################################
set(PROJECT obolos)
project(${PROJECT})
###########################################################
# DIRECTORIES
###########################################################
set(PACKAGE_DIR ${CMAKE_BINARY_DIR}/package)
set(ASSET_DIR ${CMAKE_SOURCE_DIR}/assets/processed)
set(3RD_PARTY_DIR ${CMAKE_SOURCE_DIR}/3rd_party)
set(SRC_DIR ${CMAKE_SOURCE_DIR}/code/game)
set(SHADER_DIR ${CMAKE_SOURCE_DIR}/code/shaders)
set(TOOLS_DIR ${CMAKE_SOURCE_DIR}/code/tools)
###########################################################
# 3RD PARTY LIBRARIES
###########################################################
# glad
add_subdirectory(${3RD_PARTY_DIR}/glad EXCLUDE_FROM_ALL)
set_target_properties(glad PROPERTIES COMPILE_FLAGS ${DEPENDENCY_WARNINGS})
set_target_properties(glad PROPERTIES LINK_FLAGS_RELEASE -s)
# SDL
set(SDL_SHARED ON CACHE BOOL "" FORCE)
set(SDL_STATIC OFF CACHE BOOL "" FORCE)
add_subdirectory(${3RD_PARTY_DIR}/sdl-2.0.20 EXCLUDE_FROM_ALL)
set_target_properties(SDL2 PROPERTIES COMPILE_FLAGS ${DEPENDENCY_WARNINGS})
set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE -s)
set_target_properties(SDL2main PROPERTIES COMPILE_FLAGS ${DEPENDENCY_WARNINGS})
set_target_properties(SDL2main PROPERTIES LINK_FLAGS_RELEASE -s)
###########################################################
# ASSETS
###########################################################
add_custom_target(copy_assets ALL)
add_custom_command(
TARGET copy_assets POST_BUILD
COMMAND mkdir -p ${CMAKE_BINARY_DIR}/shaders
COMMAND cp -u ${SHADER_DIR}/*.glsl ${CMAKE_BINARY_DIR}/shaders
COMMAND cp -u ${ASSET_DIR}/*.bin ${CMAKE_BINARY_DIR})
###########################################################
# BUILD CONFIGURATIONS
###########################################################
if (CMAKE_BUILD_TYPE STREQUAL "Release")
add_compile_definitions(BUILD_RELEASE)
elseif (CMAKE_BUILD_TYPE STREQUAL "Debug")
add_compile_definitions(BUILD_DEBUG)
endif()
###########################################################
# EXECUTABLE
###########################################################
set(BIN ${PROJECT})
set(BIN_SRCS ${SRC_DIR}/main.c)
set(BIN_LIBS glad SDL2 m)
add_executable(${BIN})
set_target_properties(${BIN} PROPERTIES ${PROJECT_PROPERTIES})
set_target_properties(${BIN} PROPERTIES LINK_FLAGS_RELEASE -s)
if(WIN32)
set(BIN_LIBS
${BIN_LIBS}
mingw32
SDL2main)
endif()
if (CMAKE_BUILD_TYPE STREQUAL "Release")
set(BIN_SRCS ${BIN_SRCS} ${SRC_DIR}/glsl.inc)
add_custom_command(
PRE_BUILD
OUTPUT ${SRC_DIR}/glsl.inc
COMMAND
${TOOLS_DIR}/scripts/header_generator.sh
${SRC_DIR}/glsl.inc # output
${SHADER_DIR}/geo.glsl # input
${SHADER_DIR}/screen.glsl # input
${SHADER_DIR}/text.glsl # input
DEPENDS
${SHADER_DIR}/geo.glsl
${SHADER_DIR}/screen.glsl
${SHADER_DIR}/text.glsl)
add_custom_command(
TARGET ${BIN}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E rm ${SRC_DIR}/glsl.inc)
endif()
target_sources(
${BIN}
PRIVATE
${BIN_SRCS})
target_link_libraries(
${BIN}
PRIVATE
${BIN_LIBS})
target_compile_options(
${BIN}
PRIVATE
${PROJECT_WARNINGS})
add_custom_target(
run
COMMAND ${BIN}
DEPENDS ${BIN} ${GAME} ${ENGINE}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
###########################################################
# GAME LIBRARY
###########################################################
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(GAME game)
add_library(${GAME} SHARED)
set(GAME_SRCS ${SRC_DIR}/all.c)
set(GAME_LIBS glad SDL2 m)
# Required for a valid language server compilation database to be generated with unity builds
if (CMAKE_EXPORT_COMPILE_COMMANDS)
file(GLOB GAME_SRCS
${SRC_DIR}/all.c
${SRC_DIR}/engine.c
${SRC_DIR}/game.c
${SRC_DIR}/engine/*.c
${SRC_DIR}/game/*.c)
target_compile_options(
${GAME}
PRIVATE
-include ${SRC_DIR}/all.c)
endif()
set_target_properties(${GAME} PROPERTIES ${PROJECT_PROPERTIES})
set_target_properties(${GAME} PROPERTIES LINK_FLAGS_RELEASE -s)
target_sources(
${GAME}
PRIVATE
${GAME_SRCS})
target_link_libraries(
${GAME}
PRIVATE
${GAME_LIBS})
target_compile_options(
${GAME}
PRIVATE
${PROJECT_WARNINGS})
endif()
###########################################################
# INSTALL
###########################################################
list(REMOVE_ITEM BIN_LIBS "m")
install(
TARGETS ${BIN} ${BIN_LIBS}
CONFIGURATIONS Release
RUNTIME DESTINATION ${PACKAGE_DIR}
LIBRARY DESTINATION ${PACKAGE_DIR})
install(
DIRECTORY ${ASSET_DIR}/
CONFIGURATIONS Release
DESTINATION ${PACKAGE_DIR})