summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt391
1 files changed, 154 insertions, 237 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b825a06..f952426 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,241 +1,158 @@
-# Created by Tomas Chvatal (Scarabeus IV)
-###############################################################################
-# tuxanci/CMakeLists.txt
-###############################################################################
-# ALL CONDITIONAL OPTIONS
-###############################################################################
-# -DCMAKE_C_FLAGS=-Wall # modification for CFLAGS
-# -DCMAKE_INSTALL_PREFIX=/bla/ # install prefix
-# -DCMAKE_DATA_PATH=/other/bla/ # install path for data
-# -DCMAKE_CONF_PATH=/etc # install path for conf
-# -DLIB_INSTALL_DIR=/other/bla # install path for lib
-# -DCMAKE_DOC_PATH=/other/bla/doc/tuxanci-version/ # install path for doc
-# -DCMAKE_LOCALE_PATH=/other/bla # install path for locale
-###############################################################################
-# DEFAULT OPTIONS
-###############################################################################
-OPTION (BUILD_SERVER "Build the server instead of client" OFF)
-OPTION (ENABLE_IPV6 "Build with the ipv6 support" ON)
-OPTION (WITH_AUDIO "Build with audio enabled" ON)
-OPTION (ENABLE_DEBUG "Build debug features" ON)
-OPTION (DEVELOPER "Modify stuff to please tuxanci devs" OFF)
-MARK_AS_ADVANCED ( DEVELOPER )
-OPTION (WITH_NLS "Build the translations" ON)
-OPTION (WITH_PHYSFS "Use physfs engine for unpacking (instead of libzip)" OFF)
-OPTION (Apple "Build some apple quirks. USE ONLY ON MAC!" OFF)
-MARK_AS_ADVANCED ( Apple )
-OPTION (WITH_OPENGL "Use opengl as renderer instead of SW" ON)
-OPTION (CROSSCOMPILE "Crosscompile tuxanci defined by ENV{TARGET}" OFF)
-MARK_AS_ADVANCED ( CROSSCOMPILE )
-###############################################################################
-# IMPORTANT DEFINITIONS [PREFIX,...]
-###############################################################################
-SET ( WORKDIR ${CMAKE_SOURCE_DIR}/src )
-# data because some distributions want different data placement
-SET ( CMAKE_CONF_PATH "/etc" CACHE PATH "Config path prefix" )
-IF ( WIN32 )
- SET ( CMAKE_INSTALL_PREFIX "/" CACHE PATH "Install path prefix" )
- SET ( CMAKE_LOCALE_PATH "locale" CACHE PATH "Locale path prefix" )
-ELSE ( WIN32 )
- SET ( CMAKE_INSTALL_PREFIX "/usr/local/" CACHE PATH "Install path prefix" )
- SET ( CMAKE_LOCALE_PATH "${CMAKE_INSTALL_PREFIX}/share/locale" CACHE PATH "Locale path prefix" )
-ENDIF ( WIN32 )
-SET ( CMAKE_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/" CACHE PATH "Data path prefix" )
-###############################################################################
-# BASIC PROJECT VALUES
-###############################################################################
-PROJECT ( tuxanci C )
-IF ( BUILD_SERVER )
- SET ( APPNAME "tuxanci-server")
-ELSE ( BUILD_SERVER )
- SET ( APPNAME "tuxanci" )
-ENDIF ( BUILD_SERVER )
-CMAKE_MINIMUM_REQUIRED ( VERSION 2.6.0 )
-CMAKE_MINIMUM_REQUIRED ( VERSION 2.6.0 FATAL_ERROR )
-INCLUDE (cmake/MacroAddSources.cmake)
-IF ( COMMAND cmake_policy )
- cmake_policy( SET CMP0003 NEW )
-ENDIF ( COMMAND cmake_policy )
-SET ( CMAKE_COLOR_MAKEFILE ON )
-SET ( CMAKE_BUILD_TYPE_SHARED_LIBS ON )
-SET ( CMAKE_C_FLAGS $ENV{CFLAGS} )
-SET ( CMAKE_CXX_FLAGS $ENV{CXXFLAGS} )
-SET ( CMAKE_LINK_FLAGS $ENV{LDFLAGS} )
-IF ( CROSSCOMPILE )
- SET ( CMAKE_C_COMPILER "$ENV{TARGET}-gcc" )
- SET ( CMAKE_CXX_COMPILER "$ENV{TARGET}-g++" )
- MESSAGE ( "CROSSCOMPILE with gcc to target: $ENV{TARGET}" )
-ENDIF ( CROSSCOMPILE )
-# this specify location of additional cmake sources
-SET ( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" )
-#various variables
-SET ( CMAKE_INSTALL_ETCDIR ${CMAKE_CONF_PATH} )
-IF ( WIN32 )
- SET ( CMAKE_DOC_PATH "doc/" CACHE PATH "Doc path prefix" )
- SET ( CMAKE_INSTALL_LOCALEDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_LOCALE_PATH} )
- SET ( CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_DOC_PATH} )
-ELSE ( WIN32 )
- SET ( CMAKE_DOC_PATH "${CMAKE_INSTALL_PREFIX}/share/doc/${APPNAME}" CACHE PATH "Doc path prefix" )
- SET ( CMAKE_INSTALL_LOCALEDIR ${CMAKE_LOCALE_PATH} )
- SET ( CMAKE_INSTALL_DOCDIR ${CMAKE_DOC_PATH} )
-ENDIF ( WIN32 )
-SET ( CMAKE_INSTALL_BINDIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Binary path prefix" )
-SET ( CMAKE_INSTALL_ICONDIR "${CMAKE_INSTALL_PREFIX}/share/pixmaps" CACHE PATH "Icon path prefix" )
-SET ( CMAKE_INSTALL_DESKTOPDIR "share/applications" CACHE PATH "Desktop file path prefix")
-SET ( CMAKE_INSTALL_DATADIR ${CMAKE_DATA_PATH} )
-# defines to determine if we build package or not
-IF ( PACKAGE )
- ADD_DEFINITIONS ( -DBUILD_PACKAGE )
-ENDIF ( PACKAGE )
-# uninstall
-CONFIGURE_FILE (
- "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
- "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
- IMMEDIATE @ONLY )
-ADD_CUSTOM_TARGET ( uninstall "${CMAKE_COMMAND}"
- -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" )
-###############################################################################
-# CPACK
-###############################################################################
-INCLUDE ( InstallRequiredSystemLibraries )
-SET ( CPACK_PACKAGE_DESCRIPTION_SUMMARY "Tuxanci is first tux shooter inspired by game Bulanci." )
-SET ( CPACK_PACKAGE_VENDOR "Tuxanci team <team@tuxanci.org>" )
-SET ( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENCE" )
-SET ( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README" )
-SET ( CPACK_GENERATOR "TGZ" )
-SET ( CPACK_SOURCE_GENERATOR "TGZ" )
-SET ( CPACK_PACKAGE_VERSION_MAJOR "0" )
-SET ( CPACK_PACKAGE_VERSION_MINOR "2" )
-SET ( CPACK_PACKAGE_VERSION_PATCH "99" )
-SET ( TUXANCI_VERSION
- "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}"
+# Tuxanci 2 - A first person shooter
+# Copyright (C) 2007-2011 Tuxánci Development Team
+# Copyright (C) 2025-2026 Connor Thomson
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+cmake_minimum_required(VERSION 3.12)
+
+project(tuxanci2 VERSION 0.29.0 LANGUAGES C)
+
+option(UNIX_LIKE "Enable features exclusive to UNIX-like systems" ${CMAKE_HOST_UNIX})
+option(ENABLE_AUDIO "Enable audio" ON)
+
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+set(CMAKE_C_EXTENSIONS OFF)
+
+include(CompileShaders)
+
+configure_file(${CMAKE_SOURCE_DIR}/include/version.h.in
+ ${CMAKE_BINARY_DIR}/include/version.h
+ @ONLY)
+
+file(GLOB_RECURSE C_SRC_FILES CONFIGURE_DEPENDS "src/*.c")
+file(GLOB_RECURSE SLANG_SRC_FILES CONFIGURE_DEPENDS "shaders/*.slang")
+
+set(DATA_FILES
+ "${CMAKE_SOURCE_DIR}/data/images/background.png"
+ "${CMAKE_SOURCE_DIR}/data/fonts/DejaVuSans.ttf"
+ "${CMAKE_SOURCE_DIR}/data/music/theme.it"
+ "${CMAKE_SOURCE_DIR}/data/models/teapot.obj"
+ "${CMAKE_SOURCE_DIR}/data/models/dounut.obj"
)
-MARK_AS_ADVANCED ( TUXANCI_VERSION )
-SET ( CPACK_STRIP_FILES "src/tuxanci" )
-SET ( CPACK_SET_DESTDIR "ON" )
-SET ( CPACK_SOURCE_PACKAGE_FILE_NAME "tuxanci-${TUXANCI_VERSION}" )
-SET ( CPACK_SOURCE_IGNORE_FILES
- "~$"
- ".git"
- "build/"
- "packaging/"
- "scripts/"
- "tuxanci.1"
+foreach(DATA_FILE ${DATA_FILES})
+ if(NOT EXISTS "${DATA_FILE}")
+ message(FATAL_ERROR "Required data file not found: ${DATA_FILE}")
+ endif()
+endforeach()
+
+add_executable(${PROJECT_NAME} ${C_SRC_FILES})
+
+target_include_directories(${PROJECT_NAME} PRIVATE
+ include
+ ${CMAKE_BINARY_DIR}/include
)
-SET ( CPACK_SOURCE_STRIP_FILES "" )
-INCLUDE ( CPack )
-###############################################################################
-# DEBUG/DEVELOPER STUFF
-###############################################################################
-IF ( ENABLE_DEBUG )
- SET ( CMAKE_C_FLAGS "-g -O0 -Wall -pipe -ggdb")
- ADD_DEFINITIONS ( -DDEBUG )
- # SET ( CMAKE_VERBOSE_MAKEFILE on )
-ENDIF ( ENABLE_DEBUG )
-IF ( DEVELOPER )
- ADD_DEFINITIONS ( -DDEBUG )
- # if somebody asks yes i am insane
- SET ( CMAKE_C_FLAGS "-g -ggdb -O0 -pipe -Wall -Wshadow -Wall -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline -Wformat-nonliteral -Wformat-security -Wswitch-enum -Wswitch-default -Winit-self -Wmissing-include-dirs -Wundef -Waggregate-return -Wmissing-format-attribute -Wnested-externs -Wunsafe-loop-optimizations" )
-ENDIF ( DEVELOPER )
-###############################################################################
-# BASIC DIRECTORIES FOR INCLUSION
-###############################################################################
-INCLUDE_DIRECTORIES ( ${WORKDIR}/base )
-INCLUDE_DIRECTORIES ( ${WORKDIR}/net )
-###############################################################################
-# CLIENT STUFF
-###############################################################################
-IF ( NOT BUILD_SERVER )
- INCLUDE_DIRECTORIES ( ${WORKDIR}/client )
- INCLUDE_DIRECTORIES ( ${WORKDIR}/screen )
- INCLUDE_DIRECTORIES ( ${WORKDIR}/widget )
-ENDIF ( NOT BUILD_SERVER )
-###############################################################################
-# SERVER STUFF (Basicly overriding default client values)
-###############################################################################
-IF ( BUILD_SERVER )
- ADD_DEFINITIONS ( -DPUBLIC_SERVER )
- ADD_DEFINITIONS ( -DNO_SOUND )
- INCLUDE_DIRECTORIES ( ${WORKDIR}/server )
-ENDIF ( BUILD_SERVER )
-###############################################################################
-# APPLE QUIRKS
-###############################################################################
-IF ( Apple )
- SET ( CMAKE_OSX_ARCHITECTURES "ppc;i386" )
- SET ( CACHE_INTERNAL "OSX Architectures" FORCE )
- ADD_DEFINITIONS ( -DAPPLE )
-ENDIF ( Apple )
-###############################################################################
-# LIBS SEARCH
-###############################################################################
-MESSAGE ( STATUS "<Loading PkgConfig>" )
-FIND_PACKAGE ( PkgConfig REQUIRED )
-IF ( WITH_PHYSFS )
- FIND_PACKAGE ( PhysFS REQUIRED )
- INCLUDE_DIRECTORIES( ${PHYSFS_INCLUDE_DIR} )
-ELSE ( WITH_PHYSFS )
- pkg_check_modules(ZIP REQUIRED libzip)
- INCLUDE_DIRECTORIES( ${ZIP_INCLUDE_DIRS} )
-ENDIF ( WITH_PHYSFS )
-
-IF ( NOT BUILD_SERVER )
- # cairo not needed until we start actually using the svg files
- #pkg_check_modules(CAIRO REQUIRED cairo>=1.8.8)
- #pkg_check_modules(CAIRO_SVG REQUIRED cairo-svg>=1.8.8)
- INCLUDE_DIRECTORIES( ${CAIRO_INCLUDE_DIRS} )
- pkg_check_modules(FONTCONFIG REQUIRED fontconfig)
- INCLUDE_DIRECTORIES ( ${FONTCONFIG_INCLUDE_DIRS} )
- IF ( WITH_OPENGL )
- pkg_check_modules(OPENGL REQUIRED gl>=7.5)
- INCLUDE_DIRECTORIES ( ${OPENGL_INCLUDE_DIRS} )
- ENDIF ( WITH_OPENGL )
- pkg_check_modules(SDL REQUIRED sdl)
- INCLUDE_DIRECTORIES ( ${SDL_INCLUDE_DIRS} )
- pkg_check_modules(SDLIMAGE REQUIRED SDL_image)
- INCLUDE_DIRECTORIES ( ${SDLIMAGE_INCLUDE_DIRS} )
- #pkg_check_modules(SDLTTF REQUIRED SDL_ttf) # WTF NO PkgConfig module?!
- FIND_PACKAGE ( SDL_ttf REQUIRED )
- INCLUDE_DIRECTORIES ( ${SDLTTF_INCLUDE_DIR} )
- IF ( WITH_AUDIO )
- pkg_check_modules(SDLMIXER REQUIRED SDL_mixer)
- INCLUDE_DIRECTORIES ( ${SDLMIXER_INCLUDE_DIRS} )
- ENDIF ( WITH_AUDIO )
-ENDIF ( NOT BUILD_SERVER )
-###############################################################################
-# GETTEXT SUPPORT
-###############################################################################
-IF ( WITH_NLS )
- MESSAGE ( STATUS "<Building with NLS as requested>" )
- ADD_DEFINITIONS ( -DNLS )
- ADD_SUBDIRECTORY ( po )
-ENDIF ( WITH_NLS )
-###############################################################################
-# COMPILATION ITSELF
-###############################################################################
-CONFIGURE_FILE ( ${WORKDIR}/base/path.h.in ${CMAKE_BINARY_DIR}/src/base/path.h )
-ADD_SUBDIRECTORY ( src )
-###############################################################################
-# DATA INSTALLATION
-###############################################################################
-ADD_SUBDIRECTORY ( data )
-SET ( tuxanci_docs
- ${CMAKE_CURRENT_SOURCE_DIR}/LICENCE
- ${CMAKE_CURRENT_SOURCE_DIR}/AUTHORS
- ${CMAKE_CURRENT_SOURCE_DIR}/README
+
+target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -pedantic)
+
+target_compile_options(${PROJECT_NAME} PRIVATE
+ -g
+ $<$<COMPILE_LANG_AND_ID:C,GNU,Clang>:-fdebug-prefix-map=${CMAKE_SOURCE_DIR}/src=>
)
-INSTALL ( FILES ${tuxanci_docs} DESTINATION ${CMAKE_INSTALL_DOCDIR}/ )
-###############################################################################
-# GOODBYE INFORMATIONS (VARIABLES SETTINGS)
-###############################################################################
-MESSAGE ( STATUS "<Printing out environment settings>" )
-MESSAGE ( STATUS "<******************************>" )
-MESSAGE ( STATUS "CFlags: ${CMAKE_C_FLAGS}" )
-MESSAGE ( STATUS "LDFLAGS: ${CMAKE_LINK_FLAGS}" )
-MESSAGE ( STATUS "PREFIX: ${CMAKE_INSTALL_PREFIX}" )
-MESSAGE ( STATUS "ETC directory: ${CMAKE_CONF_PATH}" )
-MESSAGE ( STATUS "DOC directory: ${CMAKE_DOC_PATH}" )
-MESSAGE ( STATUS "LOCALE directory: ${CMAKE_INSTALL_LOCALEDIR}" )
-MESSAGE ( STATUS "DATA directory: ${CMAKE_INSTALL_DATADIR}" )
-###############################################################################
+if(EMSCRIPTEN)
+ set(UNIX_LIKE OFF)
+ set(ENABLE_AUDIO OFF)
+ set_target_properties(${PROJECT_NAME} PROPERTIES SUFFIX ".html")
+ target_compile_options(${PROJECT_NAME} PRIVATE -sUSE_SDL=3 -sUSE_SDL_TTF=3)
+ target_link_options(${PROJECT_NAME} PRIVATE
+ -sUSE_SDL=3
+ -sUSE_SDL_TTF=3
+ -sENVIRONMENT=web
+ -sWASM=1
+ )
+ set_target_properties(${PROJECT_NAME} PROPERTIES
+ LINK_FLAGS "--shell-file ${CMAKE_SOURCE_DIR}/em/${PROJECT_NAME}.html"
+ )
+
+ add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_SOURCE_DIR}/em/${PROJECT_NAME}.css
+ ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.css
+ )
+else()
+ if(UNIX_LIKE)
+ message(STATUS "UNIX_LIKE: ON")
+ target_compile_definitions(${PROJECT_NAME} PRIVATE UNIX_LIKE)
+
+ find_package(Threads REQUIRED)
+ find_package(PkgConfig REQUIRED)
+
+ pkg_check_modules(UNWIND REQUIRED libunwind)
+ target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads ${UNWIND_LIBRARIES})
+ target_include_directories(${PROJECT_NAME} PRIVATE ${UNWIND_INCLUDE_DIRS})
+ target_compile_options(${PROJECT_NAME} PRIVATE ${UNWIND_CFLAGS_OTHER})
+
+ pkg_check_modules(DW REQUIRED libdw)
+ target_link_libraries(${PROJECT_NAME} PRIVATE ${DW_LIBRARIES})
+ target_include_directories(${PROJECT_NAME} PRIVATE ${DW_INCLUDE_DIRS})
+ target_compile_options(${PROJECT_NAME} PRIVATE ${DW_CFLAGS_OTHER})
+ else()
+ message(STATUS "UNIX_LIKE: OFF")
+ endif()
+
+ if(WIN32)
+ set(ENABLE_AUDIO OFF)
+
+ find_package(SDL3 CONFIG REQUIRED)
+ find_package(SDL3_ttf CONFIG REQUIRED)
+
+ target_link_libraries(${PROJECT_NAME} PRIVATE
+ SDL3::SDL3
+ SDL3_ttf::SDL3_ttf
+ )
+
+ add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "$<TARGET_FILE:SDL3::SDL3>"
+ "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "$<TARGET_FILE:SDL3_ttf::SDL3_ttf>"
+ "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
+ )
+ else()
+ pkg_check_modules(SDL REQUIRED sdl3)
+ target_link_libraries(${PROJECT_NAME} PRIVATE ${SDL_LIBRARIES} m)
+ target_include_directories(${PROJECT_NAME} PRIVATE ${SDL_INCLUDE_DIRS})
+ target_compile_options(${PROJECT_NAME} PRIVATE ${SDL_CFLAGS_OTHER})
+
+ pkg_check_modules(SDL_TTF REQUIRED sdl3-ttf)
+ target_link_libraries(${PROJECT_NAME} PRIVATE ${SDL_TTF_LIBRARIES})
+ target_include_directories(${PROJECT_NAME} PRIVATE ${SDL_TTF_INCLUDE_DIRS})
+ target_compile_options(${PROJECT_NAME} PRIVATE ${SDL_TTF_CFLAGS_OTHER})
+ endif()
+
+ if(ENABLE_AUDIO)
+ message(STATUS "ENABLE_AUDIO: ON")
+ target_compile_definitions(${PROJECT_NAME} PRIVATE ENABLE_AUDIO)
+
+ pkg_check_modules(OPENAL REQUIRED openal)
+ target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENAL_LIBRARIES})
+ target_include_directories(${PROJECT_NAME} PRIVATE ${OPENAL_INCLUDE_DIRS})
+ target_compile_options(${PROJECT_NAME} PRIVATE ${OPENAL_CFLAGS_OTHER})
+
+ pkg_check_modules(OPENMPT REQUIRED libopenmpt)
+ target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENMPT_LIBRARIES})
+ target_include_directories(${PROJECT_NAME} PRIVATE ${OPENMPT_INCLUDE_DIRS})
+ target_compile_options(${PROJECT_NAME} PRIVATE ${OPENMPT_CFLAGS_OTHER})
+ else()
+ message(STATUS "ENABLE_AUDIO: OFF")
+ endif()
+endif()
+
+target_compile_shaders(${PROJECT_NAME} SHADERS ${SLANG_SRC_FILES})
+target_embed_files(${PROJECT_NAME} FILES ${DATA_FILES}) \ No newline at end of file