Skip to content

Commit dc2c19c

Browse files
committed
Add CMake Find modules for OpenAL and GLFW3 with FetchContent fallback
Create FindOpenAL.cmake and Findglfw3.cmake modules that support multiple detection methods: CONFIG mode first, then standard find_path/find_library, and finally FetchContent as fallback. Both modules create standardized imported targets (OpenAL::OpenAL and glfw) and set appropriate include directories and library variables.
1 parent 10452fe commit dc2c19c

2 files changed

Lines changed: 174 additions & 0 deletions

File tree

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# FindOpenAL.cmake
2+
#
3+
# Finds the OpenAL library
4+
#
5+
# This will define the following variables:
6+
#
7+
# OpenAL_FOUND
8+
# OPENAL_INCLUDE_DIR
9+
# OPENAL_LIBRARY
10+
#
11+
# and the following imported targets:
12+
#
13+
# OpenAL::OpenAL
14+
#
15+
16+
# Try to find OpenAL using CONFIG mode first
17+
find_package(OpenAL CONFIG QUIET)
18+
19+
if (OpenAL_FOUND)
20+
if (NOT TARGET OpenAL::OpenAL)
21+
if (TARGET OpenAL)
22+
add_library(OpenAL::OpenAL ALIAS OpenAL)
23+
endif ()
24+
endif ()
25+
26+
# Set variables for find_package_handle_standard_args
27+
if (NOT OPENAL_INCLUDE_DIR)
28+
get_target_property(OPENAL_INCLUDE_DIR OpenAL::OpenAL INTERFACE_INCLUDE_DIRECTORIES)
29+
endif ()
30+
if (NOT OPENAL_LIBRARY)
31+
set(OPENAL_LIBRARY OpenAL)
32+
endif ()
33+
endif ()
34+
35+
if (NOT OpenAL_FOUND)
36+
# Try to find using standard find_path/find_library
37+
find_path(OPENAL_INCLUDE_DIR NAMES AL/al.h OpenAL/al.h)
38+
find_library(OPENAL_LIBRARY NAMES OpenAL al openal OpenAL32)
39+
40+
if (OPENAL_INCLUDE_DIR AND OPENAL_LIBRARY)
41+
set(OpenAL_FOUND TRUE)
42+
if (NOT TARGET OpenAL::OpenAL)
43+
add_library(OpenAL::OpenAL UNKNOWN IMPORTED)
44+
set_target_properties(OpenAL::OpenAL PROPERTIES
45+
IMPORTED_LOCATION "${OPENAL_LIBRARY}"
46+
INTERFACE_INCLUDE_DIRECTORIES "${OPENAL_INCLUDE_DIR}"
47+
)
48+
endif ()
49+
endif ()
50+
endif ()
51+
52+
if (NOT OpenAL_FOUND)
53+
# If not found, use FetchContent to download and build openal-soft
54+
include(FetchContent)
55+
56+
message(STATUS "OpenAL not found, fetching openal-soft from GitHub...")
57+
58+
FetchContent_Declare(
59+
openal-soft
60+
GIT_REPOSITORY https://github.com/kcat/openal-soft.git
61+
GIT_TAG 1.23.1
62+
)
63+
64+
# Set options to minimize OpenAL build
65+
set(ALSOFT_EXAMPLES OFF CACHE BOOL "" FORCE)
66+
set(ALSOFT_TESTS OFF CACHE BOOL "" FORCE)
67+
set(ALSOFT_UTILS OFF CACHE BOOL "" FORCE)
68+
set(ALSOFT_NO_CONFIG_UTIL ON CACHE BOOL "" FORCE)
69+
set(ALSOFT_INSTALL OFF CACHE BOOL "" FORCE)
70+
71+
FetchContent_MakeAvailable(openal-soft)
72+
73+
# openal-soft defines a target named 'OpenAL'
74+
if (TARGET OpenAL)
75+
set(OpenAL_FOUND TRUE)
76+
if (NOT TARGET OpenAL::OpenAL)
77+
add_library(OpenAL::OpenAL ALIAS OpenAL)
78+
endif ()
79+
# Satisfy find_package_handle_standard_args
80+
FetchContent_GetProperties(openal-soft SOURCE_DIR openal_SOURCE_DIR)
81+
set(OPENAL_INCLUDE_DIR "${openal_SOURCE_DIR}/include")
82+
set(OPENAL_LIBRARY OpenAL)
83+
endif ()
84+
endif ()
85+
86+
include(FindPackageHandleStandardArgs)
87+
find_package_handle_standard_args(OpenAL
88+
REQUIRED_VARS OPENAL_INCLUDE_DIR OPENAL_LIBRARY
89+
)
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Findglfw3.cmake
2+
#
3+
# Finds the GLFW3 library
4+
#
5+
# This will define the following variables:
6+
#
7+
# glfw3_FOUND
8+
# GLFW3_INCLUDE_DIR
9+
# GLFW3_LIBRARY
10+
#
11+
# and the following imported targets:
12+
#
13+
# glfw
14+
#
15+
16+
# Try to find GLFW3 using CONFIG mode first (common for vcpkg)
17+
find_package(glfw3 CONFIG QUIET)
18+
19+
if (glfw3_FOUND)
20+
if (NOT TARGET glfw)
21+
if (TARGET glfw3::glfw)
22+
add_library(glfw ALIAS glfw3::glfw)
23+
endif ()
24+
endif ()
25+
26+
# Set variables for find_package_handle_standard_args
27+
if (NOT GLFW3_INCLUDE_DIR)
28+
get_target_property(GLFW3_INCLUDE_DIR glfw INTERFACE_INCLUDE_DIRECTORIES)
29+
endif ()
30+
if (NOT GLFW3_LIBRARY)
31+
set(GLFW3_LIBRARY glfw)
32+
endif ()
33+
endif ()
34+
35+
if (NOT glfw3_FOUND)
36+
# Try to find using standard find_path/find_library
37+
find_path(GLFW3_INCLUDE_DIR NAMES GLFW/glfw3.h)
38+
find_library(GLFW3_LIBRARY NAMES glfw glfw3)
39+
40+
if (GLFW3_INCLUDE_DIR AND GLFW3_LIBRARY)
41+
set(glfw3_FOUND TRUE)
42+
if (NOT TARGET glfw)
43+
add_library(glfw UNKNOWN IMPORTED)
44+
set_target_properties(glfw PROPERTIES
45+
IMPORTED_LOCATION "${GLFW3_LIBRARY}"
46+
INTERFACE_INCLUDE_DIRECTORIES "${GLFW3_INCLUDE_DIR}"
47+
)
48+
endif ()
49+
endif ()
50+
endif ()
51+
52+
if (NOT glfw3_FOUND)
53+
# If not found, use FetchContent to download and build
54+
include(FetchContent)
55+
56+
message(STATUS "glfw3 not found, fetching from GitHub...")
57+
58+
FetchContent_Declare(
59+
glfw
60+
GIT_REPOSITORY https://github.com/glfw/glfw.git
61+
GIT_TAG 3.4
62+
)
63+
64+
# Set options to minimize GLFW build
65+
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
66+
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
67+
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
68+
set(GLFW_INSTALL OFF CACHE BOOL "" FORCE)
69+
70+
FetchContent_MakeAvailable(glfw)
71+
72+
# GLFW's CMakeLists.txt defines a target named 'glfw'
73+
if (TARGET glfw)
74+
set(glfw3_FOUND TRUE)
75+
# Satisfy find_package_handle_standard_args
76+
FetchContent_GetProperties(glfw SOURCE_DIR glfw_SOURCE_DIR)
77+
set(GLFW3_INCLUDE_DIR "${glfw_SOURCE_DIR}/include")
78+
set(GLFW3_LIBRARY glfw)
79+
endif ()
80+
endif ()
81+
82+
include(FindPackageHandleStandardArgs)
83+
find_package_handle_standard_args(glfw3
84+
REQUIRED_VARS GLFW3_INCLUDE_DIR GLFW3_LIBRARY
85+
)

0 commit comments

Comments
 (0)