Skip to content

Commit 41a41b4

Browse files
committed
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.
1 parent f1cac06 commit 41a41b4

File tree

10 files changed

+35
-17
lines changed

10 files changed

+35
-17
lines changed

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ endif()
9090

9191
# Modules
9292

93+
include(FeatureSummary)
94+
include(SetCStandard)
9395
include(CheckLibraryExists)
9496
include(CheckFunctionExists)
9597
include(CheckSymbolExists)
@@ -102,7 +104,6 @@ include(FindStatNsec)
102104
include(Findfutimens)
103105
include(GNUInstallDirs)
104106
include(IdeSplitSources)
105-
include(FeatureSummary)
106107
include(EnableWarnings)
107108
include(DefaultCFlags)
108109
include(ExperimentalFeatures)

cmake/SetCStandard.cmake

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
if("${C_STANDARD}" STREQUAL "")
2+
set(C_STANDARD "90")
3+
endif()
4+
if("${C_EXTENSIONS}" STREQUAL "")
5+
set(C_EXTENSIONS OFF)
6+
endif()
7+
8+
if(${C_STANDARD} MATCHES "^[Cc].*")
9+
string(REGEX REPLACE "^[Cc]" "" C_STANDARD ${C_STANDARD})
10+
endif()
11+
12+
if(${C_STANDARD} MATCHES ".*-strict$")
13+
string(REGEX REPLACE "-strict$" "" C_STANDARD ${C_STANDARD})
14+
set(C_EXTENSIONS OFF)
15+
16+
add_feature_info("C Standard" ON "C${C_STANDARD} (strict)")
17+
else()
18+
add_feature_info("C Standard" ON "C${C_STANDARD}")
19+
endif()
20+
21+
function(set_c_standard project)
22+
set_target_properties(${project} PROPERTIES C_STANDARD ${C_STANDARD})
23+
set_target_properties(${project} PROPERTIES C_EXTENSIONS ${C_EXTENSIONS})
24+
endfunction()

examples/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
file(GLOB SRC_EXAMPLES *.c *.h)
44

55
add_executable(lg2 ${SRC_EXAMPLES})
6-
set_target_properties(lg2 PROPERTIES C_STANDARD 90)
7-
set_target_properties(lg2 PROPERTIES C_EXTENSIONS OFF)
6+
set_c_standard(lg2)
87

98
# Ensure that we do not use deprecated functions internally
109
add_definitions(-DGIT_DEPRECATE_HARD)

fuzzers/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ foreach(fuzz_target_src ${SRC_FUZZERS})
2020
endif()
2121

2222
add_executable(${fuzz_target_name} ${${fuzz_target_name}_SOURCES})
23-
set_target_properties(${fuzz_target_name} PROPERTIES C_STANDARD 90)
24-
set_target_properties(${fuzz_target_name} PROPERTIES C_EXTENSIONS OFF)
23+
set_c_standard(${fuzz_target_name})
2524
target_include_directories(${fuzz_target_name} PRIVATE ${LIBGIT2_INCLUDES} ${LIBGIT2_DEPENDENCY_INCLUDES})
2625
target_include_directories(${fuzz_target_name} SYSTEM PRIVATE ${LIBGIT2_SYSTEM_INCLUDES})
2726

src/cli/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ add_executable(git2_cli ${CLI_SRC_C} ${CLI_SRC_OS} ${CLI_OBJECTS}
4040
${LIBGIT2_DEPENDENCY_OBJECTS})
4141
target_link_libraries(git2_cli ${CLI_LIBGIT2_LIBRARY} ${LIBGIT2_SYSTEM_LIBS})
4242

43-
set_target_properties(git2_cli PROPERTIES C_STANDARD 90)
44-
set_target_properties(git2_cli PROPERTIES C_EXTENSIONS OFF)
43+
set_c_standard(git2_cli)
4544
set_target_properties(git2_cli PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${libgit2_BINARY_DIR})
4645
set_target_properties(git2_cli PROPERTIES OUTPUT_NAME ${LIBGIT2_FILENAME})
4746

src/libgit2/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
# git library functionality.
33

44
add_library(libgit2 OBJECT)
5-
set_target_properties(libgit2 PROPERTIES C_STANDARD 90)
6-
set_target_properties(libgit2 PROPERTIES C_EXTENSIONS OFF)
5+
set_c_standard(libgit2)
76

87
include(PkgBuildConfig)
98

src/util/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
# util: a shared library for common utility functions for libgit2 projects
22

33
add_library(util OBJECT)
4-
set_target_properties(util PROPERTIES C_STANDARD 90)
5-
set_target_properties(util PROPERTIES C_EXTENSIONS OFF)
4+
set_c_standard(util)
65

76
configure_file(git2_features.h.in git2_features.h)
87

tests/headertest/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
# even when they have aggressive C90 warnings enabled.
44

55
add_executable(headertest headertest.c)
6-
set_target_properties(headertest PROPERTIES C_STANDARD 90)
7-
set_target_properties(headertest PROPERTIES C_EXTENSIONS OFF)
6+
set_c_standard(headertest)
7+
88
target_include_directories(headertest PRIVATE ${LIBGIT2_INCLUDES})
99

1010
if (MSVC)

tests/libgit2/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ set_source_files_properties(
3939
PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clar.suite)
4040

4141
add_executable(libgit2_tests ${SRC_CLAR} ${SRC_TEST} ${LIBGIT2_OBJECTS})
42+
set_c_standard(libgit2_tests)
4243

43-
set_target_properties(libgit2_tests PROPERTIES C_STANDARD 90)
44-
set_target_properties(libgit2_tests PROPERTIES C_EXTENSIONS OFF)
4544
set_target_properties(libgit2_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
4645
target_include_directories(libgit2_tests PRIVATE ${TEST_INCLUDES} ${LIBGIT2_INCLUDES} ${LIBGIT2_DEPENDENCY_INCLUDES})
4746
target_include_directories(libgit2_tests SYSTEM PRIVATE ${LIBGIT2_SYSTEM_INCLUDES})

tests/util/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,8 @@ set_source_files_properties(
3838
PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clar.suite)
3939

4040
add_executable(util_tests ${SRC_CLAR} ${SRC_TEST} ${LIBGIT2_OBJECTS})
41+
set_c_standard(util_tests)
4142

42-
set_target_properties(util_tests PROPERTIES C_STANDARD 90)
43-
set_target_properties(util_tests PROPERTIES C_EXTENSIONS OFF)
4443
set_target_properties(util_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${libgit2_BINARY_DIR})
4544

4645
target_include_directories(util_tests PRIVATE ${TEST_INCLUDES} ${LIBGIT2_INCLUDES} ${LIBGIT2_DEPENDENCY_INCLUDES})

0 commit comments

Comments
 (0)