diff --git a/CMakeLists.txt b/CMakeLists.txt index fc1fa967af715..b1ffc021ba977 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -330,58 +330,57 @@ include(cmake/leveldb.cmake) include(cmake/minisketch.cmake) include(cmake/secp256k1.cmake) +add_library(warn_interface INTERFACE) +target_link_libraries(core_interface INTERFACE warn_interface) include(ProcessConfigurations) are_flags_overridden(CMAKE_CXX_FLAGS cxx_flags_overridden) # TODO: Rework after https://github.com/bitcoin/bitcoin/pull/25972. -if(NOT cxx_flags_overridden AND NOT CMAKE_CROSSCOMPILING) - add_library(warn_interface INTERFACE) - target_link_libraries(core_interface INTERFACE warn_interface) - if(MSVC) - try_append_cxx_flags("/W3" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("/wd4018" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("/wd4244" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("/wd4267" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("/wd4715" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("/wd4805" TARGET warn_interface SKIP_LINK) - target_compile_definitions(warn_interface INTERFACE - _CRT_SECURE_NO_WARNINGS - _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING - ) - else() - try_append_cxx_flags("-Wall" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wextra" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wgnu" TARGET warn_interface SKIP_LINK) - # Some compilers will ignore -Wformat-security without -Wformat, so just combine the two here. - try_append_cxx_flags("-Wformat;-Wformat-security" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wvla" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wshadow-field" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wthread-safety" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wloop-analysis" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wredundant-decls" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wunused-member-function" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wdate-time" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wconditional-uninitialized" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wduplicated-branches" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wduplicated-cond" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wlogical-op" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Woverloaded-virtual" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wsuggest-override" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wimplicit-fallthrough" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wunreachable-code" TARGET warn_interface SKIP_LINK) - try_append_cxx_flags("-Wdocumentation" TARGET warn_interface SKIP_LINK) - - # Some compilers (gcc) ignore unknown -Wno-* options, but warn about all - # unknown options if any other warning is produced. Test the -Wfoo case, and - # set the -Wno-foo case if it works. - try_append_cxx_flags("-Wunused-parameter" TARGET warn_interface SKIP_LINK - IF_CHECK_PASSED "-Wno-unused-parameter" - ) - try_append_cxx_flags("-Wself-assign" TARGET warn_interface SKIP_LINK - IF_CHECK_PASSED "-Wno-self-assign" - ) - endif() +if(NOT cxx_flags_overridden AND NOT CMAKE_TOOLCHAIN_FILE) + try_append_cxx_flags("-Wall" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wextra" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wgnu" TARGET warn_interface SKIP_LINK) + # Some compilers will ignore -Wformat-security without -Wformat, so just combine the two here. + try_append_cxx_flags("-Wformat;-Wformat-security" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wvla" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wshadow-field" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wthread-safety" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wloop-analysis" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wredundant-decls" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wunused-member-function" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wdate-time" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wconditional-uninitialized" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wduplicated-branches" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wduplicated-cond" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wlogical-op" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Woverloaded-virtual" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wsuggest-override" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wimplicit-fallthrough" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wunreachable-code" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("-Wdocumentation" TARGET warn_interface SKIP_LINK) + + # Some compilers (gcc) ignore unknown -Wno-* options, but warn about all + # unknown options if any other warning is produced. Test the -Wfoo case, and + # set the -Wno-foo case if it works. + try_append_cxx_flags("-Wunused-parameter" TARGET warn_interface SKIP_LINK + IF_CHECK_PASSED "-Wno-unused-parameter" + ) + try_append_cxx_flags("-Wself-assign" TARGET warn_interface SKIP_LINK + IF_CHECK_PASSED "-Wno-self-assign" + ) endif() unset(cxx_flags_overridden) +if(MSVC) + try_append_cxx_flags("/W3" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("/wd4018" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("/wd4244" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("/wd4267" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("/wd4715" TARGET warn_interface SKIP_LINK) + try_append_cxx_flags("/wd4805" TARGET warn_interface SKIP_LINK) + target_compile_definitions(warn_interface INTERFACE + _CRT_SECURE_NO_WARNINGS + _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING + ) +endif() set_default_config(RelWithDebInfo) @@ -530,22 +529,20 @@ else() ) endif() -if(CMAKE_CROSSCOMPILING) - target_compile_definitions(core_base_interface INTERFACE ${DEPENDS_COMPILE_DEFINITIONS}) - target_compile_definitions(core_depends_release_interface INTERFACE ${DEPENDS_COMPILE_DEFINITIONS_RELWITHDEBINFO}) - target_compile_definitions(core_depends_debug_interface INTERFACE ${DEPENDS_COMPILE_DEFINITIONS_DEBUG}) - - # If {C,CXX}FLAGS variables are defined during building depends and - # configuring this build system, their content might be duplicated. - if(DEFINED ENV{CFLAGS}) - deduplicate_flags(CMAKE_C_FLAGS) - endif() - if(DEFINED ENV{CXXFLAGS}) - deduplicate_flags(CMAKE_CXX_FLAGS) - endif() - if(DEFINED ENV{LDFLAGS}) - deduplicate_flags(CMAKE_EXE_LINKER_FLAGS) - endif() +target_compile_definitions(core_base_interface INTERFACE ${DEPENDS_COMPILE_DEFINITIONS}) +target_compile_definitions(core_depends_release_interface INTERFACE ${DEPENDS_COMPILE_DEFINITIONS_RELWITHDEBINFO}) +target_compile_definitions(core_depends_debug_interface INTERFACE ${DEPENDS_COMPILE_DEFINITIONS_DEBUG}) + +# If {C,CXX,LD}FLAGS variables are defined during building depends and +# configuring this build system, their content might be duplicated. +if(DEFINED ENV{CFLAGS}) + deduplicate_flags(CMAKE_C_FLAGS) +endif() +if(DEFINED ENV{CXXFLAGS}) + deduplicate_flags(CMAKE_CXX_FLAGS) +endif() +if(DEFINED ENV{LDFLAGS}) + deduplicate_flags(CMAKE_EXE_LINKER_FLAGS) endif() add_subdirectory(src) diff --git a/cmake/module/Maintenance.cmake b/cmake/module/Maintenance.cmake index 1d4d61a4b38a2..84f4c71614db3 100644 --- a/cmake/module/Maintenance.cmake +++ b/cmake/module/Maintenance.cmake @@ -30,11 +30,9 @@ function(add_maintenance_targets) else() set(exe_format ELF) endif() - if(CMAKE_CROSSCOMPILING) - list(JOIN DEPENDS_C_COMPILER_WITH_LAUNCHER " " c_compiler_command) - else() - set(c_compiler_command ${CMAKE_C_COMPILER}) - endif() + list(JOIN CMAKE_C_COMPILER_LAUNCHER " " c_compiler_command) + string(STRIP "${c_compiler_command} ${CMAKE_C_COMPILER}" c_compiler_command) + string(STRIP "${c_compiler_command} ${CMAKE_C_COMPILER_ARG1}" c_compiler_command) add_custom_target(test-security-check COMMAND ${CMAKE_COMMAND} -E env CC=${c_compiler_command} CFLAGS=${CMAKE_C_FLAGS} LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${PYTHON_COMMAND} ${CMAKE_SOURCE_DIR}/contrib/devtools/test-security-check.py TestSecurityChecks.test_${exe_format} COMMAND ${CMAKE_COMMAND} -E env CC=${c_compiler_command} CFLAGS=${CMAKE_C_FLAGS} LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${PYTHON_COMMAND} ${CMAKE_SOURCE_DIR}/contrib/devtools/test-symbol-check.py TestSymbolChecks.test_${exe_format} @@ -111,7 +109,20 @@ function(add_macos_deploy_target) ) string(REPLACE " " "-" osx_volname ${PACKAGE_NAME}) - if(CMAKE_CROSSCOMPILING) + if(CMAKE_HOST_APPLE) + add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/${osx_volname}.zip + COMMAND ${PYTHON_COMMAND} ${CMAKE_SOURCE_DIR}/contrib/macdeploy/macdeployqtplus ${macos_app} ${osx_volname} -translations-dir=${QT_TRANSLATIONS_DIR} -zip + DEPENDS ${CMAKE_BINARY_DIR}/${macos_app}/Contents/MacOS/Bitcoin-Qt + VERBATIM + ) + add_custom_target(deploydir + DEPENDS ${CMAKE_BINARY_DIR}/${osx_volname}.zip + ) + add_custom_target(deploy + DEPENDS ${CMAKE_BINARY_DIR}/${osx_volname}.zip + ) + else() add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/dist/${macos_app}/Contents/MacOS/Bitcoin-Qt COMMAND OTOOL=${OTOOL} ${PYTHON_COMMAND} ${CMAKE_SOURCE_DIR}/contrib/macdeploy/macdeployqtplus ${macos_app} ${osx_volname} -translations-dir=${QT_TRANSLATIONS_DIR} @@ -133,19 +144,6 @@ function(add_macos_deploy_target) DEPENDS ${CMAKE_BINARY_DIR}/dist/${osx_volname}.zip ) add_dependencies(deploy deploydir) - else() - add_custom_command( - OUTPUT ${CMAKE_BINARY_DIR}/${osx_volname}.zip - COMMAND ${PYTHON_COMMAND} ${CMAKE_SOURCE_DIR}/contrib/macdeploy/macdeployqtplus ${macos_app} ${osx_volname} -translations-dir=${QT_TRANSLATIONS_DIR} -zip - DEPENDS ${CMAKE_BINARY_DIR}/${macos_app}/Contents/MacOS/Bitcoin-Qt - VERBATIM - ) - add_custom_target(deploydir - DEPENDS ${CMAKE_BINARY_DIR}/${osx_volname}.zip - ) - add_custom_target(deploy - DEPENDS ${CMAKE_BINARY_DIR}/${osx_volname}.zip - ) endif() endif() endfunction() diff --git a/depends/Makefile b/depends/Makefile index fac703966a03f..57aebcc4d14d7 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -258,9 +258,16 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_ $< > $@ touch $@ +ifeq ($(host),$(build)) + crosscompiling=FALSE +else + crosscompiling=TRUE +endif + $(host_prefix)/toolchain.cmake : toolchain.cmake.in $(host_prefix)/.stamp_$(final_build_id) @mkdir -p $(@D) - sed -e 's|@host_system@|$($(host_os)_cmake_system)|' \ + sed -e 's|@depends_crosscompiling@|$(crosscompiling)|' \ + -e 's|@host_system@|$($(host_os)_cmake_system)|' \ -e 's|@host_arch@|$(host_arch)|' \ -e 's|@CC@|$(host_CC)|' \ -e 's|@CXX@|$(host_CXX)|' \ diff --git a/depends/toolchain.cmake.in b/depends/toolchain.cmake.in index 8676b65f68a60..4c7b36e0d11d9 100644 --- a/depends/toolchain.cmake.in +++ b/depends/toolchain.cmake.in @@ -4,8 +4,10 @@ # This file is expected to be highly volatile and may still change substantially. -set(CMAKE_SYSTEM_NAME @host_system@) -set(CMAKE_SYSTEM_PROCESSOR @host_arch@) +if(@depends_crosscompiling@) + set(CMAKE_SYSTEM_NAME @host_system@) + set(CMAKE_SYSTEM_PROCESSOR @host_arch@) +endif() function(split_compiler_launcher env_compiler launcher compiler) set(${launcher}) diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index b528b4d68acfc..84a6716579768 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -35,7 +35,7 @@ if(BUILD_GUI_TESTS) list(APPEND qt_components Test) endif() -if(CMAKE_CROSSCOMPILING) +if(CMAKE_TOOLCHAIN_FILE AND NOT VCPKG_TARGET_TRIPLET) # The find_package(Qt ...) function internally uses find_library() # calls for all dependencies to ensure their availability. # In turn, the find_library() inspects the well-known locations