mirror of
https://github.com/fallout2-ce/fallout2-ce.git
synced 2026-07-27 16:47:11 -07:00
* Add basic content config structure * Moved non-file related settings from ddraw.ini to game.cfg * Various fixes from self review * Moved remaining worldmap settings to game.cfg * Migrate character and text related settings * Update docs * chore: auto-format with clang-format * Add hard-coded foce_base.dat to have reliable location to load CE-provided content from * Move game.cfg to new base mod * Automatic migration from ddraw.ini * chore: auto-format with clang-format * Removed option to disable cities limit fix * Minor review comment fixes * Migrate to /data instead of CE dat * Migrate to local game#patch.cfg and skip fields with default values - This was if some mod modifies/overwrites game.cfg later, only fields that user cares about will be loaded from user's override, and said mod is less likely to break * Fix potential issue when "master_patches" is an absolute path and move recursive mkdir into a helper function * Refactor code and fix some edge cases: data folder not exists when migrating, ddraw.ini doesn't exist * Rename face_base.dat -> ce.dat --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
543 lines
16 KiB
CMake
543 lines
16 KiB
CMake
cmake_minimum_required(VERSION 3.18)
|
|
|
|
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
|
|
|
|
set(EXECUTABLE_NAME fallout2-ce)
|
|
|
|
if(APPLE)
|
|
if(IOS)
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "12" CACHE STRING "")
|
|
set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "")
|
|
else()
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "")
|
|
set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "")
|
|
endif()
|
|
endif()
|
|
|
|
project(${EXECUTABLE_NAME})
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED YES)
|
|
set(CMAKE_CXX_EXTENSIONS NO)
|
|
|
|
option(FALLOUT_VENDORED "Use vendored third-party libraries" ON)
|
|
|
|
if(ANDROID)
|
|
add_library(${EXECUTABLE_NAME} SHARED)
|
|
else()
|
|
add_executable(${EXECUTABLE_NAME} WIN32 MACOSX_BUNDLE)
|
|
endif()
|
|
|
|
# Git Info
|
|
include("cmake/gitver.cmake")
|
|
|
|
target_sources(${EXECUTABLE_NAME} PUBLIC
|
|
"src/actions.cc"
|
|
"src/actions.h"
|
|
"src/animation.cc"
|
|
"src/animation.h"
|
|
"src/art.cc"
|
|
"src/art.h"
|
|
"src/audio_file.cc"
|
|
"src/audio_file.h"
|
|
"src/audio.cc"
|
|
"src/audio.h"
|
|
"src/automap.cc"
|
|
"src/automap.h"
|
|
"src/autorun.cc"
|
|
"src/autorun.h"
|
|
"src/cache.cc"
|
|
"src/cache.h"
|
|
"src/character_editor.cc"
|
|
"src/character_editor.h"
|
|
"src/character_selector.cc"
|
|
"src/character_selector.h"
|
|
"src/color.cc"
|
|
"src/color.h"
|
|
"src/combat_ai_defs.h"
|
|
"src/combat_ai.cc"
|
|
"src/combat_ai.h"
|
|
"src/combat_defs.h"
|
|
"src/combat.cc"
|
|
"src/combat.h"
|
|
"src/config.cc"
|
|
"src/config.h"
|
|
"src/content_config.cc"
|
|
"src/content_config.h"
|
|
"src/credits.cc"
|
|
"src/credits.h"
|
|
"src/critter.cc"
|
|
"src/critter.h"
|
|
"src/cycle.cc"
|
|
"src/cycle.h"
|
|
"src/datafile.cc"
|
|
"src/datafile.h"
|
|
"src/db.cc"
|
|
"src/db.h"
|
|
"src/dbox.cc"
|
|
"src/dbox.h"
|
|
"src/debug.cc"
|
|
"src/debug.h"
|
|
"src/dfile.cc"
|
|
"src/dfile.h"
|
|
"src/dialog.cc"
|
|
"src/dialog.h"
|
|
"src/dictionary.cc"
|
|
"src/dictionary.h"
|
|
"src/dinput.cc"
|
|
"src/dinput.h"
|
|
"src/display_monitor.cc"
|
|
"src/display_monitor.h"
|
|
"src/draw.cc"
|
|
"src/draw.h"
|
|
"src/elevator.cc"
|
|
"src/elevator.h"
|
|
"src/endgame.cc"
|
|
"src/endgame.h"
|
|
"src/export.cc"
|
|
"src/export.h"
|
|
"src/file_find.cc"
|
|
"src/file_find.h"
|
|
"src/file_utils.cc"
|
|
"src/file_utils.h"
|
|
"src/font_manager.cc"
|
|
"src/font_manager.h"
|
|
"src/game_config.cc"
|
|
"src/game_config.h"
|
|
"src/game_config_migration.cc"
|
|
"src/game_config_migration.h"
|
|
"src/game_dialog.cc"
|
|
"src/game_dialog.h"
|
|
"src/game_memory.cc"
|
|
"src/game_memory.h"
|
|
"src/game_mouse.cc"
|
|
"src/game_mouse.h"
|
|
"src/game_movie.cc"
|
|
"src/game_movie.h"
|
|
"src/game_sound.cc"
|
|
"src/game_sound.h"
|
|
"src/game_vars.h"
|
|
"src/game.cc"
|
|
"src/game.h"
|
|
"src/geometry.cc"
|
|
"src/geometry.h"
|
|
"src/graph_lib.cc"
|
|
"src/graph_lib.h"
|
|
"src/heap.cc"
|
|
"src/heap.h"
|
|
"src/input.cc"
|
|
"src/input.h"
|
|
"src/interface.cc"
|
|
"src/interface.h"
|
|
"src/interpreter_extra.cc"
|
|
"src/interpreter_extra.h"
|
|
"src/interpreter_lib.cc"
|
|
"src/interpreter_lib.h"
|
|
"src/interpreter.cc"
|
|
"src/interpreter.h"
|
|
"src/inventory.cc"
|
|
"src/inventory.h"
|
|
"src/item.cc"
|
|
"src/item.h"
|
|
"src/kb.cc"
|
|
"src/kb.h"
|
|
"src/light.cc"
|
|
"src/light.h"
|
|
"src/lips.cc"
|
|
"src/lips.h"
|
|
"src/loadsave.cc"
|
|
"src/loadsave.h"
|
|
"src/main.cc"
|
|
"src/main.h"
|
|
"src/mainmenu.cc"
|
|
"src/mainmenu.h"
|
|
"src/map_defs.h"
|
|
"src/map.cc"
|
|
"src/map.h"
|
|
"src/memory_defs.h"
|
|
"src/memory_manager.cc"
|
|
"src/memory_manager.h"
|
|
"src/memory.cc"
|
|
"src/memory.h"
|
|
"src/message.cc"
|
|
"src/message.h"
|
|
"src/mouse_manager.cc"
|
|
"src/mouse_manager.h"
|
|
"src/mouse.cc"
|
|
"src/mouse.h"
|
|
"src/movie_effect.cc"
|
|
"src/movie_effect.h"
|
|
"src/movie_lib.cc"
|
|
"src/movie_lib.h"
|
|
"src/movie.cc"
|
|
"src/movie.h"
|
|
"src/nevs.cc"
|
|
"src/nevs.h"
|
|
"src/obj_types.h"
|
|
"src/object.cc"
|
|
"src/object.h"
|
|
"src/opcode_context.cc"
|
|
"src/opcode_context.h"
|
|
"src/options.cc"
|
|
"src/options.h"
|
|
"src/palette.cc"
|
|
"src/palette.h"
|
|
"src/party_member.cc"
|
|
"src/party_member.h"
|
|
"src/pcx.cc"
|
|
"src/pcx.h"
|
|
"src/perk_defs.h"
|
|
"src/perk.cc"
|
|
"src/perk.h"
|
|
"src/pipboy.cc"
|
|
"src/pipboy.h"
|
|
"src/proto_instance.cc"
|
|
"src/proto_instance.h"
|
|
"src/proto_types.h"
|
|
"src/proto.cc"
|
|
"src/proto.h"
|
|
"src/queue.cc"
|
|
"src/queue.h"
|
|
"src/random.cc"
|
|
"src/random.h"
|
|
"src/reaction.cc"
|
|
"src/reaction.h"
|
|
"src/region.cc"
|
|
"src/region.h"
|
|
"src/scripts.cc"
|
|
"src/scripts.h"
|
|
"src/select_file_list.cc"
|
|
"src/select_file_list.h"
|
|
"src/skill_defs.h"
|
|
"src/skill.cc"
|
|
"src/skill.h"
|
|
"src/skilldex.cc"
|
|
"src/skilldex.h"
|
|
"src/sound_decoder.cc"
|
|
"src/sound_decoder.h"
|
|
"src/sound_effects_cache.cc"
|
|
"src/sound_effects_cache.h"
|
|
"src/sound_effects_list.cc"
|
|
"src/sound_effects_list.h"
|
|
"src/sound.cc"
|
|
"src/sound.h"
|
|
"src/stat_defs.h"
|
|
"src/stat.cc"
|
|
"src/stat.h"
|
|
"src/string_parsers.cc"
|
|
"src/string_parsers.h"
|
|
"src/svga.cc"
|
|
"src/svga.h"
|
|
"src/text_font.cc"
|
|
"src/text_font.h"
|
|
"src/text_object.cc"
|
|
"src/text_object.h"
|
|
"src/tile.cc"
|
|
"src/tile.h"
|
|
"src/tile_hires_stencil.cc"
|
|
"src/tile_hires_stencil.h"
|
|
"src/trait_defs.h"
|
|
"src/trait.cc"
|
|
"src/trait.h"
|
|
"src/version.cc"
|
|
"src/version.h"
|
|
"src/widget.cc"
|
|
"src/widget.h"
|
|
"src/win32.cc"
|
|
"src/win32.h"
|
|
"src/window_manager_private.cc"
|
|
"src/window_manager_private.h"
|
|
"src/window_manager.cc"
|
|
"src/window_manager.h"
|
|
"src/window.cc"
|
|
"src/window.h"
|
|
"src/word_wrap.cc"
|
|
"src/word_wrap.h"
|
|
"src/worldmap.cc"
|
|
"src/worldmap.h"
|
|
"src/xfile.cc"
|
|
"src/xfile.h"
|
|
)
|
|
|
|
target_sources(${EXECUTABLE_NAME} PUBLIC
|
|
"src/audio_engine.cc"
|
|
"src/audio_engine.h"
|
|
"src/delay.cc"
|
|
"src/delay.h"
|
|
"src/fps_limiter.cc"
|
|
"src/fps_limiter.h"
|
|
"src/platform_compat.cc"
|
|
"src/platform_compat.h"
|
|
"src/pointer_registry.cc"
|
|
"src/pointer_registry.h"
|
|
"src/preferences.cc"
|
|
"src/preferences.h"
|
|
"src/settings.cc"
|
|
"src/settings.h"
|
|
"src/sfall_config.cc"
|
|
"src/sfall_config.h"
|
|
"src/sfall_ext.cc"
|
|
"src/sfall_ext.h"
|
|
"src/sfall_global_vars.cc"
|
|
"src/sfall_global_vars.h"
|
|
"src/sfall_global_scripts.cc"
|
|
"src/sfall_global_scripts.h"
|
|
"src/sfall_ini.cc"
|
|
"src/sfall_ini.h"
|
|
"src/sfall_kb_helpers.cc"
|
|
"src/sfall_kb_helpers.h"
|
|
"src/sfall_lists.cc"
|
|
"src/sfall_lists.h"
|
|
"src/sfall_metarules.cc"
|
|
"src/sfall_metarules.h"
|
|
"src/sfall_opcodes.cc"
|
|
"src/sfall_opcodes.h"
|
|
"src/sfall_script_hooks.cc"
|
|
"src/sfall_arrays.cc"
|
|
"src/sfall_arrays.h"
|
|
"src/sfall_animation.cc"
|
|
"src/sfall_animation.h"
|
|
"src/sfall_callbacks.cc"
|
|
"src/sfall_callbacks.h"
|
|
"src/touch.cc"
|
|
"src/touch.h"
|
|
"src/scan_unimplemented.cc"
|
|
"third_party/lodepng/lodepng.cpp"
|
|
)
|
|
|
|
target_include_directories(${EXECUTABLE_NAME} PUBLIC "third_party/lodepng")
|
|
|
|
if(IOS)
|
|
target_sources(${EXECUTABLE_NAME} PUBLIC
|
|
"src/platform/ios/paths.h"
|
|
"src/platform/ios/paths.mm"
|
|
)
|
|
endif()
|
|
|
|
if(WIN32)
|
|
target_compile_definitions(${EXECUTABLE_NAME} PUBLIC
|
|
_CRT_SECURE_NO_WARNINGS
|
|
_CRT_NONSTDC_NO_WARNINGS
|
|
NOMINMAX
|
|
WIN32_LEAN_AND_MEAN
|
|
_STATIC_CPPLIB
|
|
)
|
|
endif()
|
|
|
|
if(WIN32)
|
|
target_link_libraries(${EXECUTABLE_NAME}
|
|
winmm
|
|
debug libcpmtd
|
|
optimized libcpmt
|
|
)
|
|
endif()
|
|
|
|
if(WIN32)
|
|
target_sources(${EXECUTABLE_NAME} PUBLIC
|
|
"os/windows/fallout2-ce.ico"
|
|
"os/windows/fallout2-ce.rc"
|
|
)
|
|
endif()
|
|
|
|
if(APPLE)
|
|
if(IOS)
|
|
set(RESOURCES
|
|
"os/ios/AppIcon.xcassets"
|
|
"os/ios/LaunchScreen.storyboard"
|
|
)
|
|
|
|
target_sources(${EXECUTABLE_NAME} PUBLIC ${RESOURCES})
|
|
set_source_files_properties(${RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
|
|
|
|
set_target_properties(${EXECUTABLE_NAME} PROPERTIES
|
|
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/os/ios/Info.plist"
|
|
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
|
|
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.alexbatalov.fallout2-ce"
|
|
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
|
|
)
|
|
|
|
set(MACOSX_BUNDLE_BUNDLE_NAME "${EXECUTABLE_NAME}")
|
|
set(MACOSX_BUNDLE_DISPLAY_NAME "Fallout 2")
|
|
else()
|
|
set(RESOURCES
|
|
"os/macos/fallout2-ce.icns"
|
|
)
|
|
|
|
target_sources(${EXECUTABLE_NAME} PUBLIC ${RESOURCES})
|
|
set_source_files_properties(${RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
|
|
|
|
set_target_properties(${EXECUTABLE_NAME} PROPERTIES
|
|
OUTPUT_NAME "Fallout II Community Edition"
|
|
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/os/macos/Info.plist"
|
|
XCODE_ATTRIBUTE_EXECUTABLE_NAME "${EXECUTABLE_NAME}"
|
|
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.alexbatalov.fallout2-ce"
|
|
)
|
|
|
|
set(MACOSX_BUNDLE_ICON_FILE "fallout2-ce.icns")
|
|
set(MACOSX_BUNDLE_BUNDLE_NAME "Fallout II: Community Edition")
|
|
set(MACOSX_BUNDLE_DISPLAY_NAME "Fallout II")
|
|
endif()
|
|
|
|
set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.alexbatalov.fallout2-ce")
|
|
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "1.3.0")
|
|
set(MACOSX_BUNDLE_BUNDLE_VERSION "1.3.0")
|
|
endif()
|
|
|
|
if((NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten"))
|
|
if(FALLOUT_VENDORED)
|
|
add_subdirectory("third_party/zlib")
|
|
add_subdirectory("third_party/sdl2")
|
|
else()
|
|
find_package(ZLIB)
|
|
find_package(SDL2)
|
|
endif()
|
|
else()
|
|
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
|
|
--use-port=sdl2 \
|
|
--use-port=sdl2_mixer \
|
|
--use-port=zlib" )
|
|
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
|
|
--use-port=sdl2 \
|
|
--use-port=sdl2_mixer \
|
|
--use-port=zlib \
|
|
-std=c++17" )
|
|
|
|
|
|
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
|
|
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
|
|
|
|
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O1")
|
|
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O1")
|
|
|
|
if(OPTION_WASM_64)
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sMEMORY64" )
|
|
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -sMEMORY64" )
|
|
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -sMEMORY64" )
|
|
add_compile_options( -sMEMORY64 )
|
|
endif()
|
|
|
|
if(OPTION_WASM_JSPI)
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sJSPI" )
|
|
else()
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sASYNCIFY" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sASYNCIFY_STACK_SIZE=20480" )
|
|
endif()
|
|
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sENVIRONMENT=web" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sALLOW_MEMORY_GROWTH" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-MEMORY_GROWTH_LINEAR_STEP=32mb" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sNO_DISABLE_EXCEPTION_CATCHING" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-lidbfs.js" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sCASE_INSENSITIVE_FS" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sMODULARIZE" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sEXPORTED_RUNTIME_METHODS=callMain,addRunDependency,removeRunDependency" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sEXPORT_ALL" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sEXPORT_NAME=fallout2ce" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "-sEXIT_RUNTIME" )
|
|
target_link_options( ${EXECUTABLE_NAME} PRIVATE "$<$<CONFIG:DEBUG>:-g>" )
|
|
endif()
|
|
|
|
|
|
add_subdirectory("third_party/fpattern")
|
|
target_link_libraries(${EXECUTABLE_NAME} fpattern::fpattern)
|
|
target_link_libraries(${EXECUTABLE_NAME} fpattern_windows::fpattern_windows)
|
|
|
|
target_link_libraries(${EXECUTABLE_NAME} ${ZLIB_LIBRARIES})
|
|
target_include_directories(${EXECUTABLE_NAME} PRIVATE ${ZLIB_INCLUDE_DIRS})
|
|
|
|
target_link_libraries(${EXECUTABLE_NAME} ${SDL2_LIBRARIES})
|
|
target_include_directories(${EXECUTABLE_NAME} PRIVATE ${SDL2_INCLUDE_DIRS})
|
|
|
|
add_executable(fallout2-dat
|
|
"tools/dat_tool.cc"
|
|
"src/dfile.cc"
|
|
"src/platform_compat.cc"
|
|
)
|
|
|
|
if(APPLE)
|
|
set_target_properties(fallout2-dat PROPERTIES
|
|
XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO"
|
|
XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO"
|
|
)
|
|
endif()
|
|
|
|
target_link_libraries(fallout2-dat
|
|
fpattern_windows::fpattern_windows
|
|
${ZLIB_LIBRARIES}
|
|
${SDL2_LIBRARIES}
|
|
)
|
|
target_include_directories(fallout2-dat PRIVATE "src")
|
|
target_include_directories(fallout2-dat PRIVATE ${ZLIB_INCLUDE_DIRS})
|
|
target_include_directories(fallout2-dat PRIVATE ${SDL2_INCLUDE_DIRS})
|
|
|
|
if(APPLE)
|
|
if(IOS)
|
|
install(TARGETS ${EXECUTABLE_NAME} DESTINATION "Payload")
|
|
|
|
set(CPACK_GENERATOR "ZIP")
|
|
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
|
|
set(CPACK_PACKAGE_FILE_NAME "fallout2-ce")
|
|
set(CPACK_ARCHIVE_FILE_EXTENSION "ipa")
|
|
else()
|
|
install(TARGETS ${EXECUTABLE_NAME} DESTINATION .)
|
|
|
|
set(CPACK_GENERATOR "DragNDrop")
|
|
set(CPACK_DMG_DISABLE_APPLICATIONS_SYMLINK ON)
|
|
set(CPACK_PACKAGE_FILE_NAME "Fallout II Community Edition")
|
|
endif()
|
|
|
|
include(CPack)
|
|
endif()
|
|
|
|
# Add option to enable AddressSanitizer
|
|
option(ENABLE_ASAN "Enable AddressSanitizer for debug builds" OFF)
|
|
|
|
# Set C++ standard and other existing settings
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED YES)
|
|
set(CMAKE_CXX_EXTENSIONS NO)
|
|
|
|
# Define ASan flags for supported compilers (GCC, Clang, MSVC)
|
|
if(ENABLE_ASAN)
|
|
if(CMAKE_SYSTEM_NAME MATCHES "Emscripten|Android|iOS")
|
|
message(WARNING "AddressSanitizer is not supported on ${CMAKE_SYSTEM_NAME}. Disabling ASan.")
|
|
set(ENABLE_ASAN OFF)
|
|
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
|
message(STATUS "Enabling AddressSanitizer for debug build (GCC/Clang)")
|
|
set(ASAN_FLAGS "-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls")
|
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
|
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
|
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
|
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
|
# Check if using clang-cl or native MSVC
|
|
if(CMAKE_CXX_COMPILER MATCHES "clang-cl")
|
|
message(STATUS "Enabling AddressSanitizer for debug build (clang-cl)")
|
|
set(ASAN_FLAGS "-fsanitize=address -fno-omit-frame-pointer")
|
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${ASAN_FLAGS}")
|
|
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=address")
|
|
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -fsanitize=address")
|
|
else()
|
|
message(STATUS "Enabling AddressSanitizer for debug build (MSVC)")
|
|
set(ASAN_FLAGS "/fsanitize=address")
|
|
# MSVC requires /Zi or /Z7 for debug info with ASan
|
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${ASAN_FLAGS} /Zi")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${ASAN_FLAGS} /Zi")
|
|
# No additional linker flags needed for MSVC ASan
|
|
# Disable incremental linking as it's incompatible with ASan
|
|
string(REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
|
|
string(REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
|
|
endif()
|
|
else()
|
|
message(WARNING "AddressSanitizer is not supported with ${CMAKE_CXX_COMPILER_ID}. Disabling ASan.")
|
|
set(ENABLE_ASAN OFF)
|
|
endif()
|
|
endif()
|
|
|
|
# Existing debug flags for Emscripten (ensure ASan doesn't conflict)
|
|
if(CMAKE_SYSTEM_NAME MATCHES "Emscripten")
|
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
|
|
endif()
|