nextpnr/cmake/CheckCXXCompilerHashEmbed.cmake
Catherine bb2336ad73 Fix #embed support in bbasm and use it when available.
This removes the atomic rename for bbasm outputs because it embeds
the resulting paths into the `.cc` files in embed mode. In any case
the write should be fast enough to not be a big risk for interrupted
builds.

This was tested with Clang 19 only (gcc hasn't had a release that
supports `#embed` yet).
2025-01-21 17:13:03 +00:00

31 lines
1.1 KiB
CMake

# This is checking for CMAKE_CXX_COMPILER's ability to use `#embed`.
# BBAsm is using `#embed` (C) and not `std::embed` (C++) even though it emits C++ code.
# As of 2025-01-16: Note that the usage of `#embed` in C has different rules (the C++ one is
# an extension, the C one is in the C23 standard).
# Example usage:
#
# check_cxx_compiler_hash_embed(HAS_HASH_EMBED CXX_FLAGS_HASH_EMBED)
# set(CMAKE_CXX_FLAGS ${CXX_FLAGS_HASH_EMBED} ${CMAKE_CXX_FLAGS})
#
function(check_cxx_compiler_hash_embed VAR FLAGS_VAR)
try_compile(
${VAR}
SOURCE_FROM_CONTENT
compiletest.cc
"const char s[] = {\n#embed \"${CMAKE_CURRENT_FUNCTION_LIST_FILE}\"\n};\nint main() {}"
)
if (${VAR})
if (FLAGS_VAR)
check_cxx_compiler_flag(-Wc23-extensions HAS_Wc23-extensions)
if (HAS_Wc23-extensions)
set(${FLAGS_VAR} -Wno-c23-extensions PARENT_SCOPE)
endif()
endif()
message(STATUS "C++ compiler supports #embed")
else()
message(STATUS "C++ compiler does NOT support #embed")
endif()
endfunction()