Skip to content

Commit 1e04f2b

Browse files
authored
Fix CMAKE_C[XX]_IMPLICIT_INCLUDE_DIRECTORIES (#23535)
This fixes CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES for the case when we don't use compiler-auto-detection. i.e. `-DEMSCRIPTEN_FORCE_COMPILERS=OFF` which happens to be the default today. As a followup we should consider completely removing `EMSCRIPTEN_FORCE_COMPILERS`. Fixes: #23444
1 parent a508190 commit 1e04f2b

File tree

3 files changed

+41
-18
lines changed

3 files changed

+41
-18
lines changed

cmake/Modules/Platform/Emscripten.cmake

+17-18
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,16 @@ if (NOT EMSCRIPTEN_VERSION)
110110
set(EMSCRIPTEN_VERSION "${CMAKE_MATCH_1}")
111111
endif()
112112

113+
execute_process(COMMAND "${EMSCRIPTEN_ROOT_PATH}/em-config${EMCC_SUFFIX}" "CACHE"
114+
RESULT_VARIABLE _emcache_result
115+
OUTPUT_VARIABLE _emcache_output
116+
OUTPUT_STRIP_TRAILING_WHITESPACE)
117+
if (NOT _emcache_result EQUAL 0)
118+
message(FATAL_ERROR "Failed to find emscripten cache directory with command \"'${EMSCRIPTEN_ROOT_PATH}/em-config${EMCC_SUFFIX}' CACHE\"! Process returned with error code ${_emcache_result}.")
119+
endif()
120+
file(TO_CMAKE_PATH "${_emcache_output}" _emcache_output)
121+
set(EMSCRIPTEN_SYSROOT "${_emcache_output}/sysroot")
122+
113123
# Don't allow CMake to autodetect the compiler, since this is quite slow with
114124
# Emscripten.
115125
# Pass -DEMSCRIPTEN_FORCE_COMPILERS=OFF to disable (sensible mostly only for
@@ -159,6 +169,13 @@ if (EMSCRIPTEN_FORCE_COMPILERS)
159169
set(CMAKE_C_PLATFORM_ID "emscripten")
160170
set(CMAKE_CXX_PLATFORM_ID "emscripten")
161171

172+
if (NOT DEFINED CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES)
173+
set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "${EMSCRIPTEN_SYSROOT}/include")
174+
endif()
175+
if (NOT DEFINED CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES)
176+
set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "${EMSCRIPTEN_SYSROOT}/include;${EMSCRIPTEN_SYSROOT}/include/c++/v1")
177+
endif()
178+
162179
if ("${CMAKE_VERSION}" VERSION_LESS "3.8")
163180
set(CMAKE_C_COMPILE_FEATURES "c_function_prototypes;c_restrict;c_variadic_macros;c_static_assert")
164181
set(CMAKE_C90_COMPILE_FEATURES "c_function_prototypes")
@@ -201,16 +218,6 @@ if (EMSCRIPTEN_FORCE_COMPILERS)
201218
endif()
202219
endif()
203220

204-
execute_process(COMMAND "${EMSCRIPTEN_ROOT_PATH}/em-config${EMCC_SUFFIX}" "CACHE"
205-
RESULT_VARIABLE _emcache_result
206-
OUTPUT_VARIABLE _emcache_output
207-
OUTPUT_STRIP_TRAILING_WHITESPACE)
208-
if (NOT _emcache_result EQUAL 0)
209-
message(FATAL_ERROR "Failed to find emscripten cache directory with command \"'${EMSCRIPTEN_ROOT_PATH}/em-config${EMCC_SUFFIX}' CACHE\"! Process returned with error code ${_emcache_result}.")
210-
endif()
211-
file(TO_CMAKE_PATH "${_emcache_output}" _emcache_output)
212-
set(EMSCRIPTEN_SYSROOT "${_emcache_output}/sysroot")
213-
214221
list(APPEND CMAKE_FIND_ROOT_PATH "${EMSCRIPTEN_SYSROOT}")
215222
list(APPEND CMAKE_SYSTEM_PREFIX_PATH /)
216223

@@ -366,11 +373,3 @@ endif()
366373
# complain about unused CMake variable.
367374
if (CMAKE_CROSSCOMPILING_EMULATOR)
368375
endif()
369-
370-
# TODO: CMake appends <sysroot>/usr/include to implicit includes; switching to use usr/include will make this redundant.
371-
if (NOT DEFINED CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES)
372-
set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "${EMSCRIPTEN_SYSROOT}/include")
373-
endif()
374-
if (NOT DEFINED CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES)
375-
set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "${EMSCRIPTEN_SYSROOT}/include")
376-
endif()

test/cmake/static_lib/CMakeLists.txt

+5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ cmake_minimum_required(VERSION 3.0)
22

33
project(static_library)
44

5+
if (CMAKE_EXPORT_COMPILE_COMMANDS)
6+
message(STATUS "CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES -> ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}")
7+
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES})
8+
endif()
9+
510
# Test mode that checks that it's possible to override the file suffix
611
# (independent of whether ar archive or LLVM bitcode file is created)
712
# Note that "-DCMAKE_STATIC_LIBRARY_SUFFIX=foo" cannot be passed to CMake from

test/test_other.py

+19
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,25 @@ def test_cmake_bitcode_static_libraries(self):
10201020
err = self.expect_fail([EMCMAKE, 'cmake', test_file('cmake/static_lib'), '-DEMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES=ON'])
10211021
self.assertContained('EMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES is not compatible with the', err)
10221022

1023+
@crossplatform
1024+
@parameterized({
1025+
'': ([],),
1026+
'noforce': (['-DEMSCRIPTEN_FORCE_COMPILERS=OFF'],),
1027+
})
1028+
def test_cmake_compile_commands(self, args):
1029+
self.run_process([EMCMAKE, 'cmake', test_file('cmake/static_lib'), '-DCMAKE_EXPORT_COMPILE_COMMANDS=ON'] + args)
1030+
self.assertExists('compile_commands.json')
1031+
compile_commands = json.load(open('compile_commands.json'))
1032+
command = compile_commands[0]['command']
1033+
# Sometimes cmake puts the include dirs in an RSP file
1034+
rsp = [p for p in command.split() if 'includes_CXX.rsp' in p]
1035+
if rsp:
1036+
command = read_file(rsp[0][1:])
1037+
include_dir = utils.normalize_path(cache.get_sysroot_dir('include'))
1038+
include_dir_cxx = utils.normalize_path(cache.get_sysroot_dir('include/c++/v1'))
1039+
self.assertContained(include_dir, command)
1040+
self.assertContained(include_dir_cxx, command)
1041+
10231042
@parameterized({
10241043
'': ['0'],
10251044
'suffix': ['1'],

0 commit comments

Comments
 (0)