mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-12 06:18:51 +00:00
TODO list, copied from the documentation: - [x] compiler/platform.nim Add os/cpu properties. - [x] lib/system.nim Add os/cpu to the documentation for system.hostOS and system.hostCPU. - [x] ~~compiler/options.nim Add special os/cpu property checks in isDefined.~~ seems unnecessary; isn't dont for most CPUs - [x] compiler/installer.ini Add os/cpu to Project.Platforms field. - [x] lib/system/platforms.nim Add os/cpu. - [x] ~~std/private/osseps.nim Add os specializations.~~ - [x] ~~lib/pure/distros.nim Add os, package handler.~~ - [x] ~~tools/niminst/makefile.nimf Add os/cpu compiler/linker flags.~~ already done in https://github.com/nim-lang/Nim/pull/20943 - [x] tools/niminst/buildsh.nimf Add os/cpu compiler/linker flags. For csource: - [x] have compiler/platform.nim updated - [x] have compiler/installer.ini updated - [x] have tools/niminst/buildsh.nimf updated - [x] have tools/niminst/makefile.nimf updated - [ ] be backported to the Nim version used by the csources - [ ] the new csources must be pushed - [ ] the new csources revision must be updated in config/build_config.txt Additionally: - [x] check relation to https://github.com/nim-lang/Nim/pull/20943 Possible future work: - Porting Nim to s390x-specific operating systems, notably z/OS Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
290 lines
6.0 KiB
Plaintext
290 lines
6.0 KiB
Plaintext
#? stdtmpl(subsChar='?') | standard
|
|
#proc generateBuildShellScript(c: ConfigData): string =
|
|
# result = "#!/bin/sh\n# Generated from niminst\n" &
|
|
# "# Template is in tools/niminst/buildsh.nimf\n" &
|
|
# "# To regenerate run ``niminst csource`` or ``koch csource``\n"
|
|
|
|
set -e
|
|
|
|
while :
|
|
do
|
|
case "$1" in
|
|
--os)
|
|
optos=$2
|
|
shift 2
|
|
;;
|
|
--cpu)
|
|
optcpu=$2
|
|
shift 2
|
|
;;
|
|
--osname)
|
|
optosname=$2
|
|
shift 2
|
|
;;
|
|
--parallel)
|
|
parallel=$2
|
|
shift 2
|
|
;;
|
|
--extraBuildArgs)
|
|
extraBuildArgs=" $2"
|
|
shift 2
|
|
;;
|
|
-h | --help)
|
|
echo "Options:"
|
|
echo " --os <OS>"
|
|
echo " --cpu <CPU architecture>"
|
|
echo " --osname <name> Additional OS specification (used for Android)"
|
|
echo " --extraBuildArgs <args> Additional arguments passed to the compiler"
|
|
echo " --parallel <number> Multiprocess build. Requires GNU parallel"
|
|
exit 0
|
|
;;
|
|
--) # End of all options
|
|
shift
|
|
break;
|
|
;;
|
|
-*)
|
|
echo 2>&1 "Error: Unknown option: $1" >&2
|
|
exit 1
|
|
;;
|
|
*) # No more options
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
parallel="${parallel:-0}"
|
|
CC="${CC:-gcc}"
|
|
if [ "$parallel" -gt 1 ]; then
|
|
if ! command -v sem > /dev/null; then
|
|
echo "Error: GNU parallel is required to use --parallel"
|
|
exit 1
|
|
fi
|
|
CC="sem -j $parallel --id $$ ${CC}"
|
|
fi
|
|
COMP_FLAGS="${CPPFLAGS:-} ${CFLAGS:-} ?{c.ccompiler.flags}$extraBuildArgs"
|
|
LINK_FLAGS="${LDFLAGS:-} ?{c.linker.flags}"
|
|
PS4=""
|
|
# add(result, "# platform detection\n")
|
|
ucpu=`uname -m`
|
|
uos=`uname`
|
|
uosname=
|
|
# add(result, "# bin dir detection\n")
|
|
binDir=?{firstBinPath(c).toUnix}
|
|
|
|
if [ -s ../koch.nim ]; then
|
|
binDir="../bin"
|
|
fi
|
|
|
|
if [ ! -d $binDir ]; then
|
|
mkdir $binDir
|
|
fi
|
|
|
|
# add(result, "# override OS, CPU and OS Name with command-line arguments\n")
|
|
if [ -n "$optos" ]; then
|
|
uos="$optos"
|
|
fi
|
|
if [ -n "$optcpu" ]; then
|
|
ucpu="$optcpu"
|
|
fi
|
|
if [ -n "$optcpu" ]; then
|
|
uosname="$optosname"
|
|
fi
|
|
|
|
# add(result, "# convert to lower case:\n")
|
|
ucpu=`echo $ucpu | tr "[:upper:]" "[:lower:]"`
|
|
uos=`echo $uos | tr "[:upper:]" "[:lower:]"`
|
|
uosname=`echo $uosname | tr "[:upper:]" "[:lower:]"`
|
|
|
|
case $uos in
|
|
*linux* )
|
|
myos="linux"
|
|
LINK_FLAGS="$LINK_FLAGS -ldl -lm -lrt"
|
|
;;
|
|
*dragonfly* )
|
|
myos="dragonfly"
|
|
LINK_FLAGS="$LINK_FLAGS -lm"
|
|
;;
|
|
*freebsd* )
|
|
myos="freebsd"
|
|
CC="clang"
|
|
LINK_FLAGS="$LINK_FLAGS -lm"
|
|
;;
|
|
*crossos* )
|
|
myos="crossos"
|
|
CC="clang"
|
|
LINK_FLAGS="$LINK_FLAGS -lm"
|
|
;;
|
|
*openbsd* )
|
|
myos="openbsd"
|
|
CC="clang"
|
|
LINK_FLAGS="$LINK_FLAGS -lm"
|
|
;;
|
|
*netbsd* )
|
|
myos="netbsd"
|
|
LINK_FLAGS="$LINK_FLAGS -lm"
|
|
ucpu=`uname -p`
|
|
;;
|
|
*darwin* )
|
|
myos="macosx"
|
|
CC="clang"
|
|
LINK_FLAGS="$LINK_FLAGS -ldl -lm"
|
|
if [ "$HOSTTYPE" = "x86_64" ] ; then
|
|
ucpu="amd64"
|
|
fi
|
|
;;
|
|
*aix* )
|
|
myos="aix"
|
|
LINK_FLAGS="$LINK_FLAGS -ldl -lm"
|
|
;;
|
|
*solaris* | *sun* )
|
|
myos="solaris"
|
|
LINK_FLAGS="$LINK_FLAGS -ldl -lm -lsocket -lnsl"
|
|
;;
|
|
*SunOS* )
|
|
myos="solaris"
|
|
LINK_FLAGS="$LINK_FLAGS -ldl -lm -lsocket -lnsl"
|
|
isOpenIndiana="yes"
|
|
;;
|
|
*haiku* )
|
|
myos="haiku"
|
|
LINK_FLAGS="$LINK_FLAGS -lroot -lnetwork"
|
|
;;
|
|
*mingw* | *msys* )
|
|
myos="windows"
|
|
;;
|
|
*android* )
|
|
myos="android"
|
|
LINK_FLAGS="$LINK_FLAGS -ldl -lm -lrt"
|
|
LINK_FLAGS="$LINK_FLAGS -landroid-glob"
|
|
;;
|
|
*)
|
|
echo 2>&1 "Error: unknown operating system: $uos"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
case $ucpu in
|
|
*i386* | *i486* | *i586* | *i686* | *bepc* | *i86pc* )
|
|
if [ "$isOpenIndiana" = "yes" ] || [ `uname -o` == "illumos" ] ; then
|
|
mycpu="amd64"
|
|
else
|
|
mycpu="i386"
|
|
fi
|
|
;;
|
|
*amd*64* | *x86-64* | *x86_64* )
|
|
mycpu="amd64" ;;
|
|
*sparc*|*sun* )
|
|
mycpu="sparc"
|
|
if [ "$myos" = "linux" ] ; then
|
|
if [ "$(getconf LONG_BIT)" = "64" ]; then
|
|
mycpu="sparc64"
|
|
elif [ "$(isainfo -b)" = "64" ]; then
|
|
mycpu="sparc64"
|
|
fi
|
|
fi
|
|
;;
|
|
*s390x* )
|
|
mycpu="s390x" ;;
|
|
*ppc64le* )
|
|
mycpu="powerpc64el" ;;
|
|
*ppc64* )
|
|
if [ "$myos" = "linux" ] ; then
|
|
COMP_FLAGS="$COMP_FLAGS -m64"
|
|
LINK_FLAGS="$LINK_FLAGS -m64"
|
|
fi
|
|
mycpu="powerpc64" ;;
|
|
*power*|*ppc* )
|
|
if [ "$myos" = "freebsd" ] ; then
|
|
if [ "$ucpu" != "powerpc" ] ; then
|
|
COMP_FLAGS="$COMP_FLAGS -m64"
|
|
LINK_FLAGS="$LINK_FLAGS -m64"
|
|
fi
|
|
mycpu=`uname -p`
|
|
case $mycpu in
|
|
powerpc64le)
|
|
mycpu="powerpc64el"
|
|
esac
|
|
else
|
|
mycpu="powerpc"
|
|
fi
|
|
;;
|
|
*hppa*)
|
|
mycpu="hppa" ;;
|
|
*ia64*)
|
|
mycpu="ia64" ;;
|
|
*m68k*)
|
|
mycpu="m68k" ;;
|
|
*mips* )
|
|
mycpu="$("$CC" -dumpmachine | sed 's/-.*//')"
|
|
case $mycpu in
|
|
mips|mipsel|mips64|mips64el)
|
|
;;
|
|
*)
|
|
echo 2>&1 "Error: unknown MIPS target: $mycpu"
|
|
exit 1
|
|
esac
|
|
;;
|
|
*alpha* )
|
|
mycpu="alpha" ;;
|
|
*aarch64*|*arm64* )
|
|
mycpu="arm64" ;;
|
|
*arm*|*armv6l*|*armv7l*|*armv8l* )
|
|
mycpu="arm" ;;
|
|
*riscv64|riscv* )
|
|
mycpu="riscv64" ;;
|
|
*e2k* )
|
|
mycpu="e2k" ;;
|
|
*loongarch64* )
|
|
mycpu="loongarch64" ;;
|
|
*)
|
|
echo 2>&1 "Error: unknown processor: $ucpu"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
case $uosname in
|
|
*android* )
|
|
LINK_FLAGS="$LINK_FLAGS -landroid-glob"
|
|
myosname="android"
|
|
myos="android"
|
|
;;
|
|
esac
|
|
|
|
# add(result, "# call the compiler:\n")
|
|
echo \# OS: $myos
|
|
echo \# CPU: $mycpu
|
|
|
|
case $myos in
|
|
# for osA in 1..c.oses.len:
|
|
?{c.oses[osA-1]})
|
|
case $mycpu in
|
|
# for cpuA in 1..c.cpus.len:
|
|
?{c.cpus[cpuA-1]})
|
|
set -x
|
|
# var linkCmd = ""
|
|
# for ff in items(c.cfiles[osA][cpuA]):
|
|
# let f = ff.toUnix
|
|
$CC $COMP_FLAGS -Ic_code -c ?{f} -o ?{changeFileExt(f, "o")}
|
|
# add(linkCmd, " \\\n" & changeFileExt(f, "o"))
|
|
# end for
|
|
if [ "$parallel" -gt 0 ]; then
|
|
sem --wait --id $$
|
|
fi
|
|
$CC -o ?{"$binDir/" & toLowerAscii(c.name)} ?linkCmd $LINK_FLAGS
|
|
;;
|
|
# end for
|
|
*)
|
|
echo 2>&1 "Error: no C code generated for: [$myos: $mycpu]"
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
# end for
|
|
*)
|
|
echo 2>&1 "Error: no C code generated for: [$myos: $mycpu]"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
: SUCCESS
|