diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f06104e58..50ae6d93f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,8 +1,17 @@ add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32) -if("${CMAKE_COMPILER_IS_GNUCC}" AND "${CMAKE_SYSTEM_NAME}" MATCHES "Windows" AND NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}" AND NOT "${SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}") - # On MinGW with internal libraries, link the standard library statically - target_link_options(SRB2SDL2 PRIVATE "-static" "-Wl,--disable-dynamicbase") +if(("${CMAKE_COMPILER_IS_GNUCC}" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND "${CMAKE_SYSTEM_NAME}" MATCHES "Windows") + target_link_options(SRB2SDL2 PRIVATE "-Wl,--disable-dynamicbase") + if("${SRB2_CONFIG_STATIC_STDLIB}") + # On MinGW with internal libraries, link the standard library statically + target_link_options(SRB2SDL2 PRIVATE -Wl,--add-stdcall-alias -static-libgcc -static-libstdc++ -static -lpthread) + set(THREADS_PREFER_PTHREAD_FLAG TRUE) + find_package(Threads REQUIRED) + target_link_libraries(SRB2SDL2 PRIVATE Threads::Threads) + endif() + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + target_link_options(SRB2SDL2 PRIVATE "-Wl,--large-address-aware") + endif() endif() target_compile_features(SRB2SDL2 PRIVATE c_std_11 cxx_std_17) @@ -197,7 +206,7 @@ endif() # Compatibility flag with later versions of GCC # We should really fix our code to not need this -if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") +if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") target_compile_options(SRB2SDL2 PRIVATE -mno-ms-bitfields) endif() @@ -296,6 +305,7 @@ target_compile_options(SRB2SDL2 PRIVATE -Wno-trigraphs -Wno-error=non-literal-null-conversion -Wno-error=constant-conversion + -Wno-unused-but-set-variable -Wno-error=unused-but-set-variable > @@ -309,6 +319,9 @@ target_compile_options(SRB2SDL2 PRIVATE # C++, GNU, Clang and Apple Clang $<$,$,$,$>>: -Wall + -Wno-unused-function + -Wno-unused-but-set-variable + -Wno-unused-private-field > # C++, MSVC @@ -358,19 +371,19 @@ if(SRB2_CONFIG_PROFILEMODE AND "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") target_link_options(SRB2SDL2 PRIVATE -pg) endif() -# strip debug symbols into separate file when using gcc. +# strip debug symbols into separate file when using gcc or clang. # to be consistent with Makefile, don't generate for OS X. -if((CMAKE_COMPILER_IS_GNUCC) AND NOT ("${CMAKE_SYSTEM_NAME}" MATCHES Darwin)) +if((CMAKE_COMPILER_IS_GNUCC OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND NOT ("${CMAKE_SYSTEM_NAME}" MATCHES Darwin)) if((${CMAKE_BUILD_TYPE} MATCHES Debug) OR (${CMAKE_BUILD_TYPE} MATCHES RelWithDebInfo)) if(${CMAKE_BUILD_TYPE} MATCHES Debug) set(OBJCOPY_ONLY_KEEP_DEBUG "--only-keep-debug") endif() message(STATUS "Will make separate debug symbols in *.debug") add_custom_command(TARGET SRB2SDL2 POST_BUILD - COMMAND ${OBJCOPY} ${OBJCOPY_ONLY_KEEP_DEBUG} $ $.debug + COMMAND ${CMAKE_OBJCOPY} ${OBJCOPY_ONLY_KEEP_DEBUG} $ $.debug # mold linker: .gnu_debuglink is present by default, so --add-gnu-debuglink would fail - COMMAND ${OBJCOPY} --strip-debug --remove-section=.gnu_debuglink $ - COMMAND ${OBJCOPY} --add-gnu-debuglink=$.debug $ + COMMAND ${CMAKE_OBJCOPY} --strip-debug --remove-section=.gnu_debuglink $ + COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=$.debug $ ) endif() endif() @@ -378,14 +391,22 @@ endif() # copy DLLs to bin/ directory if building internal shared on windows if("${CMAKE_SYSTEM_NAME}" STREQUAL Windows AND NOT "${SRB2_CONFIG_INTERNAL_LIBRARIES}" AND "${SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES}") set(ADDITIONAL_DLLS "") - if("${CMAKE_C_COMPILER_ID}" STREQUAL GNU) + if("${CMAKE_C_COMPILER_ID}" STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # also copy implicitly linked system libraries get_filename_component(MINGW_BIN_PATH ${CMAKE_CXX_COMPILER} PATH) - list(APPEND ADDITIONAL_DLLS - "libgcc_s_dw2-1.dll" - "libstdc++-6.dll" - "libwinpthread-1.dll" - ) + if("${CMAKE_C_COMPILER_ID}" STREQUAL GNU) + list(APPEND ADDITIONAL_DLLS + "libgcc_s_dw2-1.dll" + "libstdc++-6.dll" + "libwinpthread-1.dll" + ) + else() + list(APPEND ADDITIONAL_DLLS + "libunwind.dll" + "libc++.dll" + "libwinpthread-1.dll" + ) + endif() list(TRANSFORM ADDITIONAL_DLLS PREPEND "${MINGW_BIN_PATH}/") endif() add_custom_command(TARGET SRB2SDL2 POST_BUILD diff --git a/src/acs/call-funcs.cpp b/src/acs/call-funcs.cpp index 180ca604c..367569279 100644 --- a/src/acs/call-funcs.cpp +++ b/src/acs/call-funcs.cpp @@ -1621,7 +1621,7 @@ bool CallFunc_CountPushables(ACSVM::Thread *thread, const ACSVM::Word *argV, ACS --------------------------------------------------*/ /*bool CallFunc_HaveUnlockable(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC) { - UINT8 id = 0; + UINT32 id = 0; bool unlocked = false; (void)argC; diff --git a/src/core/static_vec.hpp b/src/core/static_vec.hpp index 244728c3b..a5a529564 100644 --- a/src/core/static_vec.hpp +++ b/src/core/static_vec.hpp @@ -238,11 +238,12 @@ bool operator!=(const srb2::StaticVec& lhs, const srb2::StaticVec& template struct std::hash> { - uint64_t operator()(const srb2::StaticVec& input) const + size_t operator()(const srb2::StaticVec& input) const { - constexpr const uint64_t prime {0x00000100000001B3}; - std::size_t ret {0xcbf29ce484222325}; + constexpr size_t prime = sizeof(size_t) == 8 ? 0x00000100000001B3 : 0x01000193; + constexpr size_t basis = sizeof(size_t) == 8 ? 0xcbf29ce484222325 : 0x811c9dc5; + size_t ret = basis; for (auto itr = input.begin(); itr != input.end(); itr++) { ret = (ret * prime) ^ std::hash(*itr); diff --git a/src/doomdef.h b/src/doomdef.h index fe393d6fe..428397ab5 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -400,6 +400,9 @@ extern struct debugFlagNames_s const debug_flag_names[]; // Misc stuff for later... // ======================= +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif #define ANG2RAD(angle) ((float)((angle)*M_PI)/ANGLE_180) // Modifier key variables, accessible anywhere diff --git a/src/doomtype.h b/src/doomtype.h index f74f340fe..6cd483773 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -262,7 +262,7 @@ enum {false = 0, true = 1}; #endif #endif - #if defined (__MINGW32__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) // MinGW, >= GCC 3.4 + #if defined (__MINGW32__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && !defined(__clang__) // MinGW, >= GCC 3.4, not Clang #define ATTRPACK __attribute__((packed, gcc_struct)) #else #define ATTRPACK __attribute__((packed)) @@ -400,8 +400,12 @@ typedef UINT64 precise_t; // that struct and it's fine... // Cast function pointer to (void*) -#define FUNCPTRCAST(p) ((union{void(*f)(void);void*v;})\ - {(void(*)(void))p}).v +typedef union { + void (*f)(void); + void *v; +} func_ptr_cast_union; + +#define FUNCPTRCAST(p) (((func_ptr_cast_union){(void(*)(void))(p)}).v) #include "typedef.h" diff --git a/src/m_misc.cpp b/src/m_misc.cpp index 840d6213b..4de8f9316 100644 --- a/src/m_misc.cpp +++ b/src/m_misc.cpp @@ -997,14 +997,14 @@ static inline boolean M_PNGLib(void) if (!pnglib) return false; #ifdef HAVE_SDL - aPNG_set_acTL = hwSym("png_set_acTL", pnglib); - aPNG_write_frame_head = hwSym("png_write_frame_head", pnglib); - aPNG_write_frame_tail = hwSym("png_write_frame_tail", pnglib); + aPNG_set_acTL = (P_png_set_acTL) hwSym("png_set_acTL", pnglib); + aPNG_write_frame_head = (P_png_write_frame_head) hwSym("png_write_frame_head", pnglib); + aPNG_write_frame_tail = (P_png_write_frame_tail) hwSym("png_write_frame_tail", pnglib); #endif #ifdef _WIN32 - aPNG_set_acTL = GetProcAddress("png_set_acTL", pnglib); - aPNG_write_frame_head = GetProcAddress("png_write_frame_head", pnglib); - aPNG_write_frame_tail = GetProcAddress("png_write_frame_tail", pnglib); + aPNG_set_acTL = (P_png_set_acTL) GetProcAddress("png_set_acTL", pnglib); + aPNG_write_frame_head = (P_png_write_frame_head) GetProcAddress("png_write_frame_head", pnglib); + aPNG_write_frame_tail = (P_png_write_frame_tail) GetProcAddress("png_write_frame_tail", pnglib); #endif return (aPNG_set_acTL && aPNG_write_frame_head && aPNG_write_frame_tail); #endif @@ -1017,7 +1017,7 @@ static void M_PNGFrame(png_structp png_ptr, png_infop png_info_ptr, png_bytep pn png_uint_32 pitch = png_get_rowbytes(png_ptr, png_info_ptr); PNG_CONST png_uint_32 width = vid.width / downscale; PNG_CONST png_uint_32 height = vid.height / downscale; - png_bytepp row_pointers = png_malloc(png_ptr, height * sizeof (png_bytep)); + png_bytepp row_pointers = (png_bytepp) png_malloc(png_ptr, height * sizeof (png_bytep)); png_uint_32 x, y; png_uint_16 framedelay = (png_uint_16)cv_apng_delay.value; @@ -1025,7 +1025,7 @@ static void M_PNGFrame(png_structp png_ptr, png_infop png_info_ptr, png_bytep pn for (y = 0; y < height; y++) { - row_pointers[y] = malloc(pitch * sizeof(png_byte)); + row_pointers[y] = (png_bytep) malloc(pitch * sizeof(png_byte)); for (x = 0; x < width; x++) row_pointers[y][x] = png_buf[x * downscale]; png_buf += pitch * (downscale * downscale); diff --git a/src/p_spec.c b/src/p_spec.c index 00938b32a..a5a068028 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4971,7 +4971,7 @@ sector_t *P_FindPlayerTrigger(player_t *player, line_t *sourceline) return loopsector; } - return false; + return NULL; } boolean P_IsPlayerValid(size_t playernum) diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index e49596525..8bc6a5423 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -15,8 +15,12 @@ target_sources(SRB2SDL2 PRIVATE if("${CMAKE_SYSTEM_NAME}" MATCHES Windows) target_sources(SRB2SDL2 PRIVATE - ../win32/win_dbg.c - ../win32/Srb2win.rc) + ../win32/win_dbg.c) + + if("${CMAKE_C_COMPILER_ID}" MATCHES clang) + target_sources(SRB2SDL2 PRIVATE + ../win32/Srb2win.rc) + endif() endif() if("${CMAKE_SYSTEM_NAME}" MATCHES Darwin) diff --git a/src/sdl/i_system.cpp b/src/sdl/i_system.cpp index e32948f60..7f73ba17a 100644 --- a/src/sdl/i_system.cpp +++ b/src/sdl/i_system.cpp @@ -2048,7 +2048,7 @@ void I_Error(const char *error, ...) W_Shutdown(); #if defined (PARANOIA) && defined (__CYGWIN__) - *(INT32 *)2 = 4; //Alam: Debug! + *(volatile INT32 *)0 = 4; //Alam: Debug! #endif exit(-1); diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index b9a2e51d7..c4139f774 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -45,7 +45,7 @@ if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") "SDL2MIXER_MP3 ON" "SDL2MIXER_MP3_DRMP3 ON" "SDL2MIXER_MIDI ON" - "SDL2MIXER_OPUS ON" + "SDL2MIXER_OPUS OFF" "SDL2MIXER_VORBIS STB" "SDL2MIXER_WAVE ON" ) diff --git a/toolchain/windowsCLANG.cmake b/toolchain/windowsCLANG.cmake new file mode 100644 index 000000000..5ed085f8f --- /dev/null +++ b/toolchain/windowsCLANG.cmake @@ -0,0 +1,18 @@ +# the name of the target operating system +set(CMAKE_SYSTEM_NAME Windows) + +# which compilers to use for C and C++ +set(CMAKE_C_COMPILER clang -target x86_64-pc-windows-gnu) +set(CMAKE_CXX_COMPILER clang++ -target x86_64-pc-windows-gnu) + +# Set that this is clang. +set(CMAKE_C_COMPILER_ID clang) +set(CMAKE_CXX_COMPILER_ID clang) + +# adjust the default behavior of the FIND_XXX() commands: +# search programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +# search headers and libraries in the target environment +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/toolchain/windowsGCC.cmake b/toolchain/windowsGCC.cmake new file mode 100644 index 000000000..a1faab12c --- /dev/null +++ b/toolchain/windowsGCC.cmake @@ -0,0 +1,17 @@ +# the name of the target operating system +set(CMAKE_SYSTEM_NAME Windows) + +# which compilers to use for C and C++ +set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) + +# set the root path +set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) + +# adjust the default behavior of the FIND_XXX() commands: +# search programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +# search headers and libraries in the target environment +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)