# Nimbus # Copyright (c) 2018-2024 Status Research & Development GmbH # Licensed under either of # * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or # http://www.apache.org/licenses/LICENSE-2.0) # * MIT license ([LICENSE-MIT](LICENSE-MIT) or # http://opensource.org/licenses/MIT) # at your option. This file may not be copied, modified, or distributed except # according to those terms. import strutils const currentDir = currentSourcePath()[0 .. ^(len("config.nims") + 1)] if getEnv("NIMBUS_BUILD_SYSTEM") == "yes" and # BEWARE # In Nim 1.6, config files are evaluated with a working directory # matching where the Nim command was invocated. This means that we # must do all file existance checks with full absolute paths: system.fileExists(currentDir & "nimbus-build-system.paths"): include "nimbus-build-system.paths" if defined(release): switch("nimcache", "nimcache/release/$projectName") else: switch("nimcache", "nimcache/debug/$projectName") if defined(windows): # disable timestamps in Windows PE headers - https://wiki.debian.org/ReproducibleBuilds/TimestampsInPEBinaries switch("passL", "-Wl,--no-insert-timestamp") # increase stack size, unless something else is setting the stack size if not defined(windowsNoSetStack): switch("passL", "-Wl,--stack,8388608") # https://github.com/nim-lang/Nim/issues/4057 --tlsEmulation:off if defined(i386): # set the IMAGE_FILE_LARGE_ADDRESS_AWARE flag so we can use PAE, if enabled, and access more than 2 GiB of RAM switch("passL", "-Wl,--large-address-aware") # Colors are disabled for Windows, see issue: # https://github.com/status-im/nim-chronicles/issues/130 switch("define", "chronicles_colors=off") # Avoid some rare stack corruption while using exceptions with a SEH-enabled # toolchain: https://github.com/status-im/nimbus-eth2/issues/3121 switch("define", "nimRawSetjmp") # This helps especially for 32-bit x86, which sans SSE2 and newer instructions # requires quite roundabout code generation for cryptography, and other 64-bit # and larger arithmetic use cases, along with register starvation issues. When # engineering a more portable binary release, this should be tweaked but still # use at least -msse2 or -msse3. # # https://github.com/status-im/nimbus-eth2/blob/stable/docs/cpu_features.md#ssse3-supplemental-sse3 # suggests that SHA256 hashing with SSSE3 is 20% faster than without SSSE3, so # given its near-ubiquity in the x86 installed base, it renders a distribution # build more viable on an overall broader range of hardware. # if defined(disableMarchNative): if defined(i386) or defined(amd64): if defined(macosx): # https://support.apple.com/kb/sp803 # "macOS Catalina - Technical Specifications": EOL as of 2022-09 # https://support.apple.com/kb/sp833 # "macOS Big Sur - Technical Specifications" lists current oldest # supported models: MacBook (2015 or later), MacBook Air (2013 or later), # MacBook Pro (Late 2013 or later), Mac mini (2014 or later), iMac (2014 # or later), iMac Pro (2017 or later), Mac Pro (2013 or later). # # These all have Haswell or newer CPUs. # # This ensures AVX2, AES-NI, PCLMUL, BMI1, and BMI2 instruction set support. switch("passC", "-march=haswell -mtune=generic") switch("passL", "-march=haswell -mtune=generic") else: switch("passC", "-mssse3") switch("passL", "-mssse3") elif defined(macosx) and defined(arm64): # Apple's Clang can't handle "-march=native" on M1: https://github.com/status-im/nimbus-eth2/issues/2758 switch("passC", "-mcpu=apple-a14") switch("passL", "-mcpu=apple-a14") else: switch("passC", "-march=native") switch("passL", "-march=native") if defined(windows): # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65782 # ("-fno-asynchronous-unwind-tables" breaks Nim's exception raising, sometimes) switch("passC", "-mno-avx512f") switch("passL", "-mno-avx512f") # Omitting frame pointers in nim breaks the GC: # https://github.com/nim-lang/Nim/issues/10625 if not defined(windows): # ...except on Windows where the Nim bug doesn't manifest and the option # crashes GCC in some Mingw-w64 versions: # https://sourceforge.net/p/mingw-w64/bugs/880/ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86593 switch("passC", "-fno-omit-frame-pointer") switch("passL", "-fno-omit-frame-pointer") --threads:on --opt:speed --excessiveStackTrace:on # enable metric collection --define:metrics # for heap-usage-by-instance-type metrics and object base-type strings --define:nimTypeNames --styleCheck:usages --styleCheck:error --mm:refc switch("define", "withoutPCRE") when not defined(disable_libbacktrace): --define:nimStackTraceOverride switch("import", "libbacktrace") else: --stacktrace:on --linetrace:on var canEnableDebuggingSymbols = true if defined(macosx): # The default open files limit is too low on macOS (512), breaking the # "--debugger:native" build. It can be increased with `ulimit -n 1024`. let openFilesLimitTarget = 1024 var openFilesLimit = 0 try: openFilesLimit = staticExec("ulimit -n").strip(chars = Whitespace + Newlines).parseInt() if openFilesLimit < openFilesLimitTarget: echo "Open files limit too low to enable debugging symbols and lightweight stack traces." echo "Increase it with \"ulimit -n " & $openFilesLimitTarget & "\"" canEnableDebuggingSymbols = false except: echo "ulimit error" # We ignore this resource limit on Windows, where a default `ulimit -n` of 256 # in Git Bash is apparently ignored by the OS, and on Linux where the default of # 1024 is good enough for us. if canEnableDebuggingSymbols: # add debugging symbols and original files and line numbers --debugger:native --define:nimOldCaseObjects # https://github.com/status-im/nim-confutils/issues/9 # `switch("warning[CaseTransition]", "off")` fails with "Error: invalid command line option: '--warning[CaseTransition]'" switch("warning", "CaseTransition:off") # The compiler doth protest too much, methinks, about all these cases where it can't # do its (N)RVO pass: https://github.com/nim-lang/RFCs/issues/230 switch("warning", "ObservableStores:off") # Too many false positives for "Warning: method has lock level , but another method has 0 [LockLevel]" switch("warning", "LockLevel:off") # nim-kzg shipping their own blst, nimbus-eth1 too. # disable nim-kzg's blst switch("define", "kzgExternalBlst") # We lock down rocksdb to a particular version # TODO self-build rocksdb dll on windows when not defined(use_system_rocksdb) and not defined(windows): switch("define", "rocksdb_static_linking") # use the C++ linker profile because it's a C++ library when defined(macosx): switch("clang.linkerexe", "clang++") else: switch("gcc.linkerexe", "g++") switch("dynlibOverride", "rocksdb") switch("dynlibOverride", "lz4") switch("dynlibOverride", "zstd") when defined(gcc): switch("passc", "-Wno-error=incompatible-pointer-types")