diff --git a/CMakeLists.txt b/CMakeLists.txt index 16cc3c1d..b354da26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(nextpnr CXX) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) include(CheckCXXCompilerFlag) +include(CheckCXXCompilerHashEmbed) if (NOT DEFINED CMAKE_SUPPRESS_DEVELOPER_WARNINGS) set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE INTERNAL "No dev warnings") @@ -55,7 +56,11 @@ else() set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE) endif() -if (WIN32) +check_cxx_compiler_hash_embed(HAS_HASH_EMBED CXX_FLAGS_HASH_EMBED) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS_HASH_EMBED}") +if (HAS_HASH_EMBED) + set(BBASM_MODE "embed") +elseif (WIN32) set(BBASM_MODE "resource") elseif (EXTERNAL_CHIPDB) set(BBASM_MODE "binary") diff --git a/bba/CMakeLists.txt b/bba/CMakeLists.txt index f2b7f887..6fdfa8e7 100644 --- a/bba/CMakeLists.txt +++ b/bba/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.25) project(bba CXX) find_package(Boost REQUIRED COMPONENTS diff --git a/bba/main.cc b/bba/main.cc index 82c4426b..50d2c899 100644 --- a/bba/main.cc +++ b/bba/main.cc @@ -443,20 +443,20 @@ int main(int argc, char **argv) for (auto &s : postText) fprintf(fileOut, "%s\n", s.c_str()); } else if (writeE) { - for (auto &s : preText) - fprintf(fileOut, "%s\n", s.c_str()); - - fprintf(fileOut, "const char %s[%d] =\n", streams[0].name.c_str(), int(data.size()) + 1); - fprintf(fileOut, "#embed_str \"%s\"\n", boost::filesystem::path(files.at(2)).stem().c_str()); - fprintf(fileOut, ";\n"); - - for (auto &s : postText) - fprintf(fileOut, "%s\n", s.c_str()); - FILE *fileBin = fopen(files.at(2).c_str(), "wb"); assert(fileBin != nullptr); fwrite(data.data(), int(data.size()), 1, fileBin); fclose(fileBin); + + for (auto &s : preText) + fprintf(fileOut, "%s\n", s.c_str()); + + fprintf(fileOut, "const char %s[%d] = {\n", streams[0].name.c_str(), int(data.size()) + 1); + fprintf(fileOut, "#embed \"%s\"\n", boost::filesystem::path(files.at(2)).c_str()); + fprintf(fileOut, "};\n"); + + for (auto &s : postText) + fprintf(fileOut, "%s\n", s.c_str()); } else { fwrite(data.data(), int(data.size()), 1, fileOut); } diff --git a/cmake/BBAsm.cmake b/cmake/BBAsm.cmake index 4a2b3688..991aa994 100644 --- a/cmake/BBAsm.cmake +++ b/cmake/BBAsm.cmake @@ -81,11 +81,7 @@ function(add_bba_compile_command) COMMAND bbasm ${BBASM_ENDIAN_FLAG} ${arg_INPUT} - ${arg_OUTPUT}.new - COMMAND - ${CMAKE_COMMAND} -E rename # atomic update - ${arg_OUTPUT}.new - ${arg_OUTPUT} + ${arg_OUTPUT} DEPENDS bbasm ${arg_INPUT} @@ -120,16 +116,8 @@ function(add_bba_compile_command) COMMAND bbasm ${BBASM_ENDIAN_FLAG} --e ${arg_INPUT} - ${arg_OUTPUT}.cc.new - ${arg_OUTPUT}.new - COMMAND - ${CMAKE_COMMAND} -E rename # atomic update - ${arg_OUTPUT}.cc.new - ${arg_OUTPUT}.cc - COMMAND - ${CMAKE_COMMAND} -E rename # atomic update - ${arg_OUTPUT}.new - ${arg_OUTPUT} + ${arg_OUTPUT}.cc + ${arg_OUTPUT} DEPENDS bbasm ${arg_INPUT} @@ -149,17 +137,20 @@ function(add_bba_compile_command) COMMAND bbasm ${BBASM_ENDIAN_FLAG} --c ${arg_INPUT} - ${arg_OUTPUT}.cc.new - COMMAND - ${CMAKE_COMMAND} -E rename # atomic update - ${arg_OUTPUT}.cc.new - ${arg_OUTPUT}.cc + ${arg_OUTPUT}.cc DEPENDS bbasm ${arg_INPUT} VERBATIM ) + if (NOT MSVC) + set_source_files_properties( + ${arg_OUTPUT}.cc PROPERTIES + COMPILE_OPTIONS "-w;-g0;-O0" + ) + endif() + target_sources( ${arg_TARGET} PRIVATE ${arg_OUTPUT}.cc diff --git a/cmake/CheckCXXCompilerHashEmbed.cmake b/cmake/CheckCXXCompilerHashEmbed.cmake new file mode 100644 index 00000000..d5203327 --- /dev/null +++ b/cmake/CheckCXXCompilerHashEmbed.cmake @@ -0,0 +1,30 @@ +# 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() diff --git a/ecp5/CMakeLists.txt b/ecp5/CMakeLists.txt index 72d8ebb1..3b1c6276 100644 --- a/ecp5/CMakeLists.txt +++ b/ecp5/CMakeLists.txt @@ -1,7 +1,6 @@ include(FindTrellis) add_library(chipdb-${family} OBJECT) -target_compile_options(chipdb-${family} PRIVATE -w -g0 -O0) target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) target_include_directories(chipdb-${family} PRIVATE .) diff --git a/gowin/CMakeLists.txt b/gowin/CMakeLists.txt index 7d168b70..7f045ccf 100644 --- a/gowin/CMakeLists.txt +++ b/gowin/CMakeLists.txt @@ -1,7 +1,6 @@ include(FindApycula) add_library(chipdb-${family} OBJECT) -target_compile_options(chipdb-${family} PRIVATE -w -g0 -O0) target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) target_include_directories(chipdb-${family} PRIVATE .) diff --git a/ice40/CMakeLists.txt b/ice40/CMakeLists.txt index 95d472d1..ef12a69d 100644 --- a/ice40/CMakeLists.txt +++ b/ice40/CMakeLists.txt @@ -1,7 +1,6 @@ include(FindIceStorm) add_library(chipdb-${family} OBJECT) -target_compile_options(chipdb-${family} PRIVATE -w -g0 -O0) target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) target_include_directories(chipdb-${family} PRIVATE .) diff --git a/machxo2/CMakeLists.txt b/machxo2/CMakeLists.txt index 148b36fb..3f21d75e 100644 --- a/machxo2/CMakeLists.txt +++ b/machxo2/CMakeLists.txt @@ -1,7 +1,6 @@ include(FindTrellis) add_library(chipdb-${family} OBJECT) -target_compile_options(chipdb-${family} PRIVATE -w -g0 -O0) target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) target_include_directories(chipdb-${family} PRIVATE .) diff --git a/nexus/CMakeLists.txt b/nexus/CMakeLists.txt index e801ae13..e49a05a2 100644 --- a/nexus/CMakeLists.txt +++ b/nexus/CMakeLists.txt @@ -7,7 +7,6 @@ set(NEXUS_FAMILIES ${ALL_NEXUS_FAMILIES} CACHE STRING message(STATUS "Enabled Nexus families: ${NEXUS_FAMILIES}") add_library(chipdb-${family} OBJECT) -target_compile_options(chipdb-${family} PRIVATE -w -g0 -O0) target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) target_include_directories(chipdb-${family} PRIVATE .)