Skip to content

Commit 248fd6d

Browse files
binary1248eXpl0it3r
authored andcommitted
Build dependency libraries instead of bundling pre-built binaries.
1 parent ae87def commit 248fd6d

194 files changed

Lines changed: 446 additions & 31275 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.clang-tidy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,6 @@ CheckOptions:
8181
- { key: readability-identifier-naming.PrivateMemberCase, value: camelBack }
8282
- { key: readability-identifier-naming.ProtectedMemberPrefix, value: m_ }
8383
- { key: readability-identifier-naming.PrivateMemberPrefix, value: m_ }
84-
HeaderFilterRegex: '.*'
84+
HeaderFilterRegex: '((.*/(src|include)/SFML/.*)|(.*/(test|examples)/.*))'
8585
WarningsAsErrors: '*'
8686
UseColor: true

.github/workflows/ci.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ jobs:
6161
config: { name: Static with PCH (GCC), flags: -GNinja -DCMAKE_CXX_COMPILER=g++ -DBUILD_SHARED_LIBS=OFF -DSFML_ENABLE_PCH=ON }
6262
- platform: { name: Linux Clang, os: ubuntu-22.04 }
6363
config: { name: Static with PCH (Clang), flags: -GNinja -DCMAKE_CXX_COMPILER=clang++ -DBUILD_SHARED_LIBS=OFF -DSFML_ENABLE_PCH=ON }
64+
- platform: { name: Linux GCC, os: ubuntu-22.04 }
65+
config: { name: Bundled Deps Static, flags: -GNinja -DCMAKE_CXX_COMPILER=g++ -DBUILD_SHARED_LIBS=OFF -DSFML_USE_SYSTEM_DEPS=OFF }
66+
- platform: { name: Linux GCC, os: ubuntu-22.04 }
67+
config: { name: Bundled Deps Shared, flags: -GNinja -DCMAKE_CXX_COMPILER=g++ -DBUILD_SHARED_LIBS=ON -DSFML_USE_SYSTEM_DEPS=OFF }
6468
- platform: { name: Windows MinGW, os: windows-2022 }
6569
config: { name: Static Standard Libraries, flags: -GNinja -DSFML_USE_MESA3D=ON -DCMAKE_CXX_COMPILER=g++ -DSFML_USE_STATIC_STD_LIBS=ON }
6670
- platform: { name: Windows MinGW, os: windows-2022 }
@@ -252,7 +256,7 @@ jobs:
252256
- name: Test Install Interface
253257
if: matrix.platform.name != 'Android'
254258
run: |
255-
cmake -S test/install -B test/install/build -DSFML_ROOT=build/install -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=${{ matrix.type.name == 'Debug' && 'Debug' || 'Release' }} ${{matrix.platform.flags}} ${{matrix.config.flags}} ${{matrix.type.flags}}
259+
cmake -S test/install -B test/install/build -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/build/install -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=${{ matrix.type.name == 'Debug' && 'Debug' || 'Release' }} ${{matrix.platform.flags}} ${{matrix.config.flags}} ${{matrix.type.flags}}
256260
cmake --build test/install/build --config ${{ matrix.type.name == 'Debug' && 'Debug' || 'Release' }}
257261
258262
coverage:
@@ -392,7 +396,7 @@ jobs:
392396
uses: actions/checkout@v4
393397

394398
- name: Configure
395-
run: cmake -B build -DSFML_BUILD_DOC=ON
399+
run: cmake -B build -DSFML_BUILD_DOC=ON -DSFML_BUILD_WINDOW=OFF -DSFML_BUILD_GRAPHICS=OFF -DSFML_BUILD_AUDIO=OFF -DSFML_BUILD_NETWORK=OFF
396400

397401
- name: Build Doxygen Site
398402
run: cmake --build build --target doc

CMakeLists.txt

Lines changed: 22 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -106,37 +106,16 @@ if(SFML_BUILD_GRAPHICS AND NOT SFML_BUILD_WINDOW)
106106
set(SFML_BUILD_WINDOW ON)
107107
endif()
108108

109-
# allow not using bundled dependencies with a switch
110-
# (except for stb_image)
111-
# yes this is horrible, but GLOB_RECURSE sucks
112-
sfml_set_option(SFML_USE_SYSTEM_DEPS OFF BOOL "ON to use system dependencies, OFF to use the bundled ones.")
113-
if(SFML_USE_SYSTEM_DEPS)
114-
if(SFML_INSTALL_XCODE_TEMPLATES)
115-
message(FATAL_ERROR "XCode templates installation cannot be used with the SFML_USE_SYSTEM_DEPS option (the bundled frameworks are required.)")
116-
endif()
117-
118-
file(GLOB_RECURSE DEP_LIBS "${PROJECT_SOURCE_DIR}/extlibs/libs*/*")
119-
file(GLOB_RECURSE DEP_BINS "${PROJECT_SOURCE_DIR}/extlibs/bin*/*")
120-
file(GLOB_RECURSE DEP_HEADERS "${PROJECT_SOURCE_DIR}/extlibs/headers/*")
121-
122-
foreach(DEP_FILE ${DEP_LIBS} ${DEP_BINS} ${DEP_HEADERS})
123-
get_filename_component(DEP_DIR ${DEP_FILE} PATH)
124-
125-
if(NOT DEP_DIR MATCHES "/(stb_image|minimp3)(/|$)")
126-
list(APPEND CMAKE_IGNORE_PATH "${DEP_DIR}")
127-
endif()
128-
129-
get_filename_component(DEP_PARENT_DIR ${DEP_DIR} PATH)
130-
while(NOT DEP_PARENT_DIR STREQUAL "${PROJECT_SOURCE_DIR}/extlibs")
131-
if(NOT DEP_DIR MATCHES "/(stb_image|minimp3)(/|$)")
132-
list(APPEND CMAKE_IGNORE_PATH "${DEP_PARENT_DIR}")
133-
endif()
134-
135-
get_filename_component(DEP_PARENT_DIR ${DEP_PARENT_DIR} PATH)
136-
endwhile()
137-
endforeach()
109+
# use bundled dependencies by default on these systems and system dependencies by default on all others (maintains old behavior)
110+
if(SFML_OS_WINDOWS OR SFML_OS_MACOS OR SFML_OS_IOS OR SFML_OS_ANDROID)
111+
set(SFML_USE_SYSTEM_DEPS_DEFAULT OFF)
112+
else()
113+
set(SFML_USE_SYSTEM_DEPS_DEFAULT ON)
114+
endif()
138115

139-
list(REMOVE_DUPLICATES CMAKE_IGNORE_PATH)
116+
sfml_set_option(SFML_USE_SYSTEM_DEPS ${SFML_USE_SYSTEM_DEPS_DEFAULT} BOOL "ON to use system dependencies, OFF to use the bundled ones.")
117+
if(SFML_USE_SYSTEM_DEPS AND SFML_INSTALL_XCODE_TEMPLATES)
118+
message(FATAL_ERROR "XCode templates installation cannot be used with the SFML_USE_SYSTEM_DEPS option (the bundled frameworks are required.)")
140119
endif()
141120

142121
if(SFML_COMPILER_MSVC)
@@ -380,97 +359,19 @@ endif()
380359
install(FILES license.md DESTINATION ${CMAKE_INSTALL_DOCDIR})
381360
install(FILES readme.md DESTINATION ${CMAKE_INSTALL_DOCDIR})
382361

383-
# install 3rd-party libraries and tools
384-
if(SFML_OS_WINDOWS)
385-
386-
if(NOT SFML_USE_SYSTEM_DEPS)
387-
# install the binaries of SFML dependencies
388-
if(ARCH_ARM64)
389-
install(DIRECTORY extlibs/libs-msvc-universal/ARM64/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
390-
elseif(ARCH_X86)
391-
if(SFML_COMPILER_MSVC OR (SFML_COMPILER_CLANG AND NOT MINGW))
392-
install(DIRECTORY extlibs/libs-msvc-universal/x86/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
393-
else()
394-
install(DIRECTORY extlibs/libs-mingw/x86/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
395-
endif()
396-
elseif(ARCH_X64)
397-
if(SFML_COMPILER_MSVC OR (SFML_COMPILER_CLANG AND NOT MINGW))
398-
install(DIRECTORY extlibs/libs-msvc-universal/x64/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
399-
else()
400-
install(DIRECTORY extlibs/libs-mingw/x64/ DESTINATION ${CMAKE_INSTALL_LIBDIR})
401-
endif()
402-
endif()
403-
endif()
404-
405-
elseif(SFML_OS_MACOS)
406-
# install extlibs dependencies only when used
407-
if(SFML_BUILD_GRAPHICS)
408-
if(FREETYPE_LIBRARY STREQUAL "${PROJECT_SOURCE_DIR}/extlibs/libs-macos/Frameworks/freetype.framework")
409-
install(DIRECTORY extlibs/libs-macos/Frameworks/freetype.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
410-
endif()
411-
endif()
412-
413-
if(SFML_BUILD_AUDIO)
414-
if(FLAC_LIBRARY STREQUAL "${PROJECT_SOURCE_DIR}/extlibs/libs-macos/Frameworks/FLAC.framework")
415-
install(DIRECTORY extlibs/libs-macos/Frameworks/FLAC.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
416-
endif()
417-
418-
if(OGG_LIBRARY STREQUAL "${PROJECT_SOURCE_DIR}/extlibs/libs-macos/Frameworks/ogg.framework")
419-
install(DIRECTORY extlibs/libs-macos/Frameworks/ogg.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
420-
endif()
421-
422-
if(VORBIS_LIBRARY STREQUAL "${PROJECT_SOURCE_DIR}/extlibs/libs-macos/Frameworks/vorbis.framework")
423-
install(DIRECTORY extlibs/libs-macos/Frameworks/vorbis.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
424-
endif()
425-
426-
if(VORBISENC_LIBRARY STREQUAL "${PROJECT_SOURCE_DIR}/extlibs/libs-macos/Frameworks/vorbisenc.framework")
427-
install(DIRECTORY extlibs/libs-macos/Frameworks/vorbisenc.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
428-
endif()
429-
430-
if(VORBISFILE_LIBRARY STREQUAL "${PROJECT_SOURCE_DIR}/extlibs/libs-macos/Frameworks/vorbisfile.framework")
431-
install(DIRECTORY extlibs/libs-macos/Frameworks/vorbisfile.framework DESTINATION ${CMAKE_INSTALL_LIBDIR})
432-
endif()
433-
endif()
434-
435-
# install the Xcode templates if requested
436-
if(SFML_INSTALL_XCODE_TEMPLATES)
437-
# configure the templates plist files
438-
foreach(TEMPLATE "SFML Compiler" "SFML App")
439-
configure_file(
440-
"tools/xcode/templates/SFML/${TEMPLATE}.xctemplate/TemplateInfo.plist.in"
441-
"${CMAKE_CURRENT_BINARY_DIR}/tools/xcode/templates/SFML/${TEMPLATE}.xctemplate/TemplateInfo.plist"
442-
@ONLY)
443-
endforeach()
444-
install(DIRECTORY "tools/xcode/templates/SFML" "${CMAKE_CURRENT_BINARY_DIR}/tools/xcode/templates/SFML"
445-
DESTINATION /Library/Developer/Xcode/Templates
446-
PATTERN "*.in" EXCLUDE
447-
PATTERN ".DS_Store" EXCLUDE)
448-
endif()
449-
450-
elseif(SFML_OS_IOS)
451-
452-
if(NOT SFML_USE_SYSTEM_DEPS)
453-
# since the iOS libraries are built as static, we must install the SFML dependencies
454-
# too so that the end user can easily link them to its final application
455-
if(SFML_BUILD_GRAPHICS)
456-
install(FILES extlibs/libs-ios/libfreetype.a DESTINATION lib)
457-
endif()
458-
459-
if(SFML_BUILD_AUDIO)
460-
install(FILES extlibs/libs-ios/libflac.a
461-
extlibs/libs-ios/libvorbis.a
462-
extlibs/libs-ios/libogg.a
463-
DESTINATION lib)
464-
endif()
465-
endif()
466-
467-
elseif(SFML_OS_ANDROID)
468-
469-
if(NOT SFML_USE_SYSTEM_DEPS)
470-
# install extlibs
471-
install(DIRECTORY extlibs/libs-android/${CMAKE_ANDROID_ARCH_ABI} DESTINATION extlibs/lib)
472-
endif()
473-
362+
# install the Xcode templates if requested
363+
if(SFML_INSTALL_XCODE_TEMPLATES)
364+
# configure the templates plist files
365+
foreach(TEMPLATE "SFML Compiler" "SFML App")
366+
configure_file(
367+
"tools/xcode/templates/SFML/${TEMPLATE}.xctemplate/TemplateInfo.plist.in"
368+
"${CMAKE_CURRENT_BINARY_DIR}/tools/xcode/templates/SFML/${TEMPLATE}.xctemplate/TemplateInfo.plist"
369+
@ONLY)
370+
endforeach()
371+
install(DIRECTORY "tools/xcode/templates/SFML" "${CMAKE_CURRENT_BINARY_DIR}/tools/xcode/templates/SFML"
372+
DESTINATION /Library/Developer/Xcode/Templates
373+
PATTERN "*.in" EXCLUDE
374+
PATTERN ".DS_Store" EXCLUDE)
474375
endif()
475376

476377
sfml_export_targets()

cmake/Config.cmake

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,6 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "^NetBSD$")
4747
set(OPENGL_ES 0)
4848
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "iOS")
4949
set(SFML_OS_IOS 1)
50-
51-
# As we want to find packages in our extlibs folder too
52-
# we need to tell CMake we want to search there instead
53-
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
54-
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
55-
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)
56-
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
5750

5851
# use the OpenGL ES implementation on iOS
5952
set(OPENGL_ES 1)

cmake/Macros.cmake

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ endfunction()
5959
macro(sfml_add_library module)
6060

6161
# parse the arguments
62-
cmake_parse_arguments(THIS "STATIC" "" "SOURCES" ${ARGN})
62+
cmake_parse_arguments(THIS "STATIC" "DEPENDENCIES" "SOURCES" ${ARGN})
6363
if(NOT "${THIS_UNPARSED_ARGUMENTS}" STREQUAL "")
6464
message(FATAL_ERROR "Extra unparsed arguments when calling sfml_add_library: ${THIS_UNPARSED_ARGUMENTS}")
6565
endif()
@@ -218,13 +218,42 @@ macro(sfml_add_library module)
218218
set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE ON)
219219
endif()
220220

221-
# add the install rule
222-
install(TARGETS ${target} EXPORT SFMLConfigExport
221+
if(BUILD_SHARED_LIBS)
222+
set(config_name "Shared")
223+
else()
224+
set(config_name "Static")
225+
endif()
226+
227+
# install the target and create export-set
228+
install(TARGETS ${target} EXPORT SFML${module}${config_name}Targets
223229
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT bin
224230
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT bin
225231
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT devel
226232
FRAMEWORK DESTINATION "." COMPONENT bin)
227233

234+
# because the frameworks directory hierarchy has to be set up before any target files
235+
# are installed we can't call install(EXPORT ...Targets) here
236+
# this is because frameworks are only set up after all modules directories have already been added
237+
# sfml_export_targets() is called after the frameworks are set up so we will have to
238+
# save all modules to a global property and read it out to call install(EXPORT ...Targets)
239+
# for each module in sfml_export_targets(), see below
240+
get_property(SFML_ADD_LIBRARY_MODULES GLOBAL PROPERTY SFML_ADD_LIBRARY_MODULES_PROPERTY)
241+
list(APPEND SFML_ADD_LIBRARY_MODULES ${module})
242+
set_property(GLOBAL PROPERTY SFML_ADD_LIBRARY_MODULES_PROPERTY "${SFML_ADD_LIBRARY_MODULES}")
243+
244+
# when static linking, generate and install dependency configuration
245+
if(NOT BUILD_SHARED_LIBS AND THIS_DEPENDENCIES)
246+
# if we are building static libraries, generate and install dependencies config file
247+
include(CMakePackageConfigHelpers)
248+
249+
configure_package_config_file("${THIS_DEPENDENCIES}" "${CMAKE_CURRENT_BINARY_DIR}/SFML${module}Dependencies.cmake"
250+
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/SFML")
251+
252+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/SFML${module}Dependencies.cmake"
253+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/SFML
254+
COMPONENT devel)
255+
endif()
256+
228257
# add <project>/include as public include directory
229258
target_include_directories(${target}
230259
PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
@@ -379,8 +408,8 @@ function(sfml_add_test target SOURCES DEPENDS)
379408
catch_discover_tests(${target} WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
380409
endfunction()
381410

382-
# Generate a SFMLConfig.cmake file (and associated files) from the targets registered against
383-
# the EXPORT name "SFMLConfigExport" (EXPORT parameter of install(TARGETS))
411+
# Generate a SFMLConfig.cmake file (and associated files) from the targets registered
412+
# in SFML_ADD_LIBRARY_MODULES_PROPERTY (EXPORT parameter of install(TARGETS))
384413
function(sfml_export_targets)
385414
# CMAKE_CURRENT_LIST_DIR or CMAKE_CURRENT_SOURCE_DIR not usable for files that are to be included like this one
386415
set(CURRENT_DIR "${PROJECT_SOURCE_DIR}/cmake")
@@ -390,29 +419,28 @@ function(sfml_export_targets)
390419
VERSION ${PROJECT_VERSION}
391420
COMPATIBILITY SameMajorVersion)
392421

393-
if(BUILD_SHARED_LIBS)
394-
set(config_name "Shared")
395-
else()
396-
set(config_name "Static")
397-
endif()
398-
set(targets_config_filename "SFML${config_name}Targets.cmake")
399-
400422
if(SFML_BUILD_FRAMEWORKS)
401423
set(config_package_location "SFML.framework/Resources/CMake")
402424
else()
403425
set(config_package_location ${CMAKE_INSTALL_LIBDIR}/cmake/SFML)
404426
endif()
405427
configure_package_config_file("${CURRENT_DIR}/SFMLConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/SFMLConfig.cmake"
406428
INSTALL_DESTINATION "${config_package_location}")
407-
configure_package_config_file("${CURRENT_DIR}/SFMLConfigDependencies.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/SFMLConfigDependencies.cmake"
408-
INSTALL_DESTINATION "${config_package_location}")
409429

410-
install(EXPORT SFMLConfigExport
411-
FILE ${targets_config_filename}
412-
DESTINATION ${config_package_location})
430+
# generate and install export files for all modules that were added to the list in sfml_add_library()
431+
if(BUILD_SHARED_LIBS)
432+
set(config_name "Shared")
433+
else()
434+
set(config_name "Static")
435+
endif()
436+
get_property(SFML_ADD_LIBRARY_MODULES GLOBAL PROPERTY SFML_ADD_LIBRARY_MODULES_PROPERTY)
437+
foreach(module ${SFML_ADD_LIBRARY_MODULES})
438+
install(EXPORT SFML${module}${config_name}Targets
439+
FILE SFML${module}${config_name}Targets.cmake
440+
DESTINATION ${config_package_location})
441+
endforeach()
413442

414443
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/SFMLConfig.cmake"
415-
"${CMAKE_CURRENT_BINARY_DIR}/SFMLConfigDependencies.cmake"
416444
"${CMAKE_CURRENT_BINARY_DIR}/SFMLConfigVersion.cmake"
417445
DESTINATION ${config_package_location}
418446
COMPONENT devel)

cmake/Modules/FindFreetype.cmake

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,16 @@ find_package_handle_standard_args(Freetype DEFAULT_MSG FREETYPE_LIBRARY FREETYPE
148148

149149
mark_as_advanced(FREETYPE_LIBRARY FREETYPE_INCLUDE_DIR_freetype2 FREETYPE_INCLUDE_DIR_ft2build)
150150

151-
if(NOT TARGET Freetype::Freetype)
152-
add_library(Freetype::Freetype IMPORTED UNKNOWN)
153-
set_target_properties(Freetype::Freetype PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FREETYPE_INCLUDE_DIRS}")
151+
if(NOT TARGET freetype)
152+
add_library(freetype IMPORTED UNKNOWN)
153+
set_target_properties(freetype PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FREETYPE_INCLUDE_DIRS}")
154154
if(FREETYPE_LIBRARY MATCHES "/([^/]+)\\.framework$")
155-
set_target_properties(Freetype::Freetype PROPERTIES IMPORTED_LOCATION ${FREETYPE_LIBRARY}/${CMAKE_MATCH_1})
155+
set_target_properties(freetype PROPERTIES IMPORTED_LOCATION ${FREETYPE_LIBRARY}/${CMAKE_MATCH_1})
156156
else()
157-
set_target_properties(Freetype::Freetype PROPERTIES IMPORTED_LOCATION ${FREETYPE_LIBRARY})
157+
set_target_properties(freetype PROPERTIES IMPORTED_LOCATION ${FREETYPE_LIBRARY})
158158
endif()
159159
endif()
160+
161+
if(NOT TARGET Freetype::Freetype)
162+
add_library(Freetype::Freetype ALIAS freetype)
163+
endif()

0 commit comments

Comments
 (0)