mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
358 lines
12 KiB
Nim
358 lines
12 KiB
Nim
# Configuration file for the Nim Compiler.
|
|
# (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"
|
|
# Environment variables can be accessed like so:
|
|
# gcc.path %= "$CC_PATH"
|
|
|
|
cc = gcc
|
|
|
|
# additional options always passed to the compiler:
|
|
--parallel_build: "0" # 0 to auto-detect number of processors
|
|
|
|
hint[LineTooLong]=off
|
|
@if nimHasAmbiguousEnumHint:
|
|
# not needed if hint is a style check
|
|
hint[AmbiguousEnum]=off
|
|
@end
|
|
#hint[XDeclaredButNotUsed]=off
|
|
|
|
threads:on
|
|
define:nimPreviewRangeDefault
|
|
|
|
# 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>"
|
|
|
|
# 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.
|
|
mips.linux.gcc.exe = "mips-openwrt-linux-gcc"
|
|
mips.linux.gcc.linkerexe = "mips-openwrt-linux-gcc"
|
|
|
|
|
|
path="$lib/deprecated/core"
|
|
path="$lib/deprecated/pure"
|
|
path="$lib/pure/collections"
|
|
path="$lib/pure/concurrency"
|
|
path="$lib/impure"
|
|
path="$lib/wrappers"
|
|
path="$lib/wrappers/linenoise"
|
|
path="$lib/windows"
|
|
path="$lib/posix"
|
|
path="$lib/js"
|
|
path="$lib/pure/unidecode"
|
|
path="$lib/arch"
|
|
path="$lib/core"
|
|
path="$lib/pure"
|
|
|
|
@if not windows:
|
|
nimblepath="/opt/nimble/pkgs2/"
|
|
nimblepath="/opt/nimble/pkgs/"
|
|
@else:
|
|
# TODO:
|
|
@end
|
|
nimblepath="$home/.nimble/pkgs2/"
|
|
nimblepath="$home/.nimble/pkgs/"
|
|
|
|
# Syncronize with compiler/commands.specialDefine
|
|
@if danger or quick:
|
|
obj_checks:off
|
|
field_checks:off
|
|
range_checks:off
|
|
bound_checks:off
|
|
overflow_checks:off
|
|
assertions:off
|
|
stacktrace:off
|
|
linetrace:off
|
|
debugger:off
|
|
line_dir:off
|
|
@end
|
|
|
|
# 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 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"
|
|
clang.options.linker = "-ldl"
|
|
clang.cpp.options.linker = "-ldl"
|
|
tcc.options.linker = "-ldl"
|
|
@end
|
|
@end
|
|
|
|
@if android:
|
|
cc = clang
|
|
@if termux:
|
|
gcc.options.linker = "-landroid-glob"
|
|
gcc.cpp.options.linker = "-landroid-glob"
|
|
clang.options.linker = "-landroid-glob"
|
|
clang.cpp.options.linker = "-landroid-glob"
|
|
tcc.options.linker = "-landroid-glob"
|
|
@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"
|
|
icl.options.always = "/nologo"
|
|
@end
|
|
|
|
# Configuration for the GNU C/C++ compiler:
|
|
@if windows:
|
|
#gcc.path = r"$nim\dist\mingw\bin"
|
|
@if gcc or tcc:
|
|
tlsEmulation:on
|
|
@end
|
|
@end
|
|
|
|
gcc.maxerrorsimpl = "-fmax-errors=3"
|
|
|
|
@if freebsd or netbsd:
|
|
tlsEmulation:off
|
|
@elif bsd:
|
|
tlsEmulation:on
|
|
@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 ${gcc.maxerrorsimpl} -mno-ms-bitfields"
|
|
gcc.cpp.options.always %= "-w ${gcc.maxerrorsimpl} -fpermissive -mno-ms-bitfields"
|
|
@else:
|
|
gcc.options.always %= "-w ${gcc.maxerrorsimpl}"
|
|
gcc.cpp.options.always %= "-w ${gcc.maxerrorsimpl} -fpermissive"
|
|
@end
|
|
|
|
# Configuration for Objective-C compiler:
|
|
#
|
|
# Options for GNUStep. GNUStep configuration varies wildly, so you'll probably
|
|
# have to add additional compiler and linker flags on a per-project basis.
|
|
gcc.objc.options.linker = "-lobjc -lgnustep-base"
|
|
llvm_gcc.objc.options.linker = "-lobjc -lgnustep-base"
|
|
clang.objc.options.linker = "-lobjc -lgnustep-base"
|
|
|
|
# Options for Mac OS X. Mac OS X uses its own Objective-C stack that is
|
|
# totally different from GNUStep.
|
|
@if macosx:
|
|
gcc.objc.options.linker = "-framework Foundation"
|
|
llvm_gcc.objc.options.linker = "-framework Foundation"
|
|
clang.objc.options.linker = "-framework Foundation"
|
|
@end
|
|
|
|
# Options for FreeBSD, OpenBSD, NetBSD linker to add locations for searching
|
|
# shared libraries.
|
|
@if freebsd or openbsd or netbsd:
|
|
gcc.options.linker = "-Wl,-rpath=.:/usr/local/lib:/usr/pkg/lib:/usr/X11R6/lib"
|
|
gcc.cpp.options.linker = "-Wl,-rpath=.:/usr/local/lib:/usr/pkg/lib:/usr/X11R6/lib"
|
|
llvm_gcc.options.linker = "-Wl,-rpath=.:/usr/local/lib:/usr/pkg/lib:/usr/X11R6/lib"
|
|
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
|
|
# This has been tested with VxWorks 6.9 only
|
|
@if vxworks:
|
|
# For now we only support compiling RTPs applications (i.e. no DKMs)
|
|
gcc.options.always = "-mrtp -fno-strict-aliasing -D_C99 -D_HAS_C9X -std=c99 -fasm -Wall -Wno-write-strings"
|
|
# The linker config must add the VxWorks common library for the selected
|
|
# processor which is usually found in:
|
|
# "$WIND_BASE/target/lib/usr/lib/PROCESSOR_FAMILY/PROCESSOR_TYPE/common",
|
|
# where PROCESSOR_FAMILY and PROCESSOR_TYPE are those supported by the VxWorks
|
|
# compiler (e.g. ppc/PPC32 or mips/MIPSI64, etc)
|
|
# For now we only support the PowerPC CPU
|
|
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
|
|
|
|
# -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 -Og -gdwarf-3"
|
|
@else:
|
|
gcc.options.debug = "-g3 -Og"
|
|
@end
|
|
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:
|
|
llvm_gcc.options.debug = "-g"
|
|
llvm_gcc.options.always = "-w"
|
|
llvm_gcc.options.speed = "-O2"
|
|
llvm_gcc.options.size = "-Os"
|
|
|
|
# Configuration for the LLVM CLang compiler:
|
|
clang.options.debug = "-g"
|
|
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:
|
|
# 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.cpp.linkerexe = "vccexe.exe"
|
|
|
|
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.cpp.options.size = "/O1"
|
|
|
|
# Configuration for the Tiny C Compiler:
|
|
tcc.options.always = "-w"
|
|
|
|
@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"
|
|
@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"
|
|
@end
|
|
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"
|
|
icl.options.always %= "${icl.options.always} /Qipo"
|
|
icl.cpp.options.always %= "${icl.cpp.options.always} /Qipo"
|
|
gcc.options.always %= "${gcc.options.always} -flto"
|
|
gcc.cpp.options.always %= "${gcc.cpp.options.always} -flto"
|
|
clang.options.linker %= "${clang.options.linker} -fuse-ld=lld -flto"
|
|
clang.cpp.options.linker %= "${clang.cpp.options.linker} -fuse-ld=lld -flto"
|
|
gcc.options.linker %= "${gcc.options.linker} -flto"
|
|
gcc.cpp.options.linker %= "${gcc.cpp.options.linker} -flto"
|
|
@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
|