Skip to content

Commit dd00aab

Browse files
Respect caller CMake settings while retaining the C++11 minimum (#465)
* Use cache variables to customize Use cache variables in CMakeLists.txt to customize build settings. * Respect caller CMake settings and preserve the C++11 minimum --------- Co-authored-by: Benjamin Sergeant <benjamin.sergeant@applovin.com>
1 parent a532353 commit dd00aab

5 files changed

Lines changed: 62 additions & 8 deletions

File tree

‎CMakeLists.txt‎

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,26 @@
66
cmake_minimum_required(VERSION 3.4.1...3.17.2)
77
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}")
88

9+
# Set the default before project() initializes this cache entry.
10+
if (NOT DEFINED CMAKE_EXPORT_COMPILE_COMMANDS AND
11+
NOT DEFINED ENV{CMAKE_EXPORT_COMPILE_COMMANDS})
12+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
13+
endif()
14+
915
project(ixwebsocket LANGUAGES C CXX VERSION 12.1.0)
1016

11-
set (CMAKE_CXX_STANDARD 11)
12-
set (CXX_STANDARD_REQUIRED ON)
13-
set (CMAKE_CXX_EXTENSIONS OFF)
14-
set (CMAKE_EXPORT_COMPILE_COMMANDS yes)
17+
if (NOT DEFINED CMAKE_CXX_STANDARD)
18+
set(CMAKE_CXX_STANDARD 11)
19+
endif()
20+
if (CMAKE_CXX_STANDARD STREQUAL "98" OR CMAKE_CXX_STANDARD LESS 11)
21+
message(FATAL_ERROR "IXWebSocket requires C++11 or later")
22+
endif()
23+
if (NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED)
24+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
25+
endif()
26+
if (NOT DEFINED CMAKE_CXX_EXTENSIONS)
27+
set(CMAKE_CXX_EXTENSIONS OFF)
28+
endif()
1529

1630
option (BUILD_DEMO OFF)
1731

‎docs/build.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ Autobahn protocol compliance checks run in Docker with
5959
the CI check; it also runs on `master` and manually. See the
6060
[Autobahn instructions](autobahn.md) for reports and local debugging.
6161

62+
The library defaults to C++11 and requires C++11 or later. To build with a newer
63+
standard, pass `-DCMAKE_CXX_STANDARD=17` (or another supported standard). The CLI
64+
and tests inherit this choice; the test framework requires at least C++14.
65+
Caller-provided `CMAKE_CXX_STANDARD_REQUIRED`, `CMAKE_CXX_EXTENSIONS`, and
66+
`CMAKE_EXPORT_COMPILE_COMMANDS` settings are respected, including values inherited
67+
from a parent project using `add_subdirectory`.
68+
6269
Options for building:
6370

6471
* `-DBUILD_SHARED_LIBS=ON` will build the unittest as a shared libary instead of a static library, which is the default

‎test/CMakeLists.txt‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
cmake_minimum_required (VERSION 3.14)
66
project (ixwebsocket_unittest)
77

8-
set (CMAKE_CXX_STANDARD 11)
9-
108
option(USE_TLS "Add TLS support" ON)
119

1210
# Shared sources
@@ -119,6 +117,13 @@ foreach(TEST_TARGET_NAME ${TEST_TARGET_NAMES})
119117

120118
endforeach()
121119

120+
add_test(NAME IXWebSocketBuildSettings
121+
COMMAND ${CMAKE_COMMAND}
122+
-S ${CMAKE_CURRENT_SOURCE_DIR}/cmake/build-settings
123+
-B ${CMAKE_CURRENT_BINARY_DIR}/cmake-build-settings
124+
-G "${CMAKE_GENERATOR}")
125+
set_tests_properties(IXWebSocketBuildSettings PROPERTIES TIMEOUT 30)
126+
122127
set_tests_properties(IXWebSocketReconnectTest IXWebSocketDispatchTest IXWebSocketSendFailureTest PROPERTIES TIMEOUT 30)
123128

124129
if (USE_NETWORK_FRAMEWORK OR (UNIX AND USE_TLS AND (USE_OPEN_SSL OR USE_LIBRE_SSL OR USE_MBED_TLS)))
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
cmake_minimum_required(VERSION 3.14)
2+
3+
# Normal parent variables must take precedence over defaults in the dependency.
4+
set(CMAKE_CXX_STANDARD 17)
5+
set(CMAKE_CXX_STANDARD_REQUIRED OFF)
6+
set(CMAKE_CXX_EXTENSIONS ON)
7+
set(CMAKE_EXPORT_COMPILE_COMMANDS OFF)
8+
project(ixwebsocket_build_settings LANGUAGES C CXX)
9+
10+
set(USE_TLS OFF CACHE BOOL "")
11+
set(USE_ZLIB OFF CACHE BOOL "")
12+
set(USE_WS ON CACHE BOOL "")
13+
set(USE_TEST ON CACHE BOOL "")
14+
add_subdirectory(../../.. ixwebsocket)
15+
16+
foreach(target ixwebsocket ws IXHttpTest)
17+
get_target_property(standard ${target} CXX_STANDARD)
18+
get_target_property(required ${target} CXX_STANDARD_REQUIRED)
19+
get_target_property(extensions ${target} CXX_EXTENSIONS)
20+
if (NOT standard STREQUAL "17" OR required OR NOT extensions)
21+
message(FATAL_ERROR "${target} changed the parent settings: ${standard};${required};${extensions}")
22+
endif()
23+
endforeach()
24+
25+
get_target_property(library_source ixwebsocket SOURCE_DIR)
26+
get_directory_property(export_commands DIRECTORY ${library_source}
27+
DEFINITION CMAKE_EXPORT_COMPILE_COMMANDS)
28+
if (export_commands)
29+
message(FATAL_ERROR "IXWebSocket enabled compile commands despite the parent setting")
30+
endif()

‎ws/CMakeLists.txt‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
cmake_minimum_required (VERSION 3.14)
77
project (ws)
88

9-
set (CMAKE_CXX_STANDARD 11)
10-
119
option(USE_TLS "Add TLS support" ON)
1210

1311
include_directories(ws .)

0 commit comments

Comments
 (0)