Skip to content

Commit 8b05921

Browse files
committed
Add API header compile tests for C
This will enable any future changes to the header to be tested. These additional build checks are only executed if BUILD_TESTING is enabled (e.g. in our automated build checks) to speed up release builds.
1 parent 3a79ff4 commit 8b05921

File tree

4 files changed

+114
-0
lines changed

4 files changed

+114
-0
lines changed

Diff for: cmake/TestAPIHeaders.cmake

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
cmake_minimum_required(VERSION 3.21 FATAL_ERROR)
2+
3+
# Compile-test C API headers
4+
macro(TEST_API_HEADERS _target _include_dirs _includes)
5+
set(HEADER_TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_target}.done)
6+
7+
add_custom_command(OUTPUT ${HEADER_TEST_OUTPUT}
8+
# Create test project directory
9+
COMMAND ${CMAKE_COMMAND}
10+
ARGS
11+
-E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${_target}
12+
13+
# Copy project CMake file into it
14+
COMMAND ${CMAKE_COMMAND}
15+
ARGS
16+
-E copy_if_different ${CMAKE_SOURCE_DIR}/cmake/TestAPIHeadersProject.cmake ${CMAKE_CURRENT_BINARY_DIR}/${_target}/CMakeLists.txt
17+
18+
# Delete any existing build dir to re-run all checks
19+
COMMAND ${CMAKE_COMMAND}
20+
ARGS
21+
-E rm -Rf ${CMAKE_CURRENT_BINARY_DIR}/${_target}/build
22+
23+
# Configure the test project
24+
COMMAND ${CMAKE_COMMAND}
25+
ARGS
26+
-S ${CMAKE_CURRENT_BINARY_DIR}/${_target}
27+
-B ${CMAKE_CURRENT_BINARY_DIR}/${_target}/build
28+
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
29+
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
30+
-DCMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}
31+
-DCMAKE_VERBOSE_MAKEFILE=ON
32+
"-DINCLUDE_FILES=${_includes}"
33+
"-DINCLUDE_DIRS=${_include_dirs}"
34+
-DOUTPUT_FILE=${HEADER_TEST_OUTPUT}
35+
36+
DEPENDS
37+
${CMAKE_SOURCE_DIR}/cmake/TestAPIHeaders.cmake
38+
${CMAKE_SOURCE_DIR}/cmake/TestAPIHeadersProject.cmake
39+
${_includes}
40+
41+
VERBATIM
42+
COMMENT "Testing C API headers: ${_target}"
43+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_target}
44+
)
45+
46+
add_custom_target(${_target} ALL
47+
DEPENDS ${HEADER_TEST_OUTPUT}
48+
)
49+
50+
endmacro()

Diff for: cmake/TestAPIHeadersProject.cmake

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
cmake_minimum_required(VERSION 3.21 FATAL_ERROR)
2+
3+
project(TestAPIHeaders
4+
LANGUAGES C
5+
)
6+
7+
include(CheckIncludeFile)
8+
9+
set(CMAKE_REQUIRED_INCLUDES "${INCLUDE_DIRS}")
10+
11+
foreach(INCLUDE_HEADER ${INCLUDE_FILES})
12+
cmake_path(GET INCLUDE_HEADER FILENAME INCLUDE_FILENAME)
13+
string(REPLACE "." "_" INCLUDE_FILENAME "${INCLUDE_FILENAME}")
14+
check_include_file(${INCLUDE_HEADER} PROJECTM_${INCLUDE_FILENAME}_INCLUDE_OK)
15+
if(NOT PROJECTM_${INCLUDE_FILENAME}_INCLUDE_OK)
16+
message(FATAL_ERROR "projectM API include file ${INCLUDE_HEADER} does not compile on its own!\nSee logs in ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ for additional information.")
17+
endif()
18+
endforeach()
19+
20+
file(TOUCH ${OUTPUT_FILE})

Diff for: tests/libprojectM/CMakeLists.txt

+23
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,28 @@
11
find_package(GTest 1.10 REQUIRED NO_MODULE)
22

3+
# Compile-test C API headers
4+
set(INCLUDE_FILES
5+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/audio.h
6+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/callbacks.h
7+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/core.h
8+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/debug.h
9+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/memory.h
10+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/parameters.h
11+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/projectM.h
12+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/render_opengl.h
13+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/touch.h
14+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/types.h
15+
${CMAKE_SOURCE_DIR}/src/api/include/projectM-4/user_sprites.h
16+
)
17+
18+
get_target_property(API_HEADER_INCLUDE_DIRS libprojectM::API INTERFACE_INCLUDE_DIRECTORIES)
19+
20+
include(TestAPIHeaders)
21+
test_api_headers(TestMainAPIHeaders
22+
"${API_HEADER_INCLUDE_DIRS}"
23+
"${INCLUDE_FILES}"
24+
)
25+
326
add_executable(projectM-unittest
427
WaveformAlignerTest.cpp
528
PresetFileParserTest.cpp

Diff for: tests/playlist/CMakeLists.txt

+21
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,27 @@ endif()
44

55
find_package(GTest 1.10 REQUIRED NO_MODULE)
66

7+
# Compile-test C API headers
8+
set(INCLUDE_FILES
9+
${CMAKE_SOURCE_DIR}/src/playlist/api/projectM-4/playlist.h
10+
${CMAKE_SOURCE_DIR}/src/playlist/api/projectM-4/playlist_callbacks.h
11+
${CMAKE_SOURCE_DIR}/src/playlist/api/projectM-4/playlist_core.h
12+
${CMAKE_SOURCE_DIR}/src/playlist/api/projectM-4/playlist_filter.h
13+
${CMAKE_SOURCE_DIR}/src/playlist/api/projectM-4/playlist_items.h
14+
${CMAKE_SOURCE_DIR}/src/playlist/api/projectM-4/playlist_memory.h
15+
${CMAKE_SOURCE_DIR}/src/playlist/api/projectM-4/playlist_playback.h
16+
${CMAKE_SOURCE_DIR}/src/playlist/api/projectM-4/playlist_types.h
17+
)
18+
19+
get_target_property(API_HEADER_INCLUDE_DIRS_MAIN libprojectM::API INTERFACE_INCLUDE_DIRECTORIES)
20+
get_target_property(API_HEADER_INCLUDE_DIRS_PLAYLIST projectM_playlist_main INTERFACE_INCLUDE_DIRECTORIES)
21+
22+
include(TestAPIHeaders)
23+
test_api_headers(TestPlaylistAPIHeaders
24+
"${API_HEADER_INCLUDE_DIRS_MAIN};${API_HEADER_INCLUDE_DIRS_PLAYLIST}"
25+
"${INCLUDE_FILES}"
26+
)
27+
728
add_executable(projectM-playlist-unittest
829
$<TARGET_OBJECTS:projectM_playlist_main>
930
APITest.cpp

0 commit comments

Comments
 (0)