Red Bear OS — microkernel OS in Rust, based on Redox
Derivative of Redox OS (https://www.redox-os.org) adding: - AMD GPU driver (amdgpu) via LinuxKPI compat layer - ext4 filesystem support (ext4d scheme daemon) - ACPI fixes for AMD bare metal (x2APIC, DMAR, IVRS, MCFG) - Custom branding (hostname, os-release, boot identity) Build system is full upstream Redox with RBOS overlay in local/. Patches for kernel, base, and relibc are symlinked from local/patches/ and protected from make clean/distclean. Custom recipes live in local/recipes/ with symlinks into the recipes/ search path. Build: make all CONFIG_NAME=redbear-full Sync: ./local/scripts/sync-upstream.sh
This commit is contained in:
@@ -0,0 +1,351 @@
|
||||
# Toolchain detection
|
||||
|
||||
tryprog() {
|
||||
log "trying $1=$2"
|
||||
if command -v $2 1>/dev/null 2>/dev/null; then
|
||||
define "$1" "$2"
|
||||
result "$2"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
tryfromenv() {
|
||||
if [ "$mode" = "buildmini" ]; then
|
||||
getenv ev "HOST$2"
|
||||
else
|
||||
getenv ev "$2"
|
||||
fi
|
||||
|
||||
if [ -n "$ev" ]; then
|
||||
tryprog $1 "$ev" && return 0
|
||||
die "Supplied $ev is not usable"
|
||||
fi
|
||||
|
||||
unset ev
|
||||
return 1
|
||||
}
|
||||
|
||||
# This is only a function for easy access to return-s
|
||||
# try.out contains `$cc --version` output.
|
||||
#
|
||||
# Figuring out gcc is necessary to make sure -fwrapv fix gets applied.
|
||||
|
||||
detect_cc_version() {
|
||||
_v=`sed -ne '/^gcc version \([0-9][0-9.]*\).*/s//\1/p' try.out`
|
||||
|
||||
if [ -n "$_v" ]; then
|
||||
define cctype 'gcc'
|
||||
define ccversion "$_v"
|
||||
define gccversion "$_v"
|
||||
result "gcc $_v"
|
||||
return
|
||||
fi
|
||||
|
||||
_v=`sed -ne '/^clang version \([0-9][0-9.]*\).*/s//\1/p' try.out`
|
||||
|
||||
if [ -n "$_v" ]; then
|
||||
define cctype 'clang'
|
||||
define ccversion "$_v"
|
||||
define gccversion "0.0"
|
||||
result "clang $_v"
|
||||
return
|
||||
fi
|
||||
|
||||
define cctype 'cc'
|
||||
define ccversion ''
|
||||
define gccversion '0.0'
|
||||
result 'unknown'
|
||||
}
|
||||
|
||||
# whichprog symbol VAR prog1 prog2
|
||||
whichprog() {
|
||||
mstart "Checking for $1"
|
||||
hinted "$1" && return 0
|
||||
|
||||
# Maybe we've got $CC or $HOSTCC?
|
||||
tryfromenv "$1" "$2" && return 0
|
||||
|
||||
# For anything that sounds like a native compilation,
|
||||
# try no-prefix tools *first*. This is to avoid using
|
||||
# long names is case the host happens to have them.
|
||||
if [ "$mode" = 'native' -o "$mode" = 'buildmini' ]; then
|
||||
tryprog $1 "$3" && return 0
|
||||
fi
|
||||
|
||||
# Finally, try $target-gcc
|
||||
test -n "$toolsprefix" && tryprog $1 "$toolsprefix$3" && return 0
|
||||
test -n "$target" && tryprog $1 "$target-$3" && return 0
|
||||
test -n "$targetarch" && tryprog $1 "$targetarch-$3" && return 0
|
||||
|
||||
result "none found"
|
||||
return 1
|
||||
}
|
||||
|
||||
whichprog cc CC gcc || whichprog cc CC cc || die "No C compiler found"
|
||||
#whichprog ld LD ld # while correct, this breaks MM library test
|
||||
whichprog ar AR ar || die "Cannot find ar"
|
||||
whichprog nm NM nm
|
||||
whichprog ranlib RANLIB ranlib
|
||||
whichprog readelf READELF readelf || die "Cannot find readelf"
|
||||
whichprog objdump OBJDUMP objdump || die "Cannot find objdump"
|
||||
|
||||
# XXX: this looks wrong, but the usemmldlt code depends on $ld being able
|
||||
# to compile try.c. What kind of moron could have written that. Oh wait.
|
||||
#
|
||||
# But, there was probably a reason to assume this, likely becase mainline
|
||||
# Configure did and still does the same. So, ugh, leaving it as is for now.
|
||||
# Speak of backward bug compatibility.
|
||||
define ld "$cc"
|
||||
|
||||
log
|
||||
|
||||
mstart "Trying $cc"
|
||||
if not hinted 'cctype'; then
|
||||
run $cc -v >try.out 2>&1
|
||||
try_dump_out
|
||||
detect_cc_version
|
||||
fi
|
||||
|
||||
mstart "Checking whether $cc is a C++ compiler"
|
||||
if not hinted 'd_cplusplus'; then
|
||||
try_start
|
||||
try_cat <<END
|
||||
#if defined(__cplusplus)
|
||||
YES
|
||||
#endif
|
||||
END
|
||||
try_dump
|
||||
if not run $cc $ccflags -E try.c > try.out 2>>$cfglog; then
|
||||
define d_cplusplus 'undef'
|
||||
result "probably no"
|
||||
else
|
||||
_r=`grep -v '^#' try.out | grep . | head -1 | grep '^YES'`
|
||||
if [ -n "$_r" ]; then
|
||||
define d_cplusplus 'define'
|
||||
result "yes"
|
||||
else
|
||||
define d_cplusplus 'undef'
|
||||
result 'no'
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
mstart "Deciding how to declare external symbols"
|
||||
if not hinted "extern_C"; then
|
||||
case "$d_cplusplus" in
|
||||
define)
|
||||
define "extern_C" 'extern "C"'
|
||||
result "$extern_C"
|
||||
;;
|
||||
*)
|
||||
define "extern_C" 'extern'
|
||||
result "$extern_C"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# File name extensions, must be set before running any compile/link tests
|
||||
define _o '.o'
|
||||
define _a '.a'
|
||||
define so 'so'
|
||||
define _exe ''
|
||||
|
||||
# Used only for modules
|
||||
define cccdlflags '-fPIC -Wno-unused-function'
|
||||
define ccdlflags '-Wl,-E'
|
||||
|
||||
# Misc flags setup
|
||||
predef lddlflags "-shared" # modules
|
||||
predef ccflags '' # perl and modules
|
||||
predef ldflags '' # perl only?
|
||||
predef cppflags '' # unused?
|
||||
|
||||
# setfromvar what SHELLVAR
|
||||
setfromenv() {
|
||||
getenv v "$2"
|
||||
test -n "$v" && append "$1" "$v"
|
||||
}
|
||||
|
||||
if [ "$mode" = 'target' -o "$mode" = 'native' ]; then
|
||||
setfromenv ccflags CFLAGS
|
||||
setfromenv ldflags LDFLAGS
|
||||
if [ -n "$sysroot" ]; then
|
||||
msg "Adding --sysroot to {cc,ld}flags"
|
||||
prepend ccflags "--sysroot=$sysroot"
|
||||
prepend ldflags "--sysroot=$sysroot"
|
||||
# While cccdlflags are used together with ccflags,
|
||||
# ld is always called with lddlflags *instead*of* ldflags
|
||||
prepend lddlflags "--sysroot=$sysroot"
|
||||
# Same for cpp
|
||||
prepend cppflags "--sysroot=$sysroot"
|
||||
fi
|
||||
elif [ "$mode" = 'buildmini' ]; then
|
||||
setfromenv ccflags HOSTCFLAGS
|
||||
setfromenv ldflags HOSTLDFLAGS
|
||||
fi
|
||||
|
||||
# Use $ldflags as default value for $lddlflags, together with whatever
|
||||
# hints provided, but avoid re-setting anyting specified in the command line
|
||||
if [ -n "$ldflags" -a "$x_lddlflags" != "user" ]; then
|
||||
append lddlflags "$ldflags"
|
||||
fi
|
||||
|
||||
# enddef ccflags # done later in _hdrs because of LARGEFILE_SOURCE
|
||||
enddef ldflags
|
||||
enddef lddlflags
|
||||
enddef cppflags
|
||||
|
||||
mstart "Checking whether ld supports scripts"
|
||||
if not hinted 'ld_can_script'; then
|
||||
cat > try.c <<EOM
|
||||
void foo() {}
|
||||
void bar() {}
|
||||
EOM
|
||||
cat > try.h <<EOM
|
||||
LIBTEST_42 {
|
||||
global:
|
||||
foo;
|
||||
local: *;
|
||||
};
|
||||
EOM
|
||||
log "try.c"
|
||||
try_dump
|
||||
log "try.h"
|
||||
try_dump_h
|
||||
rm -f a.out 2>/dev/null
|
||||
|
||||
if run $cc $cccdlflags $ccdlflags $ccflags $lddlflags -o a.out try.c \
|
||||
-Wl,--version-script=try.h >/dev/null 2>&1 \
|
||||
&& test -s a.out
|
||||
then
|
||||
define ld_can_script 'define'
|
||||
result "yes"
|
||||
else
|
||||
define ld_can_script 'undef'
|
||||
result "no"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Guessing OS is better done with the toolchain available.
|
||||
# CC output is crucial here -- Android toolchains come with
|
||||
# generic armeabi prefix and "android" is one of the few osname
|
||||
# values that make difference later.
|
||||
|
||||
mstart "Trying to guess target OS"
|
||||
if not hinted 'osname'; then
|
||||
run $cc -v > try.out 2>&1
|
||||
try_dump_out
|
||||
|
||||
_ct=`sed -ne '/^Target: /s///p' try.out`
|
||||
test -z "$_ct" && _ct="$targetarch"
|
||||
|
||||
case "$_ct" in
|
||||
*-mingw32)
|
||||
define osname "MSWin32"
|
||||
result "MSWin32"
|
||||
;;
|
||||
*-android|*-androideabi)
|
||||
define osname "android"
|
||||
result "Android"
|
||||
;;
|
||||
*-linux*)
|
||||
define osname "linux"
|
||||
result "Linux"
|
||||
;;
|
||||
*-netbsd*)
|
||||
define osname "netbsd"
|
||||
result "NetBSD"
|
||||
;;
|
||||
*-bsd*)
|
||||
define osname "bsd"
|
||||
result "BSD"
|
||||
;;
|
||||
*-gnu*)
|
||||
define osname "gnu"
|
||||
result "GNU"
|
||||
;;
|
||||
*-midipix*)
|
||||
define osname "midipix"
|
||||
result "Midipix"
|
||||
;;
|
||||
*-redox*)
|
||||
define osname "redox"
|
||||
result "Redox"
|
||||
;;
|
||||
*)
|
||||
result "no"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Check whether debugging should be enabled
|
||||
# Allow -DEBUGGING as well (sets EBUGGING=define)
|
||||
case "$DEBUGGING:$EBUGGING" in
|
||||
:*)
|
||||
DEBUGGING=$EBUGGING
|
||||
;;
|
||||
esac
|
||||
|
||||
mstart "Checking whether to enable -g"
|
||||
predef optimize ''
|
||||
case "$DEBUGGING" in
|
||||
both|define)
|
||||
append optimize "-g"
|
||||
result "yes" ;;
|
||||
*)
|
||||
result "no" ;;
|
||||
esac
|
||||
|
||||
mstart "Checking whether to use -DDEBUGGING"
|
||||
case "$DEBUGGING" in
|
||||
both|define)
|
||||
append optimize '-DDEBUGGING'
|
||||
result "yes" ;;
|
||||
*)
|
||||
result "no" ;;
|
||||
esac
|
||||
|
||||
# gcc 4.9 and above does some optimizations that break perl.
|
||||
# see perl ticket 121505.
|
||||
if [ "$cctype" = 'gcc' ]; then
|
||||
case "$ccversion" in
|
||||
1.*|2.*|3.*) ;;
|
||||
4.9*) append 'optimize' '-fwrapv -fno-strict-aliasing' ;;
|
||||
4.*) ;;
|
||||
*) append 'optimize' '-fwrapv -fno-strict-aliasing' ;;
|
||||
esac
|
||||
fi
|
||||
enddef optimize
|
||||
|
||||
# These are kind-of part of toolchain, but we do not test them
|
||||
|
||||
# For newer gcc-s, -E alone is *not* enough! Perl expects cpp not to break
|
||||
# lines, but gcc injects #line directives in-between tokens, subtly breaking
|
||||
# try_preproc and Errno.pm
|
||||
define cpp "$cc -E -P"
|
||||
define cpprun "$cpp"
|
||||
define cppstdin "$cpp"
|
||||
|
||||
define cpplast -
|
||||
define cppminus -
|
||||
define cppsymbols
|
||||
|
||||
define nm_opt
|
||||
define nm_so_opt
|
||||
|
||||
# cperl wants to know this for some reason
|
||||
mstart "Checking whether address sanitizer is enabled"
|
||||
if not hinted sanitize_address 'yes' 'no'; then
|
||||
case "$ccflags" in
|
||||
*-fsanitize=address*|*-faddress-sanitizer*)
|
||||
define sanitize_address 'define'
|
||||
result 'yes'
|
||||
;;
|
||||
*)
|
||||
define sanitize_address 'undef'
|
||||
result 'no'
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
Reference in New Issue
Block a user