diff --git a/.gitignore b/.gitignore index 1bdabf40..fcd9394a 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ DOOM*.pcx HTIC*.pcx HEXEN*.pcx STRIFE*.pcx +/build* # These are the default patterns globally ignored by Subversion: *.o diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..58c200b6 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,70 @@ +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +cmake_minimum_required(VERSION 3.7.2) +project("Chocolate Doom" VERSION 3.0.0 LANGUAGES C) + +# Autotools variables +set(top_srcdir ${CMAKE_CURRENT_SOURCE_DIR}) +set(top_builddir ${CMAKE_CURRENT_BINARY_DIR}) + +# AC_INIT variables +set(PACKAGE_NAME "${PROJECT_NAME}") +set(PACKAGE_TARNAME "chocolate-doom") +set(PACKAGE_VERSION "${PROJECT_VERSION}") +set(PACKAGE_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") +set(PACKAGE_BUGREPORT "chocolate-doom-dev-list@chocolate-doom.org") + +string(REGEX REPLACE " Doom$" "" PACKAGE_SHORTNAME "${PACKAGE_NAME}") +set(PACKAGE_COPYRIGHT "Copyright (C) 1993-2017") +set(PACKAGE_LICENSE "GNU General Public License, version 2") + +# Any settings that should apply to all targets in this directory and all +# subdirectories should go here. Use judiciously. +if(MSVC) + add_definitions("/D_CRT_SECURE_NO_WARNINGS" "/D_CRT_SECURE_NO_DEPRECATE" + "/D_CRT_NONSTDC_NO_DEPRECATE") +else() + add_compile_options("-Wall" "-Wdeclaration-after-statement" + "-Wredundant-decls") +endif() + +find_package(SDL2 2.0.1) +find_package(SDL2_mixer 2.0.0) +find_package(SDL2_net 2.0.0) + +# Check for libsamplerate. +find_package(samplerate) +if(SAMPLERATE_FOUND) + set(HAVE_LIBSAMPLERATE TRUE) +endif() + +# Check for libpng. +find_package(PNG) +if(PNG_FOUND) + set(HAVE_LIBPNG TRUE) +endif() + +find_package(m) + +include(CheckSymbolExists) +check_symbol_exists(strcasecmp "strings.h" HAVE_DECL_STRCASECMP) +check_symbol_exists(strncasecmp "strings.h" HAVE_DECL_STRNCASECMP) + +string(CONCAT WINDOWS_RC_VERSION "${PROJECT_VERSION_MAJOR}, " + "${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}, 0") + +# Without a hyphen. This is used for the bash-completion scripts. +string(TOLOWER "${PACKAGE_SHORTNAME}" PROGRAM_SPREFIX) + +# With a hyphen, used almost everywhere else. +set(PROGRAM_PREFIX "${PROGRAM_SPREFIX}-") + +configure_file(cmake/config.h.cin config.h) + +configure_file(src/resource.rc.in src/resource.rc) +configure_file(src/setup-res.rc.in src/setup-res.rc) +configure_file(src/setup/setup-manifest.xml.in src/setup/setup-manifest.xml) + +foreach(SUBDIR textscreen midiproc opl pcsound src) + add_subdirectory("${SUBDIR}") +endforeach() diff --git a/cmake/FindSDL2.cmake b/cmake/FindSDL2.cmake new file mode 100644 index 00000000..bf7a3d78 --- /dev/null +++ b/cmake/FindSDL2.cmake @@ -0,0 +1,97 @@ +# FindSDL2.cmake +# +# Copyright (c) 2018, Alex Mayfield +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Currently works with the following generators: +# - Unix Makefiles +# - Ninja +# - Visual Studio + +# Cache variable that allows you to point CMake at a directory containing +# an extracted development library. +set(SDL2_DIR "${SDL2_DIR}" CACHE PATH "Location of SDL2 library directory") + +# Use pkg-config to find library locations in *NIX environments. +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_search_module(PC_SDL2 QUIET sdl2) +endif() + +# Find the include directory. +find_path(SDL2_INCLUDE_DIR "SDL_version.h" + HINTS "${SDL2_DIR}/include" ${PC_SDL2_INCLUDE_DIRS}) + +# Find the version. Taken and modified from CMake's FindSDL.cmake. +if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL_version.h") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}") + set(SDL2_VERSION "${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH}") + unset(SDL2_VERSION_MAJOR_LINE) + unset(SDL2_VERSION_MINOR_LINE) + unset(SDL2_VERSION_PATCH_LINE) + unset(SDL2_VERSION_MAJOR) + unset(SDL2_VERSION_MINOR) + unset(SDL2_VERSION_PATCH) +endif() + +# Find the SDL2 and SDL2main libraries +if(CMAKE_SIZEOF_VOID_P STREQUAL 8) + find_library(SDL2_LIBRARY "SDL2" + HINTS "${SDL2_DIR}/lib/x64" ${PC_SDL2_LIBRARY_DIRS}) + find_library(SDL2_MAIN_LIBRARY "SDL2main" + HINTS "${SDL2_DIR}/lib/x64" ${PC_SDL2_LIBRARY_DIRS}) +else() + find_library(SDL2_LIBRARY "SDL2" + HINTS "${SDL2_DIR}/lib/x86" ${PC_SDL2_LIBRARY_DIRS}) + find_library(SDL2_MAIN_LIBRARY "SDL2main" + HINTS "${SDL2_DIR}/lib/x86" ${PC_SDL2_LIBRARY_DIRS}) +endif() +set(SDL2_LIBRARIES "${SDL2_MAIN_LIBRARY}" "${SDL2_LIBRARY}") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SDL2 + FOUND_VAR SDL2_FOUND + REQUIRED_VARS SDL2_INCLUDE_DIR SDL2_LIBRARIES + VERSION_VAR SDL2_VERSION +) + +if(SDL2_FOUND) + # SDL2 imported target. + add_library(SDL2::SDL2 UNKNOWN IMPORTED) + set_target_properties(SDL2::SDL2 PROPERTIES + INTERFACE_COMPILE_OPTIONS "${PC_SDL2_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" + IMPORTED_LOCATION "${SDL2_LIBRARY}") + + # SDL2main imported target. + add_library(SDL2::SDL2main UNKNOWN IMPORTED) + set_target_properties(SDL2::SDL2main PROPERTIES + IMPORTED_LOCATION "${SDL2_MAIN_LIBRARY}") +endif() diff --git a/cmake/FindSDL2_mixer.cmake b/cmake/FindSDL2_mixer.cmake new file mode 100644 index 00000000..ce20e0b7 --- /dev/null +++ b/cmake/FindSDL2_mixer.cmake @@ -0,0 +1,88 @@ +# FindSDL2_mixer.cmake +# +# Copyright (c) 2018, Alex Mayfield +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Currently works with the following generators: +# - Unix Makefiles +# - Ninja +# - Visual Studio + +# Cache variable that allows you to point CMake at a directory containing +# an extracted development library. +set(SDL2_MIXER_DIR "${SDL2_MIXER_DIR}" CACHE PATH "Location of SDL2_mixer library directory") + +# Use pkg-config to find library locations in *NIX environments. +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_search_module(PC_SDL2_MIXER QUIET SDL2_mixer) +endif() + +# Find the include directory. +find_path(SDL2_MIXER_INCLUDE_DIR "SDL_mixer.h" + HINTS "${SDL2_MIXER_DIR}/include" ${PC_SDL2_MIXER_INCLUDE_DIRS}) + +# Find the version. Taken and modified from CMake's FindSDL.cmake. +if(SDL2_MIXER_INCLUDE_DIR AND EXISTS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h") + file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_MIXER_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MAJOR "${SDL2_MIXER_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MINOR "${SDL2_MIXER_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_PATCH "${SDL2_MIXER_VERSION_PATCH_LINE}") + set(SDL2_MIXER_VERSION "${SDL2_MIXER_VERSION_MAJOR}.${SDL2_MIXER_VERSION_MINOR}.${SDL2_MIXER_VERSION_PATCH}") + unset(SDL2_MIXER_VERSION_MAJOR_LINE) + unset(SDL2_MIXER_VERSION_MINOR_LINE) + unset(SDL2_MIXER_VERSION_PATCH_LINE) + unset(SDL2_MIXER_VERSION_MAJOR) + unset(SDL2_MIXER_VERSION_MINOR) + unset(SDL2_MIXER_VERSION_PATCH) +endif() + +# Find the library. +if(CMAKE_SIZEOF_VOID_P STREQUAL 8) + find_library(SDL2_MIXER_LIBRARY "SDL2_mixer" + HINTS "${SDL2_MIXER_DIR}/lib/x64" ${PC_SDL2_MIXER_LIBRARY_DIRS}) +else() + find_library(SDL2_MIXER_LIBRARY "SDL2_mixer" + HINTS "${SDL2_MIXER_DIR}/lib/x86" ${PC_SDL2_MIXER_LIBRARY_DIRS}) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SDL2_mixer + FOUND_VAR SDL2_MIXER_FOUND + REQUIRED_VARS SDL2_MIXER_INCLUDE_DIR SDL2_MIXER_LIBRARY + VERSION_VAR SDL2_MIXER_VERSION +) + +if(SDL2_MIXER_FOUND) + # Imported target. + add_library(SDL2::mixer UNKNOWN IMPORTED) + set_target_properties(SDL2::mixer PROPERTIES + INTERFACE_COMPILE_OPTIONS "${PC_SDL2_MIXER_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_MIXER_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES SDL2::SDL2 + IMPORTED_LOCATION "${SDL2_MIXER_LIBRARY}") +endif() diff --git a/cmake/FindSDL2_net.cmake b/cmake/FindSDL2_net.cmake new file mode 100644 index 00000000..5c743f2e --- /dev/null +++ b/cmake/FindSDL2_net.cmake @@ -0,0 +1,88 @@ +# FindSDL2_net.cmake +# +# Copyright (c) 2018, Alex Mayfield +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Currently works with the following generators: +# - Unix Makefiles +# - Ninja +# - Visual Studio + +# Cache variable that allows you to point CMake at a directory containing +# an extracted development library. +set(SDL2_NET_DIR "${SDL2_NET_DIR}" CACHE PATH "Location of SDL2_net library directory") + +# Use pkg-config to find library locations in *NIX environments. +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_search_module(PC_SDL2_NET QUIET SDL2_net) +endif() + +# Find the include directory. +find_path(SDL2_NET_INCLUDE_DIR "SDL_net.h" + HINTS "${SDL2_NET_DIR}/include" ${PC_SDL2_NET_INCLUDE_DIRS}) + +# Find the version. Taken and modified from CMake's FindSDL.cmake. +if(SDL2_NET_INCLUDE_DIR AND EXISTS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h") + file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h" SDL2_NET_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_NET_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h" SDL2_NET_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_NET_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h" SDL2_NET_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_NET_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_NET_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MAJOR "${SDL2_NET_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_NET_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MINOR "${SDL2_NET_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_NET_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_PATCH "${SDL2_NET_VERSION_PATCH_LINE}") + set(SDL2_NET_VERSION "${SDL2_NET_VERSION_MAJOR}.${SDL2_NET_VERSION_MINOR}.${SDL2_NET_VERSION_PATCH}") + unset(SDL2_NET_VERSION_MAJOR_LINE) + unset(SDL2_NET_VERSION_MINOR_LINE) + unset(SDL2_NET_VERSION_PATCH_LINE) + unset(SDL2_NET_VERSION_MAJOR) + unset(SDL2_NET_VERSION_MINOR) + unset(SDL2_NET_VERSION_PATCH) +endif() + +# Find the library. +if(CMAKE_SIZEOF_VOID_P STREQUAL 8) + find_library(SDL2_NET_LIBRARY "SDL2_net" + HINTS "${SDL2_NET_DIR}/lib/x64" ${PC_SDL2_NET_LIBRARY_DIRS}) +else() + find_library(SDL2_NET_LIBRARY "SDL2_net" + HINTS "${SDL2_NET_DIR}/lib/x86" ${PC_SDL2_NET_LIBRARY_DIRS}) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SDL2_net + FOUND_VAR SDL2_NET_FOUND + REQUIRED_VARS SDL2_NET_INCLUDE_DIR SDL2_NET_LIBRARY + VERSION_VAR SDL2_NET_VERSION +) + +if(SDL2_NET_FOUND) + # Imported target. + add_library(SDL2::net UNKNOWN IMPORTED) + set_target_properties(SDL2::net PROPERTIES + INTERFACE_COMPILE_OPTIONS "${PC_SDL2_NET_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_NET_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES SDL2::SDL2 + IMPORTED_LOCATION "${SDL2_NET_LIBRARY}") +endif() diff --git a/cmake/Findm.cmake b/cmake/Findm.cmake new file mode 100644 index 00000000..f7a1cfa5 --- /dev/null +++ b/cmake/Findm.cmake @@ -0,0 +1,36 @@ +# Findm.cmake +# +# Copyright (c) 2018, Alex Mayfield +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Finds libm, so we can link against it for math functions. If libm doesn't +# exist, linking against the m target will have no effect. + +find_library(M_LIBRARY m) + +add_library(m INTERFACE) +if(M_LIBRARY) + target_link_libraries(m INTERFACE "${M_LIBRARY}") +endif() diff --git a/cmake/Findsamplerate.cmake b/cmake/Findsamplerate.cmake new file mode 100644 index 00000000..02530d0b --- /dev/null +++ b/cmake/Findsamplerate.cmake @@ -0,0 +1,67 @@ +# Findsamplerate.cmake +# +# Copyright (c) 2018, Alex Mayfield +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Currently works with the following generators: +# - Unix Makefiles +# - Ninja +# - Visual Studio + +# Use pkg-config to find library locations in *NIX environments. +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_search_module(PC_SAMPLERATE QUIET samplerate) +endif() + +# Find the include directory. +find_path(SAMPLERATE_INCLUDE_DIR "samplerate.h" + HINTS ${PC_SAMPLERATE_INCLUDE_DIRS}) + +# Find the version. I don't know if there is a correct way to find this on +# Windows - the config.h in the tarball is wrong for 0.1.19. +if(PC_SAMPLERATE_VERSION) + set(SAMPLERATE_VERSION "${PC_SAMPLERATE_VERSION}") +endif() + +# Find the library. +find_library(SAMPLERATE_LIBRARY "samplerate" + HINTS ${PC_SAMPLERATE_LIBRARY_DIRS}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(samplerate + FOUND_VAR SAMPLERATE_FOUND + REQUIRED_VARS SAMPLERATE_INCLUDE_DIR SAMPLERATE_LIBRARY + VERSION_VAR SAMPLERATE_VERSION +) + +if(SAMPLERATE_FOUND) + # Imported target. + add_library(samplerate::samplerate UNKNOWN IMPORTED) + set_target_properties(samplerate::samplerate PROPERTIES + INTERFACE_COMPILE_OPTIONS "${PC_SAMPLERATE_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${SAMPLERATE_INCLUDE_DIR}" + IMPORTED_LOCATION "${SAMPLERATE_LIBRARY}") +endif() diff --git a/cmake/config.h.cin b/cmake/config.h.cin new file mode 100644 index 00000000..4a67927e --- /dev/null +++ b/cmake/config.h.cin @@ -0,0 +1,10 @@ +#cmakedefine PACKAGE_NAME "@PACKAGE_NAME@" +#cmakedefine PACKAGE_TARNAME "@PACKAGE_TARNAME@" +#cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@" +#cmakedefine PACKAGE_STRING "@PACKAGE_STRING@" +#cmakedefine PROGRAM_PREFIX "@PROGRAM_PREFIX@" + +#cmakedefine HAVE_LIBSAMPLERATE +#cmakedefine HAVE_LIBPNG +#cmakedefine01 HAVE_DECL_STRCASECMP +#cmakedefine01 HAVE_DECL_STRNCASECMP diff --git a/midiproc/CMakeLists.txt b/midiproc/CMakeLists.txt new file mode 100644 index 00000000..144e9248 --- /dev/null +++ b/midiproc/CMakeLists.txt @@ -0,0 +1,6 @@ +if(WIN32) + add_executable("${PROGRAM_PREFIX}midiproc" WIN32 buffer.c buffer.h main.c proto.h) + target_include_directories("${PROGRAM_PREFIX}midiproc" + PRIVATE "../src/" "${CMAKE_CURRENT_BINARY_DIR}/../") + target_link_libraries("${PROGRAM_PREFIX}midiproc" SDL2::SDL2main SDL2::mixer) +endif() diff --git a/opl/CMakeLists.txt b/opl/CMakeLists.txt new file mode 100644 index 00000000..f88a12a1 --- /dev/null +++ b/opl/CMakeLists.txt @@ -0,0 +1,15 @@ +add_library(opl STATIC + opl_internal.h + opl.c opl.h + opl_linux.c + opl_obsd.c + opl_queue.c opl_queue.h + opl_sdl.c + opl_timer.c opl_timer.h + opl_win32.c + ioperm_sys.c ioperm_sys.h + opl3.c opl3.h) +target_include_directories(opl + INTERFACE "." + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../") +target_link_libraries(opl SDL2::mixer) diff --git a/pcsound/CMakeLists.txt b/pcsound/CMakeLists.txt new file mode 100644 index 00000000..7988b8bd --- /dev/null +++ b/pcsound/CMakeLists.txt @@ -0,0 +1,11 @@ +add_library(pcsound STATIC + pcsound.c pcsound.h + pcsound_bsd.c + pcsound_sdl.c + pcsound_linux.c + pcsound_win32.c + pcsound_internal.h) +target_include_directories(pcsound + INTERFACE "." + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../") +target_link_libraries(pcsound SDL2::mixer) diff --git a/src/.gitignore b/src/.gitignore index 6986ecfe..556dfeaf 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -16,6 +16,7 @@ chocolate-setup *.exe *.desktop *.txt +!CMakeLists.txt *.appdata.xml tags TAGS diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000..00ed3d53 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,215 @@ +foreach(SUBDIR doom heretic hexen strife setup) + add_subdirectory("${SUBDIR}") +endforeach() + +# Common source files used by absolutely everything: + +set(COMMON_SOURCE_FILES + i_main.c + i_system.c i_system.h + m_argv.c m_argv.h + m_misc.c m_misc.h) + +# Dedicated server (chocolate-server): + +set(DEDSERV_FILES + d_dedicated.c + d_mode.c d_mode.h + i_timer.c i_timer.h + net_common.c net_common.h + net_dedicated.c net_dedicated.h + net_io.c net_io.h + net_packet.c net_packet.h + net_sdl.c net_sdl.h + net_query.c net_query.h + net_server.c net_server.h + net_structrw.c net_structrw.h + z_native.c z_zone.h) + +add_executable("${PROGRAM_PREFIX}server" WIN32 ${COMMON_SOURCE_FILES} ${DEDSERV_FILES}) +target_include_directories("${PROGRAM_PREFIX}server" + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../") +target_link_libraries("${PROGRAM_PREFIX}server" SDL2::SDL2main SDL2::net) + +# Source files used by the game binaries (chocolate-doom, etc.) + +set(GAME_SOURCE_FILES + aes_prng.c aes_prng.h + d_event.c d_event.h + doomkeys.h + doomtype.h + d_iwad.c d_iwad.h + d_loop.c d_loop.h + d_mode.c d_mode.h + d_ticcmd.h + deh_str.c deh_str.h + gusconf.c gusconf.h + i_cdmus.c i_cdmus.h + i_endoom.c i_endoom.h + i_input.c i_input.h + i_joystick.c i_joystick.h + i_swap.h + i_midipipe.c i_midipipe.h + i_oplmusic.c + i_pcsound.c + i_sdlmusic.c + i_sdlsound.c + i_sound.c i_sound.h + i_timer.c i_timer.h + i_video.c i_video.h + i_videohr.c i_videohr.h + midifile.c midifile.h + mus2mid.c mus2mid.h + m_bbox.c m_bbox.h + m_cheat.c m_cheat.h + m_config.c m_config.h + m_controls.c m_controls.h + m_fixed.c m_fixed.h + net_client.c net_client.h + net_common.c net_common.h + net_dedicated.c net_dedicated.h + net_defs.h + net_gui.c net_gui.h + net_io.c net_io.h + net_loop.c net_loop.h + net_packet.c net_packet.h + net_query.c net_query.h + net_sdl.c net_sdl.h + net_server.c net_server.h + net_structrw.c net_structrw.h + sha1.c sha1.h + memio.c memio.h + tables.c tables.h + v_diskicon.c v_diskicon.h + v_video.c v_video.h + v_patch.h + w_checksum.c w_checksum.h + w_main.c w_main.h + w_wad.c w_wad.h + w_file.c w_file.h + w_file_stdc.c + w_file_posix.c + w_file_win32.c + w_merge.c w_merge.h + z_zone.c z_zone.h) + +set(DEHACKED_SOURCE_FILES + deh_defs.h + deh_io.c deh_io.h + deh_main.c deh_main.h + deh_mapping.c deh_mapping.h + deh_text.c) + +# Some games support dehacked patches, some don't: + +set(SOURCE_FILES ${COMMON_SOURCE_FILES} ${GAME_SOURCE_FILES}) +set(SOURCE_FILES_WITH_DEH ${SOURCE_FILES} ${DEHACKED_SOURCE_FILES}) + +set(EXTRA_LIBS textscreen pcsound opl SDL2::SDL2main SDL2::SDL2 SDL2::mixer SDL2::net) +if(SAMPLERATE_FOUND) + list(APPEND EXTRA_LIBS samplerate::samplerate) +endif() +if(PNG_FOUND) + list(APPEND EXTRA_LIBS PNG::PNG) +endif() + +if(WIN32) + add_executable("${PROGRAM_PREFIX}doom" WIN32 ${SOURCE_FILES_WITH_DEH} "${CMAKE_CURRENT_BINARY_DIR}/resource.rc") +else() + add_executable("${PROGRAM_PREFIX}doom" ${SOURCE_FILES_WITH_DEH}) +endif() + +target_include_directories("${PROGRAM_PREFIX}doom" + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../") +target_link_libraries("${PROGRAM_PREFIX}doom" doom ${EXTRA_LIBS}) + +if(MSVC) + set_target_properties("${PROGRAM_PREFIX}doom" PROPERTIES + LINK_FLAGS "/MANIFEST:NO") +endif() + +if(WIN32) + add_executable("${PROGRAM_PREFIX}heretic" WIN32 ${SOURCE_FILES_WITH_DEH} "${CMAKE_CURRENT_BINARY_DIR}/resource.rc") +else() + add_executable("${PROGRAM_PREFIX}heretic" ${SOURCE_FILES_WITH_DEH}) +endif() + +target_include_directories("${PROGRAM_PREFIX}heretic" + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../") +target_link_libraries("${PROGRAM_PREFIX}heretic" heretic ${EXTRA_LIBS}) + +if(MSVC) + set_target_properties("${PROGRAM_PREFIX}heretic" PROPERTIES + LINK_FLAGS "/MANIFEST:NO") +endif() + +if(WIN32) + add_executable("${PROGRAM_PREFIX}hexen" WIN32 ${SOURCE_FILES} "${CMAKE_CURRENT_BINARY_DIR}/resource.rc") +else() + add_executable("${PROGRAM_PREFIX}hexen" ${SOURCE_FILES}) +endif() + +target_include_directories("${PROGRAM_PREFIX}hexen" + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../") +target_link_libraries("${PROGRAM_PREFIX}hexen" hexen ${EXTRA_LIBS}) + +if(MSVC) + set_target_properties("${PROGRAM_PREFIX}hexen" PROPERTIES + LINK_FLAGS "/MANIFEST:NO") +endif() + +if(WIN32) + add_executable("${PROGRAM_PREFIX}strife" WIN32 ${SOURCE_FILES_WITH_DEH} "${CMAKE_CURRENT_BINARY_DIR}/resource.rc") +else() + add_executable("${PROGRAM_PREFIX}strife" ${SOURCE_FILES_WITH_DEH}) +endif() + +target_include_directories("${PROGRAM_PREFIX}strife" + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../") +target_link_libraries("${PROGRAM_PREFIX}strife" strife ${EXTRA_LIBS}) + +if(MSVC) + set_target_properties("${PROGRAM_PREFIX}strife" PROPERTIES + LINK_FLAGS "/MANIFEST:NO") +endif() + +# Source files needed for chocolate-setup: + +set(SETUP_FILES + deh_str.c deh_str.h + d_mode.c d_mode.h + d_iwad.c d_iwad.h + i_timer.c i_timer.h + m_config.c m_config.h + m_controls.c m_controls.h + net_io.c net_io.h + net_packet.c net_packet.h + net_sdl.c net_sdl.h + net_query.c net_query.h + net_structrw.c net_structrw.h + z_native.c z_zone.h) + +if(WIN32) + add_executable("${PROGRAM_PREFIX}setup" WIN32 ${SETUP_FILES} ${COMMON_SOURCE_FILES} "${CMAKE_CURRENT_BINARY_DIR}/setup-res.rc") +else() + add_executable("${PROGRAM_PREFIX}setup" ${SETUP_FILES} ${COMMON_SOURCE_FILES}) +endif() + +target_include_directories("${PROGRAM_PREFIX}setup" + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../") +target_link_libraries("${PROGRAM_PREFIX}setup" setup textscreen SDL2::SDL2main SDL2::SDL2 SDL2::mixer SDL2::net) + +if(MSVC) + set_target_properties("${PROGRAM_PREFIX}setup" PROPERTIES + LINK_FLAGS "/MANIFEST:NO") +endif() + +add_executable(midiread midifile.c z_native.c i_system.c m_argv.c m_misc.c) +target_compile_definitions(midiread PRIVATE "-DTEST") +target_include_directories(midiread PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../") +target_link_libraries(midiread PRIVATE SDL2::SDL2) + +add_executable(mus2mid mus2mid.c memio.c z_native.c i_system.c m_argv.c m_misc.c) +target_compile_definitions(mus2mid PRIVATE "-DSTANDALONE") +target_include_directories(mus2mid PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../") +target_link_libraries(mus2mid PRIVATE SDL2::SDL2) diff --git a/src/doom/CMakeLists.txt b/src/doom/CMakeLists.txt new file mode 100644 index 00000000..0310910a --- /dev/null +++ b/src/doom/CMakeLists.txt @@ -0,0 +1,71 @@ +add_library(doom STATIC + am_map.c am_map.h + deh_ammo.c + deh_bexstr.c + deh_cheat.c + deh_doom.c + deh_frame.c + deh_misc.c deh_misc.h + deh_ptr.c + deh_sound.c + deh_thing.c + deh_weapon.c + d_englsh.h + d_items.c d_items.h + d_main.c d_main.h + d_net.c + doomdata.h + doomdef.c doomdef.h + doomstat.c doomstat.h + d_player.h + dstrings.c dstrings.h + d_textur.h + d_think.h + f_finale.c f_finale.h + f_wipe.c f_wipe.h + g_game.c g_game.h + hu_lib.c hu_lib.h + hu_stuff.c hu_stuff.h + info.c info.h + m_menu.c m_menu.h + m_random.c m_random.h + p_ceilng.c + p_doors.c + p_enemy.c + p_floor.c + p_inter.c p_inter.h + p_lights.c + p_local.h + p_map.c + p_maputl.c + p_mobj.c p_mobj.h + p_plats.c + p_pspr.c p_pspr.h + p_saveg.c p_saveg.h + p_setup.c p_setup.h + p_sight.c + p_spec.c p_spec.h + p_switch.c + p_telept.c + p_tick.c p_tick.h + p_user.c + r_bsp.c r_bsp.h + r_data.c r_data.h + r_defs.h + r_draw.c r_draw.h + r_local.h + r_main.c r_main.h + r_plane.c r_plane.h + r_segs.c r_segs.h + r_sky.c r_sky.h + r_state.h + r_things.c r_things.h + s_sound.c s_sound.h + sounds.c sounds.h + statdump.c statdump.h + st_lib.c st_lib.h + st_stuff.c st_stuff.h + wi_stuff.c wi_stuff.h) + +target_include_directories(doom PRIVATE "../" "${CMAKE_CURRENT_BINARY_DIR}/../../") +target_link_libraries(doom SDL2::SDL2 SDL2::mixer SDL2::net) diff --git a/src/heretic/CMakeLists.txt b/src/heretic/CMakeLists.txt new file mode 100644 index 00000000..9f12bde0 --- /dev/null +++ b/src/heretic/CMakeLists.txt @@ -0,0 +1,57 @@ +add_library(heretic STATIC + am_data.h + am_map.c am_map.h + ct_chat.c ct_chat.h + deh_ammo.c + deh_frame.c + deh_htext.c + deh_htic.c deh_htic.h + deh_sound.c + deh_thing.c + deh_weapon.c + d_main.c + d_net.c + doomdata.h + doomdef.h + dstrings.h + f_finale.c + g_game.c + info.c info.h + in_lude.c + m_random.c m_random.h + mn_menu.c + p_action.h + p_ceilng.c + p_doors.c + p_enemy.c + p_floor.c + p_inter.c + p_lights.c + p_local.h + p_map.c + p_maputl.c + p_mobj.c + p_plats.c + p_pspr.c + p_saveg.c + p_setup.c + p_sight.c + p_spec.c p_spec.h + p_switch.c + p_telept.c + p_tick.c + p_user.c + r_bsp.c + r_data.c + r_draw.c + r_local.h + r_main.c + r_plane.c + r_segs.c + r_things.c + sb_bar.c + sounds.c sounds.h + s_sound.c s_sound.h) + +target_include_directories(heretic PRIVATE "../" "${CMAKE_CURRENT_BINARY_DIR}/../../") +target_link_libraries(heretic textscreen SDL2::SDL2 SDL2::mixer SDL2::net) diff --git a/src/hexen/CMakeLists.txt b/src/hexen/CMakeLists.txt new file mode 100644 index 00000000..6b4beed2 --- /dev/null +++ b/src/hexen/CMakeLists.txt @@ -0,0 +1,58 @@ +add_library(hexen STATIC + a_action.c + am_data.h + am_map.c am_map.h + ct_chat.c + ct_chat.h + d_net.c + f_finale.c + g_game.c + h2def.h + h2_main.c + info.c info.h + in_lude.c + m_random.c m_random.h + mn_menu.c + p_acs.c + p_anim.c + p_ceilng.c + p_doors.c + p_enemy.c + p_floor.c + p_inter.c + p_lights.c + p_local.h + p_map.c + p_maputl.c + p_mobj.c + po_man.c + p_plats.c + p_pspr.c + p_setup.c + p_sight.c + p_spec.c p_spec.h + p_switch.c + p_telept.c + p_things.c + p_tick.c + p_user.c + r_bsp.c + r_data.c + r_draw.c + r_local.h + r_main.c + r_plane.c + r_segs.c + r_things.c + s_sound.c s_sound.h + sb_bar.c + sc_man.c + sn_sonix.c + sounds.c sounds.h + st_start.c st_start.h + sv_save.c + textdefs.h + xddefs.h) + +target_include_directories(hexen PRIVATE "../" "${CMAKE_CURRENT_BINARY_DIR}/../../") +target_link_libraries(hexen SDL2::SDL2 SDL2::mixer SDL2::net) diff --git a/src/setup/CMakeLists.txt b/src/setup/CMakeLists.txt new file mode 100644 index 00000000..4c27a07c --- /dev/null +++ b/src/setup/CMakeLists.txt @@ -0,0 +1,18 @@ +add_library(setup STATIC + compatibility.c compatibility.h + display.c display.h + joystick.c joystick.h + keyboard.c keyboard.h + mainmenu.c + mode.c mode.h + mouse.c mouse.h + multiplayer.c multiplayer.h + sound.c sound.h + execute.c execute.h + txt_joyaxis.c txt_joyaxis.h + txt_joybinput.c txt_joybinput.h + txt_keyinput.c txt_keyinput.h + txt_mouseinput.c txt_mouseinput.h) + +target_include_directories(setup PRIVATE "../" "${CMAKE_CURRENT_BINARY_DIR}/../../") +target_link_libraries(setup textscreen SDL2::SDL2 SDL2::mixer) diff --git a/src/strife/CMakeLists.txt b/src/strife/CMakeLists.txt new file mode 100644 index 00000000..3e5b9502 --- /dev/null +++ b/src/strife/CMakeLists.txt @@ -0,0 +1,75 @@ +set(STRIFE_SOURCES + am_map.c am_map.h + deh_ammo.c + deh_cheat.c + deh_strife.c + deh_frame.c + deh_misc.c deh_misc.h + deh_ptr.c + deh_sound.c + deh_thing.c + deh_weapon.c + d_englsh.h + d_items.c d_items.h + d_main.c d_main.h + d_net.c + doomdata.h + doomdef.c doomdef.h + doomstat.c doomstat.h + d_player.h + dstrings.c dstrings.h + d_textur.h + d_think.h + f_finale.c f_finale.h + f_wipe.c f_wipe.h + g_game.c g_game.h + hu_lib.c hu_lib.h + hu_stuff.c hu_stuff.h + info.c info.h + m_menu.c m_menu.h + m_random.c m_random.h + m_saves.c m_saves.h + p_ceilng.c + p_dialog.c p_dialog.h + p_doors.c + p_enemy.c + p_floor.c + p_inter.c p_inter.h + p_lights.c + p_local.h + p_map.c + p_maputl.c + p_mobj.c p_mobj.h + p_plats.c + p_pspr.c p_pspr.h + p_saveg.c p_saveg.h + p_setup.c p_setup.h + p_sight.c + p_spec.c p_spec.h + p_switch.c + p_telept.c + p_tick.c p_tick.h + p_user.c + r_bsp.c r_bsp.h + r_data.c r_data.h + r_defs.h + r_draw.c r_draw.h + r_local.h + r_main.c r_main.h + r_plane.c r_plane.h + r_segs.c r_segs.h + r_sky.c r_sky.h + r_state.h + r_things.c r_things.h + s_sound.c s_sound.h + sounds.c sounds.h + st_lib.c st_lib.h + st_stuff.c st_stuff.h + wi_stuff.c wi_stuff.h) +if(MSVC) + list(APPEND STRIFE_SOURCES "../../win32/win_opendir.c" "../../win32/win_opendir.h") +endif() +add_library(strife STATIC ${STRIFE_SOURCES}) + +target_include_directories(strife PRIVATE "../" "../../win32/" "${CMAKE_CURRENT_BINARY_DIR}/../../") +target_link_libraries(strife textscreen SDL2::SDL2 SDL2::mixer SDL2::net) diff --git a/src/v_video.c b/src/v_video.c index cabfba71..22e5602a 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -20,6 +20,7 @@ // #include +#include #include #include diff --git a/textscreen/CMakeLists.txt b/textscreen/CMakeLists.txt new file mode 100644 index 00000000..2a1802a6 --- /dev/null +++ b/textscreen/CMakeLists.txt @@ -0,0 +1,28 @@ +add_library(textscreen + textscreen.h + txt_conditional.c txt_conditional.h + txt_checkbox.c txt_checkbox.h + txt_desktop.c txt_desktop.h + txt_dropdown.c txt_dropdown.h + txt_fileselect.c txt_fileselect.h + txt_gui.c txt_gui.h + txt_inputbox.c txt_inputbox.h + txt_io.c txt_io.h + txt_main.h + txt_button.c txt_button.h + txt_label.c txt_label.h + txt_radiobutton.c txt_radiobutton.h + txt_scrollpane.c txt_scrollpane.h + txt_separator.c txt_separator.h + txt_spinctrl.c txt_spinctrl.h + txt_sdl.c txt_sdl.h + txt_strut.c txt_strut.h + txt_table.c txt_table.h + txt_utf8.c txt_utf8.h + txt_widget.c txt_widget.h + txt_window.c txt_window.h + txt_window_action.c txt_window_action.h) +target_include_directories(textscreen + INTERFACE "." + PRIVATE "../src/") +target_link_libraries(textscreen m SDL2::SDL2) diff --git a/win32/win_opendir.c b/win32/win_opendir.c new file mode 100644 index 00000000..b2f67805 --- /dev/null +++ b/win32/win_opendir.c @@ -0,0 +1,336 @@ +// +// 03/10/2006 James Haley +// +// For this module only: +// This code is public domain. No change sufficient enough to constitute a +// significant or original work has been made, and thus it remains as such. +// +// +// DESCRIPTION: +// +// Implementation of POSIX opendir for Visual C++. +// Derived from the MinGW C Library Extensions Source (released to the +// public domain). As with other Win32 modules, don't include most DOOM +// headers into this or conflicts will occur. +// +// Original Header: +// +// * dirent.c +// * This file has no copyright assigned and is placed in the Public Domain. +// * This file is a part of the mingw-runtime package. +// * No warranty is given; refer to the file DISCLAIMER within the package. +// * +// * Derived from DIRLIB.C by Matt J. Weinstein +// * This note appears in the DIRLIB.H +// * DIRLIB.H by M. J. Weinstein Released to public domain 1-Jan-89 +// * +// * Updated by Jeremy Bettis +// * Significantly revised and rewinddir, seekdir and telldir added by Colin +// * Peters +// + +#ifndef _MSC_VER +#error i_opndir.c is for Microsoft Visual C++ only +#endif + +#include +#include +#include + +#define WIN32_LEAN_AND_MEAN +#include /* for GetFileAttributes */ + +#include +#define SUFFIX _T("*") +#define SLASH _T("\\") + +#include "win_opendir.h" + +// +// opendir +// +// Returns a pointer to a DIR structure appropriately filled in to begin +// searching a directory. +// +DIR *opendir(const _TCHAR *szPath) +{ + DIR *nd; + unsigned int rc; + _TCHAR szFullPath[MAX_PATH]; + + errno = 0; + + if(!szPath) + { + errno = EFAULT; + return (DIR *)0; + } + + if(szPath[0] == _T('\0')) + { + errno = ENOTDIR; + return (DIR *)0; + } + + /* Attempt to determine if the given path really is a directory. */ + rc = GetFileAttributes(szPath); + if(rc == (unsigned int)-1) + { + /* call GetLastError for more error info */ + errno = ENOENT; + return (DIR *)0; + } + if(!(rc & FILE_ATTRIBUTE_DIRECTORY)) + { + /* Error, entry exists but not a directory. */ + errno = ENOTDIR; + return (DIR *)0; + } + + /* Make an absolute pathname. */ + _tfullpath(szFullPath, szPath, MAX_PATH); + + /* Allocate enough space to store DIR structure and the complete + * directory path given. */ + nd = (DIR *)(malloc(sizeof(DIR) + (_tcslen(szFullPath) + + _tcslen(SLASH) + + _tcslen(SUFFIX) + 1) + * sizeof(_TCHAR))); + + if(!nd) + { + /* Error, out of memory. */ + errno = ENOMEM; + return (DIR *)0; + } + + /* Create the search expression. */ + _tcscpy(nd->dd_name, szFullPath); + + /* Add on a slash if the path does not end with one. */ + if(nd->dd_name[0] != _T('\0') + && _tcsrchr(nd->dd_name, _T('/')) != nd->dd_name + + _tcslen(nd->dd_name) - 1 + && _tcsrchr(nd->dd_name, _T('\\')) != nd->dd_name + + _tcslen(nd->dd_name) - 1) + { + _tcscat(nd->dd_name, SLASH); + } + + /* Add on the search pattern */ + _tcscat(nd->dd_name, SUFFIX); + + /* Initialize handle to -1 so that a premature closedir doesn't try + * to call _findclose on it. */ + nd->dd_handle = -1; + + /* Initialize the status. */ + nd->dd_stat = 0; + + /* Initialize the dirent structure. ino and reclen are invalid under + * Win32, and name simply points at the appropriate part of the + * findfirst_t structure. */ + nd->dd_dir.d_ino = 0; + nd->dd_dir.d_reclen = 0; + nd->dd_dir.d_namlen = 0; + memset(nd->dd_dir.d_name, 0, FILENAME_MAX); + + return nd; +} + +// +// readdir +// +// Return a pointer to a dirent structure filled with the information on the +// next entry in the directory. +// +struct dirent *readdir(DIR *dirp) +{ + errno = 0; + + /* Check for valid DIR struct. */ + if(!dirp) + { + errno = EFAULT; + return (struct dirent *)0; + } + + if (dirp->dd_stat < 0) + { + /* We have already returned all files in the directory + * (or the structure has an invalid dd_stat). */ + return (struct dirent *)0; + } + else if (dirp->dd_stat == 0) + { + /* We haven't started the search yet. */ + /* Start the search */ + dirp->dd_handle = _tfindfirst(dirp->dd_name, &(dirp->dd_dta)); + + if(dirp->dd_handle == -1) + { + /* Whoops! Seems there are no files in that + * directory. */ + dirp->dd_stat = -1; + } + else + { + dirp->dd_stat = 1; + } + } + else + { + /* Get the next search entry. */ + if(_tfindnext(dirp->dd_handle, &(dirp->dd_dta))) + { + /* We are off the end or otherwise error. + _findnext sets errno to ENOENT if no more file + Undo this. */ + DWORD winerr = GetLastError(); + if(winerr == ERROR_NO_MORE_FILES) + errno = 0; + _findclose(dirp->dd_handle); + dirp->dd_handle = -1; + dirp->dd_stat = -1; + } + else + { + /* Update the status to indicate the correct + * number. */ + dirp->dd_stat++; + } + } + + if (dirp->dd_stat > 0) + { + /* Successfully got an entry. Everything about the file is + * already appropriately filled in except the length of the + * file name. */ + dirp->dd_dir.d_namlen = _tcslen(dirp->dd_dta.name); + _tcscpy(dirp->dd_dir.d_name, dirp->dd_dta.name); + return &dirp->dd_dir; + } + + return (struct dirent *)0; +} + + +// +// closedir +// +// Frees up resources allocated by opendir. +// +int closedir(DIR *dirp) +{ + int rc; + + errno = 0; + rc = 0; + + if(!dirp) + { + errno = EFAULT; + return -1; + } + + if(dirp->dd_handle != -1) + { + rc = _findclose(dirp->dd_handle); + } + + /* Delete the dir structure. */ + free(dirp); + + return rc; +} + +// +// rewinddir +// +// Return to the beginning of the directory "stream". We simply call findclose +// and then reset things like an opendir. +// +void rewinddir(DIR * dirp) +{ + errno = 0; + + if(!dirp) + { + errno = EFAULT; + return; + } + + if(dirp->dd_handle != -1) + { + _findclose(dirp->dd_handle); + } + + dirp->dd_handle = -1; + dirp->dd_stat = 0; +} + +// +// telldir +// +// Returns the "position" in the "directory stream" which can be used with +// seekdir to go back to an old entry. We simply return the value in stat. +// +long telldir(DIR *dirp) +{ + errno = 0; + + if(!dirp) + { + errno = EFAULT; + return -1; + } + return dirp->dd_stat; +} + +// +// seekdir +// +// Seek to an entry previously returned by telldir. We rewind the directory +// and call readdir repeatedly until either dd_stat is the position number +// or -1 (off the end). This is not perfect, in that the directory may +// have changed while we weren't looking. But that is probably the case with +// any such system. +// +void seekdir(DIR *dirp, long lPos) +{ + errno = 0; + + if(!dirp) + { + errno = EFAULT; + return; + } + + if(lPos < -1) + { + /* Seeking to an invalid position. */ + errno = EINVAL; + return; + } + else if(lPos == -1) + { + /* Seek past end. */ + if(dirp->dd_handle != -1) + { + _findclose(dirp->dd_handle); + } + dirp->dd_handle = -1; + dirp->dd_stat = -1; + } + else + { + /* Rewind and read forward to the appropriate index. */ + rewinddir(dirp); + + while((dirp->dd_stat < lPos) && readdir(dirp)) + ; /* do-nothing loop */ + } +} + +// EOF + diff --git a/win32/win_opendir.h b/win32/win_opendir.h new file mode 100644 index 00000000..c1844e11 --- /dev/null +++ b/win32/win_opendir.h @@ -0,0 +1,73 @@ +// +// 03/10/2006 James Haley +// +// For this module only: +// This code is public domain. No change sufficient enough to constitute a +// significant or original work has been made, and thus it remains as such. +// +// +// DESCRIPTION: +// +// Implementation of POSIX opendir for Visual C++. +// Derived from the MinGW C Library Extensions Source (released to the +// public domain). +// + +#ifndef I_OPNDIR_H__ +#define I_OPNDIR_H__ + +#include + +#ifndef FILENAME_MAX +#define FILENAME_MAX 260 +#endif + +struct dirent +{ + long d_ino; /* Always zero. */ + unsigned short d_reclen; /* Always zero. */ + unsigned short d_namlen; /* Length of name in d_name. */ + char d_name[FILENAME_MAX]; /* File name. */ +}; + +/* + * This is an internal data structure. Good programmers will not use it + * except as an argument to one of the functions below. + * dd_stat field is now int (was short in older versions). + */ +typedef struct +{ + /* disk transfer area for this dir */ + struct _finddata_t dd_dta; + + /* dirent struct to return from dir (NOTE: this makes this thread + * safe as long as only one thread uses a particular DIR struct at + * a time) */ + struct dirent dd_dir; + + /* _findnext handle */ + intptr_t dd_handle; + + /* + * Status of search: + * 0 = not started yet (next entry to read is first entry) + * -1 = off the end + * positive = 0 based index of next entry + */ + int dd_stat; + + /* given path for dir with search pattern (struct is extended) */ + char dd_name[1]; +} DIR; + +DIR *opendir(const char *); +struct dirent *readdir(DIR *); +int closedir(DIR *); +void rewinddir(DIR *); +long telldir(DIR *); +void seekdir(DIR *, long); + +#endif + +// EOF +