From d97e17b180257f3425574eb3ba4189d312eb590a Mon Sep 17 00:00:00 2001 From: kasull Date: Tue, 24 Feb 2026 06:45:56 -0500 Subject: enforce static Windows linkage and remove runtime DLL copy step --- CMakeLists.txt | 113 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 83 insertions(+), 30 deletions(-) (limited to 'CMakeLists.txt') diff --git a/CMakeLists.txt b/CMakeLists.txt index f3638cb..561d10c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,49 +20,95 @@ pkg_check_modules(FREETYPE REQUIRED freetype2) pkg_check_modules(GLEW REQUIRED glew) find_package(OpenGL REQUIRED) + # release build settings set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wno-nontrivial-memcall") # debug build settings -set(CMAKE_CXX_FLAGS_DEBUG "-g -DDEBUG=1 -fsanitize=address -Wno-nontrivial-memcall") - -target_include_directories(app PRIVATE - ${SDL2_INCLUDE_DIRS} - ${FREETYPE_INCLUDE_DIRS} - ${GLEW_INCLUDE_DIRS} - ${OPENGL_INCLUDE_DIR} -) +if(WIN32) + set(CMAKE_CXX_FLAGS_DEBUG "-g -DDEBUG=1 -Wno-nontrivial-memcall") +else() + set(CMAKE_CXX_FLAGS_DEBUG "-g -DDEBUG=1 -fsanitize=address -Wno-nontrivial-memcall") +endif() # Platform-specific linking if(WIN32) + function(resolve_static_archives OUT_VAR LIB_DIRS_VAR LIBS_VAR) + set(_resolved "") + foreach(_lib IN LISTS ${LIBS_VAR}) + if(IS_ABSOLUTE "${_lib}") + set(_archive_path "${_lib}") + else() + if(_lib MATCHES "^-") + message(FATAL_ERROR "Unexpected link flag in static library list: ${_lib}") + endif() + + find_file( + _archive_path + NAMES "lib${_lib}.a" "${_lib}.a" + PATHS ${${LIB_DIRS_VAR}} + NO_DEFAULT_PATH + ) + if(NOT _archive_path) + message(FATAL_ERROR "Could not find static archive for '${_lib}' in: ${${LIB_DIRS_VAR}}") + endif() + endif() + + string(TOLOWER "${_archive_path}" _archive_path_lower) + if(NOT _archive_path_lower MATCHES "\\.a$" OR _archive_path_lower MATCHES "\\.dll\\.a$") + message(FATAL_ERROR "Expected static archive (.a), got: ${_archive_path}") + endif() + + list(APPEND _resolved "${_archive_path}") + unset(_archive_path CACHE) + endforeach() + + set(${OUT_VAR} "${_resolved}" PARENT_SCOPE) + endfunction() + + set(SDL2_INCLUDE_DIRS ${SDL2_STATIC_INCLUDE_DIRS}) + set(FREETYPE_INCLUDE_DIRS ${FREETYPE_STATIC_INCLUDE_DIRS}) + set(GLEW_INCLUDE_DIRS ${GLEW_STATIC_INCLUDE_DIRS}) + + resolve_static_archives( + SDL2_LIBRARIES + SDL2_STATIC_LIBRARY_DIRS + SDL2_STATIC_LIBRARIES + ) + resolve_static_archives( + FREETYPE_LIBRARIES + FREETYPE_STATIC_LIBRARY_DIRS + FREETYPE_STATIC_LIBRARIES + ) + resolve_static_archives( + GLEW_LIBRARIES + GLEW_STATIC_LIBRARY_DIRS + GLEW_STATIC_LIBRARIES + ) + set(CXX_STDLIB_LIBRARY_DIRS + ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES} + ${SDL2_STATIC_LIBRARY_DIRS} + ) + set(CXX_STDLIB_LIBRARY_NAMES c++ c++abi unwind) + resolve_static_archives( + CXX_STDLIB_LIBRARIES + CXX_STDLIB_LIBRARY_DIRS + CXX_STDLIB_LIBRARY_NAMES + ) + foreach(APP_LINK_OPTION IN LISTS SDL2_STATIC_LDFLAGS_OTHER FREETYPE_STATIC_LDFLAGS_OTHER GLEW_STATIC_LDFLAGS_OTHER) + if(NOT APP_LINK_OPTION STREQUAL "") + set_property(TARGET app APPEND_STRING PROPERTY LINK_FLAGS " ${APP_LINK_OPTION}") + endif() + endforeach() + + target_compile_definitions(app PRIVATE GLEW_STATIC) target_link_libraries(app PRIVATE ${SDL2_LIBRARIES} ${FREETYPE_LIBRARIES} ${GLEW_LIBRARIES} + ${CXX_STDLIB_LIBRARIES} ${OPENGL_LIBRARIES} winmm # For timeGetDevCaps, timeBeginPeriod, timeEndPeriod ) - - set(TOOLCHAIN_BIN_DIR "") - if(CMAKE_CXX_COMPILER) - get_filename_component(TOOLCHAIN_BIN_DIR "${CMAKE_CXX_COMPILER}" DIRECTORY) - endif() - if(NOT TOOLCHAIN_BIN_DIR OR TOOLCHAIN_BIN_DIR STREQUAL ".") - find_program(CLANGXX_PATH NAMES clang++ clang++.exe) - if(CLANGXX_PATH) - get_filename_component(TOOLCHAIN_BIN_DIR "${CLANGXX_PATH}" DIRECTORY) - endif() - endif() - - add_custom_command( - TARGET app - POST_BUILD - COMMAND "${CMAKE_COMMAND}" - -DAPP_EXE=$ - -DAPP_OUT_DIR=$ - -DTOOLCHAIN_BIN_DIR=${TOOLCHAIN_BIN_DIR} - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/copy_runtime_deps.cmake - VERBATIM - ) else() target_link_libraries(app PRIVATE ${SDL2_LIBRARIES} @@ -72,6 +118,13 @@ else() ) endif() +target_include_directories(app PRIVATE + ${SDL2_INCLUDE_DIRS} + ${FREETYPE_INCLUDE_DIRS} + ${GLEW_INCLUDE_DIRS} + ${OPENGL_INCLUDE_DIR} +) + target_compile_options(app PRIVATE -Wall) target_compile_options(app PRIVATE -Wno-nontrivial-memcall) -- cgit v1.2.3