summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorkasull <qsullian@gmail.com>2026-02-24 06:45:56 -0500
committerkasull <qsullian@gmail.com>2026-02-24 06:45:56 -0500
commitd97e17b180257f3425574eb3ba4189d312eb590a (patch)
tree97c8ea7b10158d8558e50d7150989082600c3493 /CMakeLists.txt
parent3af651e5b65f51d9296c7a1a8ffc8adae6299f28 (diff)
enforce static Windows linkage and remove runtime DLL copy step
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt113
1 files changed, 83 insertions, 30 deletions
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=$<TARGET_FILE:app>
- -DAPP_OUT_DIR=$<TARGET_FILE_DIR:app>
- -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)