mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-29 14:59:39 -04:00
CMake assumes the default value internally, so overriding this causes problems. The minimal speedup of skipping the linker isn't worth the complexity of setting it to static.
92 lines
2.8 KiB
CMake
92 lines
2.8 KiB
CMake
# Copyright (c) 2023-present The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or https://opensource.org/license/mit/.
|
|
|
|
include_guard(GLOBAL)
|
|
|
|
# Illumos/SmartOS requires linking with -lsocket if
|
|
# using getifaddrs & freeifaddrs.
|
|
# See:
|
|
# - https://github.com/bitcoin/bitcoin/pull/21486
|
|
# - https://smartos.org/man/3socket/getifaddrs
|
|
function(test_append_socket_library target)
|
|
if (NOT TARGET ${target})
|
|
message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION}() called with non-existent target \"${target}\".")
|
|
endif()
|
|
|
|
set(check_socket_source "
|
|
#include <sys/types.h>
|
|
#include <ifaddrs.h>
|
|
|
|
int main() {
|
|
struct ifaddrs* ifaddr;
|
|
getifaddrs(&ifaddr);
|
|
freeifaddrs(ifaddr);
|
|
}
|
|
")
|
|
|
|
include(CheckSourceCompilesAndLinks)
|
|
check_cxx_source_compiles("${check_socket_source}" IFADDR_LINKS_WITHOUT_LIBSOCKET)
|
|
if(NOT IFADDR_LINKS_WITHOUT_LIBSOCKET)
|
|
check_cxx_source_links_with_libs(socket "${check_socket_source}" IFADDR_NEEDS_LINK_TO_LIBSOCKET)
|
|
if(IFADDR_NEEDS_LINK_TO_LIBSOCKET)
|
|
target_link_libraries(${target} INTERFACE socket)
|
|
else()
|
|
message(FATAL_ERROR "Cannot figure out how to use getifaddrs/freeifaddrs.")
|
|
endif()
|
|
endif()
|
|
set(HAVE_DECL_GETIFADDRS TRUE PARENT_SCOPE)
|
|
set(HAVE_DECL_FREEIFADDRS TRUE PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Clang, when building for 32-bit,
|
|
# and linking against libstdc++, requires linking with
|
|
# -latomic if using the C++ atomic library.
|
|
# Can be tested with: clang++ -std=c++20 test.cpp -m32
|
|
#
|
|
# Sourced from http://bugs.debian.org/797228
|
|
function(test_append_atomic_library target)
|
|
if (NOT TARGET ${target})
|
|
message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION}() called with non-existent target \"${target}\".")
|
|
endif()
|
|
|
|
set(check_atomic_source "
|
|
#include <atomic>
|
|
#include <cstdint>
|
|
#include <chrono>
|
|
|
|
using namespace std::chrono_literals;
|
|
|
|
int main() {
|
|
std::atomic<bool> lock{true};
|
|
lock.exchange(false);
|
|
|
|
std::atomic<std::chrono::seconds> t{0s};
|
|
t.store(2s);
|
|
auto t1 = t.load();
|
|
t.compare_exchange_strong(t1, 3s);
|
|
|
|
std::atomic<double> d{};
|
|
d.store(3.14);
|
|
auto d1 = d.load();
|
|
|
|
std::atomic<int64_t> a{};
|
|
int64_t v = 5;
|
|
int64_t r = a.fetch_add(v);
|
|
return static_cast<int>(r);
|
|
}
|
|
")
|
|
|
|
include(CheckSourceCompilesAndLinks)
|
|
check_cxx_source_compiles("${check_atomic_source}" STD_ATOMIC_LINKS_WITHOUT_LIBATOMIC)
|
|
if(STD_ATOMIC_LINKS_WITHOUT_LIBATOMIC)
|
|
return()
|
|
endif()
|
|
|
|
check_cxx_source_links_with_libs(atomic "${check_atomic_source}" STD_ATOMIC_NEEDS_LINK_TO_LIBATOMIC)
|
|
if(STD_ATOMIC_NEEDS_LINK_TO_LIBATOMIC)
|
|
target_link_libraries(${target} INTERFACE atomic)
|
|
else()
|
|
message(FATAL_ERROR "Cannot figure out how to use std::atomic.")
|
|
endif()
|
|
endfunction()
|