include(clang-tidy-default) add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32 comptime.c md5.c config.h.in string.c d_main.c dehacked.c deh_soc.c deh_lua.c deh_tables.c z_zone.c f_finale.c f_wipe.c g_demo.c g_game.c g_input.c am_map.c command.c console.c hu_stuff.c i_time.c y_inter.c st_stuff.c m_aatree.c m_anigif.c m_argv.c m_bbox.c m_cheat.c m_cond.c m_easing.c m_fixed.c m_menu.c m_misc.c m_perfstats.c m_random.c m_tokenizer.c m_queue.c m_vector.c info.c p_ceilng.c p_enemy.c p_floor.c p_inter.c p_lights.c p_map.c p_maputl.c p_mobj.c p_polyobj.c p_saveg.c p_setup.c p_sight.c p_spec.c p_telept.c p_tick.c p_user.c p_slopes.c tables.c r_bsp.c r_data.c r_draw.c r_fps.c r_main.c r_plane.c r_segs.c r_skins.c r_sky.c r_splats.c r_things.c r_bbox.c r_textures.c r_translation.c r_patch.c r_patchrotation.c r_picformats.c r_portal.c screen.c taglist.c v_video.c s_sound.c sounds.c w_wad.c filesrch.c lzf.c b_bot.c u_list.c snake.c lua_script.c lua_baselib.c lua_mathlib.c lua_hooklib.c lua_consolelib.c lua_infolib.c lua_mobjlib.c lua_playerlib.c lua_skinlib.c lua_thinkerlib.c lua_maplib.c lua_taglib.c lua_polyobjlib.c lua_blockmaplib.c lua_hudlib.c lua_hudlib_drawlist.c lua_colorlib.c lua_inputlib.c ) # This updates the modification time for comptime.c at the # end of building so when the build system is ran next time, # that file gets flagged. comptime.c will always be rebuilt. # # This begs the question, why always rebuild comptime.c? # Some things like the git commit must be checked each time # the program is built. But the build system determines which # files should be rebuilt before anything else. So # comptime.c, which only needs to be rebuilt based on # information known at build time, must be told to rebuild # before that information can be ascertained. add_custom_command( TARGET SRB2SDL2 POST_BUILD COMMAND ${CMAKE_COMMAND} -E touch_nocreate ${CMAKE_CURRENT_SOURCE_DIR}/comptime.c ) # config.h is generated by this command. It should be done at # build time for accurate git information and before anything # that needs it, obviously. add_custom_target(_SRB2_reconf ALL COMMAND ${CMAKE_COMMAND} -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DBINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/.. -P ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Comptime.cmake WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.." ) add_dependencies(SRB2SDL2 _SRB2_reconf) if("${CMAKE_COMPILER_IS_GNUCC}" AND "${CMAKE_SYSTEM_NAME}" MATCHES "Windows") target_link_options(SRB2SDL2 PRIVATE "-Wl,--disable-dynamicbase") if(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") endif() endif() target_compile_features(SRB2SDL2 PRIVATE c_std_11 cxx_std_17) ### Configuration set(SRB2_CONFIG_DEV_BUILD OFF CACHE BOOL "Compile a development build of SRB2.") add_subdirectory(blua) add_subdirectory(netcode) # OS macros if (UNIX) target_compile_definitions(SRB2SDL2 PRIVATE -DUNIXCOMMON) endif() if (BSD MATCHES "FreeBSD") target_compile_definitions(SRB2SDL2 PRIVATE -DFREEBSD) endif() if(CMAKE_COMPILER_IS_GNUCC) find_program(OBJCOPY objcopy) endif() if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") target_compile_definitions(SRB2SDL2 PRIVATE -DLINUX) if(${SRB2_SYSTEM_BITS} EQUAL 64) target_compile_definitions(SRB2SDL2 PRIVATE -DLINUX64) endif() endif() if("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") target_compile_definitions(SRB2SDL2 PRIVATE -DMACOSX) endif() if("${SRB2_CONFIG_USE_GME}") target_link_libraries(SRB2SDL2 PRIVATE gme) target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_GME) if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") # this sucks but gme doesn't use modern cmake to delineate public headers target_include_directories(SRB2SDL2 PRIVATE "${libgme_SOURCE_DIR}") endif() endif() target_link_libraries(SRB2SDL2 PRIVATE openmpt) target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_OPENMPT) target_link_libraries(SRB2SDL2 PRIVATE ZLIB::ZLIB PNG::PNG CURL::libcurl) target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_ZLIB -DHAVE_PNG -DHAVE_CURL -D_LARGEFILE64_SOURCE) target_sources(SRB2SDL2 PRIVATE apng.c) set(SRB2_HAVE_THREADS ON) target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_THREADS) if("${SRB2_CONFIG_HWRENDER}") target_compile_definitions(SRB2SDL2 PRIVATE -DHWRENDER) add_subdirectory(hardware) if("${SRB2_CONFIG_STATIC_OPENGL}") find_package(OpenGL) if(${OPENGL_FOUND}) target_compile_definitions(SRB2SDL2 PRIVATE -DSTATIC_OPENGL) else() message(WARNING "You have specified static opengl but opengl was not found. Not setting HWRENDER.") endif() endif() endif() # Targets # If using CCACHE, then force it. # https://github.com/Cockatrice/Cockatrice/pull/3052/files if ("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") get_property(RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE) if(RULE_LAUNCH_COMPILE) MESSAGE(STATUS "Force enabling CCache usage under macOS") # Set up wrapper scripts configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/launch-c.in ${CMAKE_BINARY_DIR}/launch-c) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/launch-cxx.in ${CMAKE_BINARY_DIR}/launch-cxx) execute_process(COMMAND chmod a+rx "${CMAKE_BINARY_DIR}/launch-c" "${CMAKE_BINARY_DIR}/launch-cxx") # Set Xcode project attributes to route compilation through our scripts set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_BINARY_DIR}/launch-c") set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_BINARY_DIR}/launch-cxx") set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_BINARY_DIR}/launch-c") set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_BINARY_DIR}/launch-cxx") endif() 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_SYSTEM_PROCESSOR MATCHES "^(x86_64|x64|amd64|AMD64|em64t|EM64T)") target_compile_options(SRB2SDL2 PRIVATE -mno-ms-bitfields) endif() endif() # Compiler warnings configuration target_compile_options(SRB2SDL2 PRIVATE # Using generator expressions to handle per-language compile options # C, GNU # This is a direct translation from versions.mk $<$,$>: -Wall -Wextra -Wno-trigraphs -W # Was controlled by RELAXWARNINGS -Wfloat-equal -Wundef -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align # Was controlled by NOCASTALIGNWARN -Wwrite-strings -Wsign-compare -Waggregate-return -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wnested-externs -Winline -Wformat-y2k -Wformat-security -fwrapv $<$,2.9.5>: -Wno-div-by-zero -Wendif-labels -Wdisabled-optimization > $<$,4.0.0>: -Wold-style-definition -Wmissing-field-initializers > $<$,4.1.0>: -Wshadow > $<$,4.3.0>: -funit-at-a-time -Wlogical-op > $<$,4.5.0>: -Wlogical-op #-Wno-error=array-bounds > $<$,4.6.0>: -Wno-suggest-attribute=noreturn -Wno-error=suggest-attribute=noreturn > $<$,5.4.0>: -Wno-logical-op -Wno-error=logical-op > $<$,6.1.0>: -Wno-tautological-compare -Wno-error=tautological-compare > $<$,7.1.0>: -Wno-error=format-overflow=2 -Wimplicit-fallthrough=4 > $<$,8.1.0>: -Wno-error=format-overflow -Wno-error=stringop-truncation -Wno-error=stringop-overflow -Wno-format-overflow -Wno-stringop-truncation -Wno-stringop-overflow -Wno-error=multistatement-macros > $<$,9.1.0>: -Wno-error=address-of-packed-member > > # C, Clang and Apple Clang $<$,$,$>>: -Wall -Wno-absolute-value -Wextra -Wno-trigraphs -Wconditional-uninitialized -Wno-error=non-literal-null-conversion -Wno-error=constant-conversion -Wno-error=unused-but-set-variable -fwrapv > # C, MSVC $<$,$>: # All warnings at and before Visual Studio 2019 RTM # https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warnings-by-compiler-version?view=msvc-170 /Wv:19.20.27004.0 > # C++, GNU, Clang and Apple Clang $<$,$,$,$>>: -Wall -Wextra -Wno-trigraphs -Wconditional-uninitialized > # C++, MSVC $<$,$>: /Wv:19.20.27004.0 > ) if(SRB2_CONFIG_ERRORMODE) target_compile_options(SRB2SDL2 PRIVATE $<$,$,$>: -Werror > $<$: /WX > ) endif() # Link warnings configuration target_link_options(SRB2SDL2 PRIVATE $<$: # -Wl,--as-needed - Was controlled by NOLDWARNING > ) if(${SRB2_CONFIG_DEV_BUILD}) target_compile_definitions(SRB2SDL2 PRIVATE -DDEVELOP) endif() target_compile_definitions(SRB2SDL2 PRIVATE -DCMAKECONFIG) # Misc. build options from Makefiles if(SRB2_CONFIG_DEBUGMODE) target_compile_definitions(SRB2SDL2 PRIVATE -DZDEBUG -DPARANOIA -DRANGECHECK -DPACKETDROP) endif() if(SRB2_CONFIG_MOBJCONSISTANCY) target_compile_definitions(SRB2SDL2 PRIVATE -DMOBJCONSISTANCY) endif() if(SRB2_CONFIG_PACKETDROP) target_compile_definitions(SRB2SDL2 PRIVATE -DPACKETDROP) endif() if(SRB2_CONFIG_EXECINFO) else() target_compile_definitions(SRB2SDL2 PRIVATE -DNOEXECINFO) message(STATUS "You have disabled stack trace dump support") endif() if(SRB2_CONFIG_ZDEBUG) target_compile_definitions(SRB2SDL2 PRIVATE -DZDEBUG) endif() if(SRB2_CONFIG_PROFILEMODE AND "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") target_compile_options(SRB2SDL2 PRIVATE -pg) target_link_options(SRB2SDL2 PRIVATE -pg) endif() add_subdirectory(sdl) if(SRB2_CONFIG_ENABLE_TESTS) add_subdirectory(tests) endif() # strip debug symbols into separate file when using gcc. # 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_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 ${OBJCOPY} --strip-debug $ COMMAND ${OBJCOPY} --add-gnu-debuglink=$.debug $ ) endif() 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) # 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" ) list(TRANSFORM ADDITIONAL_DLLS PREPEND "${MINGW_BIN_PATH}/") endif() add_custom_command(TARGET SRB2SDL2 POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${ADDITIONAL_DLLS} $ COMMAND_EXPAND_LISTS COMMENT "Copying runtime DLLs" ) endif() # Setup clang-tidy if(SRB2_CONFIG_ENABLE_CLANG_TIDY_C) target_set_default_clang_tidy(SRB2SDL2 C "-*,clang-analyzer-*,-clang-analyzer-cplusplus-*") endif() if(SRB2_CONFIG_ENABLE_CLANG_TIDY_CXX) target_set_default_clang_tidy(SRB2SDL2 CXX "-*,clang-analyzer-*,modernize-*") endif()