From 611f2921dcbe6efebe09e3072bfe2d04d5db3513 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Sat, 21 Jan 2023 01:48:44 -0800 Subject: libcereal: Use -idirafter instead of -isystem Signed-off-by: Khem Raj --- ...01-cmake-Use-idirafter-instead-of-isystem.patch | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 meta-oe/recipes-support/libcereal/files/0001-cmake-Use-idirafter-instead-of-isystem.patch (limited to 'meta-oe/recipes-support/libcereal/files') diff --git a/meta-oe/recipes-support/libcereal/files/0001-cmake-Use-idirafter-instead-of-isystem.patch b/meta-oe/recipes-support/libcereal/files/0001-cmake-Use-idirafter-instead-of-isystem.patch new file mode 100644 index 000000000..fc30f0ad7 --- /dev/null +++ b/meta-oe/recipes-support/libcereal/files/0001-cmake-Use-idirafter-instead-of-isystem.patch @@ -0,0 +1,52 @@ +From ac70933783a70d5387a2bb2849c568e33ba52558 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 21 Jan 2023 01:41:32 -0800 +Subject: [PATCH] cmake: Use -idirafter instead of -isystem + +isystem dirs are searched before the regular system dirs +this exposes an interesting include ordering problem when using +clang + libc++, when including C++ headers like + +cstdlib includes stdlib.h and in case of libc++, this should be coming +from libc++ as well, which is then eventually including system stdlib.h + +libc++ has added a check for checking this order recently, which means +if cstlib ends up including system stdlib.h before libc++ provided +stdlib.h it errors out + +| /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: tried including but didn't find libc++'s 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 + Library, and you are probably using compiler flags that make that not be the case. | # error tried including but didn't find libc++'s header. \ +| ^ + +The reason is that include_directories with SYSTEM property adds the +directory via -system and some of these directories point to sysroot +e.g. OPENSSL_INCLUDE_DIR which ends up adding -isystem +/usr/include and causes the system stdlib.h to included before +libc++ stdlib.h + +A fix is to use -idirafter which preserved the effects of system headers +but instead of prepending, it will append to system headers and the +issue is addressed + +Upstream-Status: Submitted [https://github.com/USCiLab/cereal/pull/777] +Signed-off-by: Khem Raj +--- + unittests/boost/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/unittests/boost/CMakeLists.txt b/unittests/boost/CMakeLists.txt +index 1d733bc7..08e6a169 100644 +--- a/unittests/boost/CMakeLists.txt ++++ b/unittests/boost/CMakeLists.txt +@@ -1,6 +1,6 @@ + file(GLOB TESTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) + +-include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) ++set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -idirafter ${Boost_INCLUDE_DIRS}") + + # Build all of the non-special tests + foreach(TEST_SOURCE ${TESTS}) +-- +2.39.1 + -- cgit v1.2.3-54-g00ecf