Andrew Geissler | c5535c9 | 2023-01-27 16:10:19 -0600 | [diff] [blame^] | 1 | From ac70933783a70d5387a2bb2849c568e33ba52558 Mon Sep 17 00:00:00 2001 |
| 2 | From: Khem Raj <raj.khem@gmail.com> |
| 3 | Date: Sat, 21 Jan 2023 01:41:32 -0800 |
| 4 | Subject: [PATCH] cmake: Use -idirafter instead of -isystem |
| 5 | |
| 6 | isystem dirs are searched before the regular system dirs |
| 7 | this exposes an interesting include ordering problem when using |
| 8 | clang + libc++, when including C++ headers like <cstdlib> |
| 9 | |
| 10 | cstdlib includes stdlib.h and in case of libc++, this should be coming |
| 11 | from libc++ as well, which is then eventually including system stdlib.h |
| 12 | |
| 13 | libc++ has added a check for checking this order recently, which means |
| 14 | if cstlib ends up including system stdlib.h before libc++ provided |
| 15 | stdlib.h it errors out |
| 16 | |
| 17 | | /mnt/b/yoe/master/build/tmp/work/riscv64-yoe-linux/libcereal/1.3.2+gitAUTOINC+ebef1e9298-r0/recipe-sysroot/usr/include/c++/v1/cwchar:113:5: error: <cwchar> tried including <wchar.h> but didn't find libc++'s <wcha |
| 18 | r.h> header. This usually means that your header search paths are not configured properly. The header search paths should contain the C++ Standard Library headers before any C Standard |
| 19 | Library, and you are probably using compiler flags that make that not be the case. | # error <cwchar> tried including <wchar.h> but didn't find libc++'s <wchar.h> header. \ |
| 20 | | ^ |
| 21 | |
| 22 | The reason is that include_directories with SYSTEM property adds the |
| 23 | directory via -system and some of these directories point to sysroot |
| 24 | e.g. OPENSSL_INCLUDE_DIR which ends up adding -isystem |
| 25 | <sysroot>/usr/include and causes the system stdlib.h to included before |
| 26 | libc++ stdlib.h |
| 27 | |
| 28 | A fix is to use -idirafter which preserved the effects of system headers |
| 29 | but instead of prepending, it will append to system headers and the |
| 30 | issue is addressed |
| 31 | |
| 32 | Upstream-Status: Submitted [https://github.com/USCiLab/cereal/pull/777] |
| 33 | Signed-off-by: Khem Raj <raj.khem@gmail.com> |
| 34 | --- |
| 35 | unittests/boost/CMakeLists.txt | 2 +- |
| 36 | 1 file changed, 1 insertion(+), 1 deletion(-) |
| 37 | |
| 38 | diff --git a/unittests/boost/CMakeLists.txt b/unittests/boost/CMakeLists.txt |
| 39 | index 1d733bc7..08e6a169 100644 |
| 40 | --- a/unittests/boost/CMakeLists.txt |
| 41 | +++ b/unittests/boost/CMakeLists.txt |
| 42 | @@ -1,6 +1,6 @@ |
| 43 | file(GLOB TESTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) |
| 44 | |
| 45 | -include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) |
| 46 | +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -idirafter ${Boost_INCLUDE_DIRS}") |
| 47 | |
| 48 | # Build all of the non-special tests |
| 49 | foreach(TEST_SOURCE ${TESTS}) |
| 50 | -- |
| 51 | 2.39.1 |
| 52 | |