cmake: make C_STANDARD and C_EXTENSIONS configurable

Users can now set up cmake with -DC_STANDARD=... or -DC_EXTENSIONS=...
We default to C90 with C_EXTENSIONS=OFF, but callers can override if
they desire.
This commit is contained in:
Edward Thomson
2024-10-18 16:18:17 +01:00
parent f1cac063ba
commit 41a41b4f4a
10 changed files with 35 additions and 17 deletions

View File

@@ -90,6 +90,8 @@ endif()
# Modules
include(FeatureSummary)
include(SetCStandard)
include(CheckLibraryExists)
include(CheckFunctionExists)
include(CheckSymbolExists)
@@ -102,7 +104,6 @@ include(FindStatNsec)
include(Findfutimens)
include(GNUInstallDirs)
include(IdeSplitSources)
include(FeatureSummary)
include(EnableWarnings)
include(DefaultCFlags)
include(ExperimentalFeatures)

24
cmake/SetCStandard.cmake Normal file
View File

@@ -0,0 +1,24 @@
if("${C_STANDARD}" STREQUAL "")
set(C_STANDARD "90")
endif()
if("${C_EXTENSIONS}" STREQUAL "")
set(C_EXTENSIONS OFF)
endif()
if(${C_STANDARD} MATCHES "^[Cc].*")
string(REGEX REPLACE "^[Cc]" "" C_STANDARD ${C_STANDARD})
endif()
if(${C_STANDARD} MATCHES ".*-strict$")
string(REGEX REPLACE "-strict$" "" C_STANDARD ${C_STANDARD})
set(C_EXTENSIONS OFF)
add_feature_info("C Standard" ON "C${C_STANDARD} (strict)")
else()
add_feature_info("C Standard" ON "C${C_STANDARD}")
endif()
function(set_c_standard project)
set_target_properties(${project} PROPERTIES C_STANDARD ${C_STANDARD})
set_target_properties(${project} PROPERTIES C_EXTENSIONS ${C_EXTENSIONS})
endfunction()

View File

@@ -3,8 +3,7 @@
file(GLOB SRC_EXAMPLES *.c *.h)
add_executable(lg2 ${SRC_EXAMPLES})
set_target_properties(lg2 PROPERTIES C_STANDARD 90)
set_target_properties(lg2 PROPERTIES C_EXTENSIONS OFF)
set_c_standard(lg2)
# Ensure that we do not use deprecated functions internally
add_definitions(-DGIT_DEPRECATE_HARD)

View File

@@ -20,8 +20,7 @@ foreach(fuzz_target_src ${SRC_FUZZERS})
endif()
add_executable(${fuzz_target_name} ${${fuzz_target_name}_SOURCES})
set_target_properties(${fuzz_target_name} PROPERTIES C_STANDARD 90)
set_target_properties(${fuzz_target_name} PROPERTIES C_EXTENSIONS OFF)
set_c_standard(${fuzz_target_name})
target_include_directories(${fuzz_target_name} PRIVATE ${LIBGIT2_INCLUDES} ${LIBGIT2_DEPENDENCY_INCLUDES})
target_include_directories(${fuzz_target_name} SYSTEM PRIVATE ${LIBGIT2_SYSTEM_INCLUDES})

View File

@@ -40,8 +40,7 @@ add_executable(git2_cli ${CLI_SRC_C} ${CLI_SRC_OS} ${CLI_OBJECTS}
${LIBGIT2_DEPENDENCY_OBJECTS})
target_link_libraries(git2_cli ${CLI_LIBGIT2_LIBRARY} ${LIBGIT2_SYSTEM_LIBS})
set_target_properties(git2_cli PROPERTIES C_STANDARD 90)
set_target_properties(git2_cli PROPERTIES C_EXTENSIONS OFF)
set_c_standard(git2_cli)
set_target_properties(git2_cli PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${libgit2_BINARY_DIR})
set_target_properties(git2_cli PROPERTIES OUTPUT_NAME ${LIBGIT2_FILENAME})

View File

@@ -2,8 +2,7 @@
# git library functionality.
add_library(libgit2 OBJECT)
set_target_properties(libgit2 PROPERTIES C_STANDARD 90)
set_target_properties(libgit2 PROPERTIES C_EXTENSIONS OFF)
set_c_standard(libgit2)
include(PkgBuildConfig)

View File

@@ -1,8 +1,7 @@
# util: a shared library for common utility functions for libgit2 projects
add_library(util OBJECT)
set_target_properties(util PROPERTIES C_STANDARD 90)
set_target_properties(util PROPERTIES C_EXTENSIONS OFF)
set_c_standard(util)
configure_file(git2_features.h.in git2_features.h)

View File

@@ -3,8 +3,8 @@
# even when they have aggressive C90 warnings enabled.
add_executable(headertest headertest.c)
set_target_properties(headertest PROPERTIES C_STANDARD 90)
set_target_properties(headertest PROPERTIES C_EXTENSIONS OFF)
set_c_standard(headertest)
target_include_directories(headertest PRIVATE ${LIBGIT2_INCLUDES})
if (MSVC)

View File

@@ -39,9 +39,8 @@ set_source_files_properties(
PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clar.suite)
add_executable(libgit2_tests ${SRC_CLAR} ${SRC_TEST} ${LIBGIT2_OBJECTS})
set_c_standard(libgit2_tests)
set_target_properties(libgit2_tests PROPERTIES C_STANDARD 90)
set_target_properties(libgit2_tests PROPERTIES C_EXTENSIONS OFF)
set_target_properties(libgit2_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
target_include_directories(libgit2_tests PRIVATE ${TEST_INCLUDES} ${LIBGIT2_INCLUDES} ${LIBGIT2_DEPENDENCY_INCLUDES})
target_include_directories(libgit2_tests SYSTEM PRIVATE ${LIBGIT2_SYSTEM_INCLUDES})

View File

@@ -38,9 +38,8 @@ set_source_files_properties(
PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clar.suite)
add_executable(util_tests ${SRC_CLAR} ${SRC_TEST} ${LIBGIT2_OBJECTS})
set_c_standard(util_tests)
set_target_properties(util_tests PROPERTIES C_STANDARD 90)
set_target_properties(util_tests PROPERTIES C_EXTENSIONS OFF)
set_target_properties(util_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${libgit2_BINARY_DIR})
target_include_directories(util_tests PRIVATE ${TEST_INCLUDES} ${LIBGIT2_INCLUDES} ${LIBGIT2_DEPENDENCY_INCLUDES})