summary refs log tree commit diff stats
path: root/config/nim.cfg
diff options
context:
space:
mode:
Diffstat (limited to 'config/nim.cfg')
-rw-r--r--config/nim.cfg289
1 files changed, 200 insertions, 89 deletions
diff --git a/config/nim.cfg b/config/nim.cfg
index e11826587..7c9958139 100644
--- a/config/nim.cfg
+++ b/config/nim.cfg
@@ -2,6 +2,7 @@
 # (c) 2017 Andreas Rumpf
 
 # Feel free to edit the default values as you need.
+# See https://nim-lang.org/docs/nimc.html
 
 # You may set environment variables with
 # @putenv "key" "val"
@@ -13,17 +14,32 @@ cc = gcc
 # additional options always passed to the compiler:
 --parallel_build: "0" # 0 to auto-detect number of processors
 
-hint[LineTooLong]=off
+@if not nimHasNolineTooLong:
+  hint[LineTooLong]=off
+@end
+
 #hint[XDeclaredButNotUsed]=off
 
+threads:on
+
 # Examples of how to setup a cross-compiler:
+# Nim can target architectures and OSes different than the local host
+# Syntax: <arch>.<os>.gcc.exe = "<compiler executable>"
+#         <arch>.<os>.gcc.linkerexe = "<linker executable>"
 
-# Cross-compiling for Raspberry Pi.
-# (This compiler is available in gcc-arm-linux-gnueabihf package on Ubuntu)
+# ARM e.g. Raspberry Pi 2: gcc-arm-linux-gnueabihf package on Debian/Ubuntu
 arm.linux.gcc.exe = "arm-linux-gnueabihf-gcc"
 arm.linux.gcc.linkerexe = "arm-linux-gnueabihf-gcc"
+# ARM64/aarch64 e.g. Raspberry Pi 3: gcc-aarch64-linux-gnu package on Debian/Ubuntu
+arm64.linux.gcc.exe = "aarch64-linux-gnu-gcc"
+arm64.linux.gcc.linkerexe = "aarch64-linux-gnu-gcc"
+# RISC-V: gcc-riscv64-linux-gnu package on Debian/Ubuntu
+riscv32.linux.gcc.exe = "riscv64-linux-gnu-gcc"
+riscv32.linux.gcc.linkerexe = "riscv64-linux-gnu-gcc"
+riscv64.linux.gcc.exe = "riscv64-linux-gnu-gcc"
+riscv64.linux.gcc.linkerexe = "riscv64-linux-gnu-gcc"
 
-# For OpenWRT, you will also need to adjust PATH to point to your toolchain. 
+# For OpenWRT, you will also need to adjust PATH to point to your toolchain.
 mips.linux.gcc.exe = "mips-openwrt-linux-gcc"
 mips.linux.gcc.linkerexe = "mips-openwrt-linux-gcc"
 
@@ -43,16 +59,17 @@ path="$lib/arch"
 path="$lib/core"
 path="$lib/pure"
 
-@if nimbabel:
-  nimblepath="$home/.nimble/pkgs/"
-  @if not windows:
-    nimblepath="/opt/nimble/pkgs/"
-  @else:
-    # TODO:
-  @end
+@if not windows:
+  nimblepath="/opt/nimble/pkgs2/"
+  nimblepath="/opt/nimble/pkgs/"
+@else:
+  # TODO:
 @end
+nimblepath="$home/.nimble/pkgs2/"
+nimblepath="$home/.nimble/pkgs/"
 
-@if release or quick:
+# Syncronize with compiler/commands.specialDefine
+@if danger or quick:
   obj_checks:off
   field_checks:off
   range_checks:off
@@ -63,18 +80,66 @@ path="$lib/pure"
   linetrace:off
   debugger:off
   line_dir:off
-  dead_code_elim:on
-  @if nimHasNilChecks:
-    nilchecks:off
-  @end
 @end
 
-@if release:
+# Syncronize with compiler/commands.specialDefine
+@if release or danger:
+  stacktrace:off
+  excessiveStackTrace:off
+  linetrace:off
+  debugger:off
+  line_dir:off
   opt:speed
+  define:release
+@end
+
+@if false: # not danger: # this does not work yet.
+  clang.options.always %= "${clang.options.always} -fsanitize=null -fsanitize-undefined-trap-on-error"
+  gcc.options.always %= "${gcc.options.always} -fsanitize=null -fsanitize-undefined-trap-on-error"
+@end
+
+# Turn off threads support when compiling for bare-metal targets (--os:any)
+@if any:
+  threads:off
+@end
+
+@if unix and mingw:
+  # Cross compile for Windows from Linux/OSX using MinGW
+  i386.windows.gcc.exe = "i686-w64-mingw32-gcc"
+  i386.windows.gcc.linkerexe = "i686-w64-mingw32-gcc"
+  i386.windows.gcc.cpp.exe = "i686-w64-mingw32-g++"
+  i386.windows.gcc.cpp.linkerexe = "i686-w64-mingw32-g++"
+
+  amd64.windows.gcc.exe = "x86_64-w64-mingw32-gcc"
+  amd64.windows.gcc.linkerexe = "x86_64-w64-mingw32-gcc"
+  amd64.windows.gcc.cpp.exe = "x86_64-w64-mingw32-g++"
+  amd64.windows.gcc.cpp.linkerexe = "x86_64-w64-mingw32-g++"
+
+  @if macosx:
+    i386.windows.gcc.path = "/usr/local/bin"
+    amd64.windows.gcc.path = "/usr/local/bin"
+  @else:
+    i386.windows.gcc.path = "/usr/bin"
+    amd64.windows.gcc.path = "/usr/bin"
+  @end
+
+  os = windows
+
+  gcc.options.linker = ""
+  gcc.cpp.options.linker = ""
 @end
 
 @if unix:
-  @if not bsd or haiku:
+  @if bsd:
+    # BSD got posix_spawn only recently, so we deactivate it for osproc:
+    define:useFork
+  @elif haiku:
+    gcc.options.linker = "-Wl,--as-needed -lnetwork"
+    gcc.cpp.options.linker = "-Wl,--as-needed -lnetwork"
+    clang.options.linker = "-Wl,--as-needed -lnetwork"
+    clang.cpp.options.linker = "-Wl,--as-needed -lnetwork"
+    tcc.options.linker = "-Wl,--as-needed -lnetwork"
+  @elif not genode:
     # -fopenmp
     gcc.options.linker = "-ldl"
     gcc.cpp.options.linker = "-ldl"
@@ -82,20 +147,6 @@ path="$lib/pure"
     clang.cpp.options.linker = "-ldl"
     tcc.options.linker = "-ldl"
   @end
-  @if bsd or haiku:
-    # BSD got posix_spawn only recently, so we deactivate it for osproc:
-    define:useFork
-    # at least NetBSD has problems with thread local storage:
-    tlsEmulation:on
-  @end
-  @if haiku:
-    # -fopenmp
-    gcc.options.linker = "-lroot -lnetwork"
-    gcc.cpp.options.linker = "-lroot -lnetwork"
-    clang.options.linker = "-lroot -lnetwork"
-    clang.cpp.options.linker = "-lroot -lnetwork"
-    tcc.options.linker = "-lroot -lnetwork"
-  @end
 @end
 
 @if android:
@@ -109,6 +160,14 @@ path="$lib/pure"
   @end
 @end
 
+@if nintendoswitch:
+  cc = "switch_gcc"
+  switch_gcc.options.linker = "-g -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE"
+  switch_gcc.cpp.options.linker = "-g -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE"
+  switch_gcc.options.always = "-g -Wall -O2 -ffunction-sections -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE -D__SWITCH__"
+  switch_gcc.cpp.options.always = "-g -Wall -O2 -ffunction-sections -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE -D__SWITCH__ -fno-rtti -fno-exceptions -std=gnu++11"
+@end
+
 # Configuration for the Intel C/C++ compiler:
 @if windows:
   icl.options.speed = "/Ox /arch:SSE2"
@@ -118,22 +177,32 @@ path="$lib/pure"
 # Configuration for the GNU C/C++ compiler:
 @if windows:
   #gcc.path = r"$nim\dist\mingw\bin"
-  @if gcc or tcc:
+  @if gcc:
+    gcc.options.linker %= "-Wl,-Bstatic -lpthread"
+  @end
+  @if tcc:
     tlsEmulation:on
   @end
 @end
 
-@if macosx or freebsd:
-  cc = clang
+gcc.maxerrorsimpl = "-fmax-errors=3"
+
+@if freebsd or netbsd:
+  tlsEmulation:off
+@elif bsd:
   tlsEmulation:on
-  gcc.options.always = "-w"
-  gcc.cpp.options.always = "-w -fpermissive"
+@end
+
+@if macosx or freebsd or openbsd:
+  cc = clang
+  gcc.options.always %= "-w ${gcc.maxerrorsimpl}"
+  gcc.cpp.options.always %= "-w ${gcc.maxerrorsimpl} -fpermissive"
 @elif windows:
-  gcc.options.always = "-w -mno-ms-bitfields"
-  gcc.cpp.options.always = "-w -fpermissive -mno-ms-bitfields"
+  gcc.options.always %= "-w ${gcc.maxerrorsimpl} -mno-ms-bitfields"
+  gcc.cpp.options.always %= "-w ${gcc.maxerrorsimpl} -fpermissive -mno-ms-bitfields"
 @else:
-  gcc.options.always = "-w"
-  gcc.cpp.options.always = "-w -fpermissive"
+  gcc.options.always %= "-w ${gcc.maxerrorsimpl}"
+  gcc.cpp.options.always %= "-w ${gcc.maxerrorsimpl} -fpermissive"
 @end
 
 # Configuration for Objective-C compiler:
@@ -161,6 +230,17 @@ clang.objc.options.linker = "-lobjc -lgnustep-base"
   llvm_gcc.cpp.options.linker = "-Wl,-rpath=.:/usr/local/lib:/usr/pkg/lib:/usr/X11R6/lib"
   clang.options.linker = "-Wl,-rpath=.:/usr/local/lib:/usr/pkg/lib:/usr/X11R6/lib"
   clang.cpp.options.linker = "-Wl,-rpath=.:/usr/local/lib:/usr/pkg/lib:/usr/X11R6/lib"
+
+  cincludes: "/usr/local/include"
+  clibdir: "/usr/local/lib"
+@end
+
+@if freebsd or openbsd:
+  cincludes: "/usr/local/include"
+  clibdir: "/usr/local/lib"
+@elif netbsd:
+  cincludes: "/usr/pkg/include"
+  clibdir: "/usr/pkg/lib"
 @end
 
 # Configuration for the VxWorks
@@ -177,16 +257,19 @@ clang.objc.options.linker = "-lobjc -lgnustep-base"
   gcc.options.linker %= "-L $WIND_BASE/target/lib/usr/lib/ppc/PPC32/common -mrtp -fno-strict-aliasing -D_C99 -D_HAS_C9X -std=c99 -fasm -Wall -Wno-write-strings"
 @end
 
-gcc.options.speed = "-O3 -fno-strict-aliasing"
-gcc.options.size = "-Os"
+# -fno-math-errno is default in OSX, iOS, BSD, Musl, Libm, LLVM, Clang, ICC.
+# See https://itnext.io/why-standard-c-math-functions-are-slow-d10d02554e33
+# and https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Optimize-Options.html#Optimize-Options
+gcc.options.speed = "-O3 -fno-strict-aliasing -fno-ident -fno-math-errno"
+gcc.options.size = "-Os -fno-ident"
 @if windows:
-  gcc.options.debug = "-g3 -O0 -gdwarf-3"
+  gcc.options.debug = "-g3 -Og -gdwarf-3"
 @else:
-  gcc.options.debug = "-g3 -O0"
+  gcc.options.debug = "-g3 -Og"
 @end
-gcc.cpp.options.speed = "-O3 -fno-strict-aliasing"
-gcc.cpp.options.size = "-Os"
-gcc.cpp.options.debug = "-g3 -O0"
+gcc.cpp.options.speed = "-O3 -fno-strict-aliasing -fno-ident -fno-math-errno"
+gcc.cpp.options.size = "-Os -fno-ident"
+gcc.cpp.options.debug = "-g3 -Og"
 #passl = "-pg"
 
 # Configuration for the LLVM GCC compiler:
@@ -197,57 +280,85 @@ llvm_gcc.options.size = "-Os"
 
 # Configuration for the LLVM CLang compiler:
 clang.options.debug = "-g"
-clang.options.always = "-w"
+clang.cpp.options.debug = "-g"
+clang.options.always = "-w -ferror-limit=3"
 clang.options.speed = "-O3"
 clang.options.size = "-Os"
 
+@if windows:
+  clang_cl.cpp.options.always %= "${clang_cl.options.always} /EHsc"
+  @if not release and not safety and not danger:
+    clang_cl.options.linker = "/Z7"
+    clang_cl.cpp.options.linker = "/Z7"
+  @end
+  clang.options.debug = "-g -gcodeview"
+  clang.cpp.options.debug = "-g -gcodeview"
+  @if not release and not safety and not danger:
+    clang.options.linker = "-g"
+    clang.cpp.options.linker = "-g"
+  @end
+@end
+
 # Configuration for the Visual C/C++ compiler:
-vcc.exe =     "vccexe.exe"
+# VCCEXE is a tool that invokes the Visual Studio Developer Command Prompt
+# before calling the compiler.
+# Please make sure either Visual Studio or C++ Build SKU is installed when using the vcc compiler backend.
+
+vcc.exe = "vccexe.exe"
 vcc.cpp.exe = "vccexe.exe"
-vcc.linkerexe =     "vccexe.exe"
+vcc.linkerexe = "vccexe.exe"
 vcc.cpp.linkerexe = "vccexe.exe"
 
-# set the options for specific platforms:
-vcc.options.always =      "/nologo"
-@if release:
-  # no debug symbols in release builds
-@else:
-  vcc.options.always %= "${vcc.options.always} /Z7" # Get VCC to output full debug symbols in the obj file
-@end
-vcc.cpp.options.always %=  "${vcc.options.always} /EHsc"
-vcc.options.linker =      "/nologo /DEBUG /Zi /F33554432" # set the stack size to 32 MiB
-vcc.cpp.options.linker %=  "${vcc.options.linker}"
-@if i386:
-vcc.options.always %=      "--platform:x86 ${vcc.options.always}"
-vcc.cpp.options.always %=  "--platform:x86 ${vcc.cpp.options.always}"
-vcc.options.linker %=      "--platform:x86 ${vcc.options.linker}"
-vcc.cpp.options.linker %=  "--platform:x86 ${vcc.cpp.options.linker}"
-@elif amd64:
-vcc.options.always %=      "--platform:amd64 ${vcc.options.always}"
-vcc.cpp.options.always %=  "--platform:amd64 ${vcc.cpp.options.always}"
-vcc.options.linker %=      "--platform:amd64 ${vcc.options.linker}"
-vcc.cpp.options.linker %=  "--platform:amd64 ${vcc.cpp.options.linker}"
-@elif arm:
-vcc.options.always %=      "--platform:arm ${vcc.options.always}"
-vcc.cpp.options.always %=  "--platform:arm ${vcc.cpp.options.always}"
-vcc.options.linker %=      "--platform:arm ${vcc.options.linker}"
-vcc.cpp.options.linker %=  "--platform:arm ${vcc.cpp.options.linker}"
-@end
-
-vcc.options.debug =     "/Od"
-vcc.cpp.options.debug = "/Od"
-vcc.options.speed =     "/O2"
+vcc.options.always =  "/nologo"
+vcc.cpp.options.always = "/nologo /EHsc"
+vcc.options.debug = "/Zi /FS /Od"
+vcc.cpp.options.debug = "/Zi /FS /Od"
+vcc.options.speed = "/O2"
 vcc.cpp.options.speed = "/O2"
-vcc.options.size =     "/O1"
+vcc.options.size = "/O1"
 vcc.cpp.options.size = "/O1"
 
 # Configuration for the Tiny C Compiler:
 tcc.options.always = "-w"
 
-# Configuration for the Genode toolchain
-amd64.genode.gcc.cpp.exe = "genode-x86-g++"
-amd64.genode.gcc.exe = "genode-x86-gcc"
-amd64.genode.gcc.path = "/usr/local/genode-gcc/bin"
-arm.genode.gcc.cpp.exe = "genode-arm-g++"
-arm.genode.gcc.exe = "genode-arm-gcc"
-arm.genode.gcc.path = "/usr/local/genode-gcc/bin"
+@if arm or arm64:
+  --define:nimEmulateOverflowChecks
+@end
+
+@if lto or lto_incremental:
+  @if lto_incremental:
+   vcc.options.always%= "${vcc.options.always} /GL /Gw /Gy"
+   vcc.cpp.options.always%= "${vcc.cpp.options.always} /GL /Gw /Gy"
+   vcc.options.linker %= "${vcc.options.linker} /link /LTCG:incremental"
+   vcc.cpp.options.linker %= "${vcc.cpp.options.linker} /link /LTCG:incremental"
+   clang_cl.options.always%= "${clang_cl.options.always} -flto=thin"
+   clang_cl.cpp.options.always%= "${clang.cpp.options.always} -flto=thin"
+   clang.options.always%= "${clang.options.always} -flto=thin"
+   clang.cpp.options.always%= "${clang.cpp.options.always} -flto=thin"
+   clang.options.linker %= "${clang.options.linker} -flto=thin"
+   clang.cpp.options.linker %= "${clang.cpp.options.linker} -flto=thin"
+  @else:
+   vcc.options.always%= "${vcc.options.always} /GL"
+   vcc.cpp.options.always%= "${vcc.cpp.options.always} /GL"
+   vcc.options.linker %= "${vcc.options.linker} /link /LTCG"
+   vcc.cpp.options.linker %= "${vcc.cpp.options.linker} /link /LTCG"
+   clang_cl.options.always%= "${clang_cl.options.always} -flto"
+   clang_cl.cpp.options.always%= "${clang.cpp.options.always} -flto"
+   clang.options.always%= "${clang.options.always} -flto"
+   clang.cpp.options.always%= "${clang.cpp.options.always} -flto"
+   clang.options.linker %= "${clang.options.linker} -flto"
+   clang.cpp.options.linker %= "${clang.cpp.options.linker} -flto"
+  @end
+  icl.options.always %= "${icl.options.always} /Qipo"
+  icl.cpp.options.always %= "${icl.cpp.options.always} /Qipo"
+  gcc.options.always %= "${gcc.options.always} -flto=auto"
+  gcc.cpp.options.always %= "${gcc.cpp.options.always} -flto=auto"
+  gcc.options.linker %= "${gcc.options.linker} -flto=auto -Wno-stringop-overflow"  # https://github.com/nim-lang/Nim/issues/21595
+  gcc.cpp.options.linker %= "${gcc.cpp.options.linker} -flto=auto"
+@end
+@if strip:
+  gcc.options.linker %= "${gcc.options.linker} -s"
+  gcc.cpp.options.linker %= "${gcc.cpp.options.linker} -s"
+  clang.options.linker %= "${clang.options.linker} -s"
+  clang.cpp.options.linker %= "${clang.cpp.options.linker} -s"
+@end