check whether "-latomic" is required for composite type, see src/mongo/bson/timestamp.h, otherwise the build fails with: > /usr/bin/x86_64-pc-linux-gnu-ld.bfd: build/gentoo/mongo/db/storage/wiredtiger/wiredtiger_record_store.o: in function `mongo::WiredTigerRecordStore::getEarliestOplogTimestamp(mongo::OperationContext*)': > /usr/lib/gcc/x86_64-pc-linux-gnu/14/include/g++-v14/bits/atomic_base.h:1002:(.text+0x7da9): undefined reference to `__atomic_compare_exchange' > clang++: error: linker command failed with exit code 1 (use -v to see invocation) diff --git a/SConstruct b/SConstruct index 2a32456..4cfb5fd 100644 --- a/SConstruct +++ b/SConstruct @@ -5369,10 +5369,33 @@ def doConfigure(myenv): conf.AddTest("CheckStdAtomic", CheckStdAtomic) + def CheckTimestampAtomic(context, extra_message): + test_body = """ + #include + struct Timestamp { unsigned int t, i; }; + template struct AtomicWord { std::atomic v; T compareAndSwap(T e, T n) { v.compare_exchange_strong(e,n); return e; } }; + int main() { + AtomicWord x; + Timestamp a{0,0}, b{1,1}; + x.compareAndSwap(a,b); + return 0; + } + """ + + context.Message("Checking if AtomicWord works{0}... ".format(extra_message)) + + ret = context.TryLink(textwrap.dedent(test_body), ".cpp") + context.Result(ret) + return ret + + conf.AddTest("CheckTimestampAtomic", CheckTimestampAtomic) + def check_all_atomics(extra_message=''): for t in ('int64_t', 'uint64_t', 'int32_t', 'uint32_t'): if not conf.CheckStdAtomic(t, extra_message): return False + if not conf.CheckTimestampAtomic(extra_message): + return False return True if not check_all_atomics():