Initial commit
This commit is contained in:
commit
7322aaa096
6
.cargo/config
Normal file
6
.cargo/config
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[source.crates-io]
|
||||||
|
replace-with = 'vendored-sources'
|
||||||
|
registry = 'https://example.com'
|
||||||
|
|
||||||
|
[source.vendored-sources]
|
||||||
|
directory = '/home/kcotugno/devel/rust-std-powerpc-unknown-netbsd/rust/vendor'
|
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
*.tgz
|
||||||
|
*.tar.gz
|
||||||
|
tools_built
|
||||||
|
src/
|
||||||
|
rust*/
|
||||||
|
powerpc-unknown-netbsd/
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020 Kevin Cotugno
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
35
README.md
Normal file
35
README.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
A script for building the Rust compiler with the standard library for
|
||||||
|
cross-building for PowerPC NetBSD.
|
||||||
|
|
||||||
|
This script has only been tested on ArchLinux.
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo pacman -S llvm rustup curl
|
||||||
|
```
|
||||||
|
|
||||||
|
# Build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./build.sh build
|
||||||
|
```
|
||||||
|
|
||||||
|
# Install
|
||||||
|
```bash
|
||||||
|
sudo ./build.sh install
|
||||||
|
```
|
||||||
|
|
||||||
|
# Link
|
||||||
|
Link a rustup toolchain for use.
|
||||||
|
```bash
|
||||||
|
./build.sh link
|
||||||
|
```
|
||||||
|
|
||||||
|
To build a cargo project, ensure `.cargo/config` exists with the contents:
|
||||||
|
```toml
|
||||||
|
[target.powerpc-unknown-netbsd]
|
||||||
|
linker = "powerpc--netbsd-gcc"
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run `cargo +powerpc build --target=powerpc-unknown-netbsd`
|
328
build.sh
Executable file
328
build.sh
Executable file
@ -0,0 +1,328 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
nproc=$(($(nproc) * 2))
|
||||||
|
triple="powerpc-unknown-netbsd"
|
||||||
|
rust_version=1.42.0
|
||||||
|
|
||||||
|
netbsd_binary_base_url="http://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/macppc/binary/sets"
|
||||||
|
netbsd_src_base_url="http://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/source/sets"
|
||||||
|
|
||||||
|
working_dir="$PWD"
|
||||||
|
ppc_dir="$working_dir/$triple"
|
||||||
|
sysroot_dir="$ppc_dir/sysroot"
|
||||||
|
src_dir="$working_dir/src"
|
||||||
|
rust_dir="$working_dir/rust"
|
||||||
|
rust_build_dir="$working_dir/rust-build"
|
||||||
|
|
||||||
|
rust_tar="$rust_build_dir/build/dist/rust-$rust_version-x86_64-unknown-linux-gnu.tar.gz"
|
||||||
|
rustc_dir="$working_dir/$(basename "$rust_tar" .tar.gz)"
|
||||||
|
powerpc_std_tar="$rust_build_dir/build/dist/rust-std-$rust_version-$triple.tar.gz"
|
||||||
|
power_std_dir="$working_dir/$(basename "$powerpc_std_tar" .tar.gz)"
|
||||||
|
|
||||||
|
ppc_gcc="powerpc--netbsd-gcc"
|
||||||
|
ppc_gxx="powerpc--netbsd-g++"
|
||||||
|
|
||||||
|
files=(
|
||||||
|
"$netbsd_binary_base_url/base.tgz"
|
||||||
|
"$netbsd_binary_base_url/comp.tgz"
|
||||||
|
"$netbsd_src_base_url/gnusrc.tgz"
|
||||||
|
"$netbsd_src_base_url/sharesrc.tgz"
|
||||||
|
"$netbsd_src_base_url/src.tgz"
|
||||||
|
"$netbsd_src_base_url/syssrc.tgz"
|
||||||
|
)
|
||||||
|
|
||||||
|
sha512=(
|
||||||
|
"77bf2c9d41a64f186d260802930ac123100453ea081ca51f1b7515fb09c687a06a0285757001ee57d8c63acc42934cafee5af30e75cdde50e69f574230ea29ee"
|
||||||
|
"557f9308fe2d1e4e930bd3d9bc6f1fd32290f7428c4587c60473ab52daec96cfd554a085520d1d503576a618bc1921153faedaf2012b83c39ee6318790fd1c13"
|
||||||
|
"3710085a73feecf6a843415271ec794c90146b03f6bbd30f07c9e0c79febf8995d557e40194f1e05db655e4f5ef2fae97563f8456fceaae65d4ea98857a83b1c"
|
||||||
|
"f080776ed82c3ac5d6272dee39746f87897d8e6984996caf5bf6d87bf11d9c9e0c1ad5c437c21258bd278bb6fd76974946e878f548517885f71c556096231369"
|
||||||
|
"2c791ae009a6929c6fc893ec5df7e62910ee8207e0b2159d6937309c03efe175b6ae1e445829a13d041b6851334ad35c521f2fa03c97675d4a05f1fafe58ede0"
|
||||||
|
"60b9ddf4cc6402256473e2e1eefeabd9001aa4e205208715ecc6d6fc3f5b400e469944580077271b8e80562a4c2f601249e69e07a504f46744e0c50335f1cbf1"
|
||||||
|
)
|
||||||
|
|
||||||
|
extract_dirs=(
|
||||||
|
"$sysroot_dir"
|
||||||
|
"$sysroot_dir"
|
||||||
|
"$src_dir"
|
||||||
|
"$src_dir"
|
||||||
|
"$src_dir"
|
||||||
|
"$src_dir"
|
||||||
|
)
|
||||||
|
|
||||||
|
paths_to_extract=(
|
||||||
|
"./usr/include ./usr/lib ./lib"
|
||||||
|
"./usr/include ./usr/lib"
|
||||||
|
)
|
||||||
|
|
||||||
|
function fail {
|
||||||
|
local message="$1"
|
||||||
|
printf "%s\n" "$message"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function download {
|
||||||
|
local url="$1"
|
||||||
|
curl "$curl_opts" "$url"
|
||||||
|
}
|
||||||
|
|
||||||
|
function extract {
|
||||||
|
local file="$1"
|
||||||
|
local x_dir="$2"
|
||||||
|
local paths="$3"
|
||||||
|
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
tar "$tar_opts" "$file" -C "$x_dir" $paths
|
||||||
|
}
|
||||||
|
|
||||||
|
function gen_sysroot_wrapper {
|
||||||
|
local base_dir="$1"
|
||||||
|
local to_wrap="$base_dir/bin/$2"
|
||||||
|
|
||||||
|
cat - > "$to_wrap-sysroot" <<EOF
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
exec "$to_wrap" --sysroot="$base_dir/sysroot" "\$@"
|
||||||
|
EOF
|
||||||
|
chmod +x "$to_wrap-sysroot"
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_bsd_sets {
|
||||||
|
for index in ${!files[*]}; do
|
||||||
|
name=${files[index]}
|
||||||
|
base="$(basename "$name")"
|
||||||
|
|
||||||
|
if [[ ! -f "${base}" ]]; then
|
||||||
|
printf "Downloading %s..." "$name"
|
||||||
|
download "${files[index]}"
|
||||||
|
printf "OK\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "Checking %s..." "$base"
|
||||||
|
if ( echo "${sha512[index]} $base" | sha512sum --status -c - ); then
|
||||||
|
printf "OK\n"
|
||||||
|
else
|
||||||
|
fail "Failed"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "Extracting %s..." "$base"
|
||||||
|
extract "$base" "${extract_dirs[index]}" "${paths_to_extract[index]}"
|
||||||
|
printf "OK\n"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_tools {
|
||||||
|
cd "$src_dir/usr/src"
|
||||||
|
MKUNPRIVED=yes TOOLDIR="$ppc_dir" MKSHARE=no MKDOC=no MKHTML=no MKINFO=no \
|
||||||
|
MKKMOD=no MKLINT=no MKMAN=no MKNLS=no MKPROFILE=no ./build.sh \
|
||||||
|
-j$nproc -m macppc tools
|
||||||
|
cd "$working_dir"
|
||||||
|
|
||||||
|
gen_sysroot_wrapper "$ppc_dir" "$ppc_gcc"
|
||||||
|
gen_sysroot_wrapper "$ppc_dir" "$ppc_gxx"
|
||||||
|
}
|
||||||
|
|
||||||
|
function download_rust {
|
||||||
|
if [[ -d "$rust_dir" ]]; then return; fi
|
||||||
|
|
||||||
|
local rustc_src="rustc-$rust_version-src.tar.gz"
|
||||||
|
|
||||||
|
printf "Downloading Rust source..."
|
||||||
|
download "https://static.rust-lang.org/dist/$rustc_src"
|
||||||
|
printf "OK\n"
|
||||||
|
|
||||||
|
printf "Extracting Rust source..."
|
||||||
|
extract "$rustc_src" ./
|
||||||
|
printf "OK\n"
|
||||||
|
mv "$(basename "$rustc_src" .tar.gz)" "$rust_dir"
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_rust {
|
||||||
|
sed "s%@@tools_dir@@%$ppc_dir%" config.toml | \
|
||||||
|
sed "s%@@cargo@@%$cargo%" | \
|
||||||
|
sed "s%@@rustc@@%$rustc%" \
|
||||||
|
> "$rust_build_dir/config.toml"
|
||||||
|
cd "$rust_build_dir"
|
||||||
|
|
||||||
|
"$rust_dir/x.py" build -j "$nproc"
|
||||||
|
"$rust_dir/x.py" dist -j "$nproc"
|
||||||
|
|
||||||
|
cd "$working_dir"
|
||||||
|
}
|
||||||
|
|
||||||
|
function rust_install_script {
|
||||||
|
local script="$1"
|
||||||
|
|
||||||
|
if [[ -n "$verbose" ]]; then
|
||||||
|
"$script/install.sh" --prefix="$prefix"
|
||||||
|
else
|
||||||
|
"$script/install.sh" --prefix="$prefix" > /dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_rust {
|
||||||
|
if [[ ! -d "$rustc_dir" ]]; then
|
||||||
|
printf "Extracting Rust compiler and tools for host..."
|
||||||
|
extract "$rust_tar" ./
|
||||||
|
printf "OK\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "Installing Rust for host..."
|
||||||
|
rust_install_script "$rustc_dir"
|
||||||
|
printf "OK\n"
|
||||||
|
|
||||||
|
if [[ ! -d "$power_std_dir" ]]; then
|
||||||
|
printf "Extracting Rust for %s..." "$triple"
|
||||||
|
extract "$powerpc_std_tar" ./
|
||||||
|
printf "OK\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "Installing Rust STD for %s..." "$triple"
|
||||||
|
rust_install_script "$power_std_dir"
|
||||||
|
printf "OK\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function uninstall_rust {
|
||||||
|
printf "Uninstalling Rust std for %s..." "$triple"
|
||||||
|
printf "OK\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean {
|
||||||
|
printf "Cleaning..."
|
||||||
|
rm -rf ./*.tgz ./*.tar.gz "$src_dir" "$ppc_dir" "$working_dir/rust*" ./rust*/ tools_built
|
||||||
|
printf "OK\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_ppc_tools {
|
||||||
|
printf "Copying powerpc NetBSD tools..."
|
||||||
|
cp -r "$ppc_dir" "$prefix"
|
||||||
|
gen_sysroot_wrapper "$prefix" "$ppc_gcc"
|
||||||
|
gen_sysroot_wrapper "$prefix" "$ppc_gxx"
|
||||||
|
ln -s "$prefix/bin/powerpc--netbsd-gcc-sysroot" "/usr/local/bin/powerpc--netbsd-gcc"
|
||||||
|
ln -s "$prefix/bin/powerpc--netbsd-g++-sysroot" "/usr/local/bin/powerpc--netbsd-g++"
|
||||||
|
printf "OK\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function uninstall_ppc_tools {
|
||||||
|
if [[ "$prefix" = "/" ]]; then
|
||||||
|
fail "Cannot use root (/) as prefix"
|
||||||
|
else
|
||||||
|
rm -rf "$prefix"
|
||||||
|
rm "/usr/local/bin/powerpc--netbsd-gcc"
|
||||||
|
rm "/usr/local/bin/powerpc--netbsd-g++"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_command {
|
||||||
|
local command=( "$@" )
|
||||||
|
|
||||||
|
if [[ -n "$verbose" ]]; then
|
||||||
|
exec "${command[@]}"
|
||||||
|
else
|
||||||
|
exec "${command[@]}" 2> /dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function build {
|
||||||
|
if [[ ! $(command -v llvm-config) ]]; then fail "No llvm-config found"; fi
|
||||||
|
if [[ ! $(command -v rustup) ]]; then fail "No rustup found"; fi
|
||||||
|
if [[ ! $(check_command rustup which cargo) ]]; then fail "No cargo found"; fi
|
||||||
|
if [[ ! $(check_command rustup which rustc) ]]; then fail "No rustc found"; fi
|
||||||
|
|
||||||
|
cargo="$(rustup which cargo)"
|
||||||
|
rustc="$(rustup which rustc)"
|
||||||
|
|
||||||
|
mkdir -p "$sysroot_dir" "$src_dir" "$ppc_dir/bin" "$rust_build_dir"
|
||||||
|
|
||||||
|
if [[ ! -f "tools_built" ]]; then
|
||||||
|
get_bsd_sets
|
||||||
|
build_tools
|
||||||
|
touch tools_built
|
||||||
|
fi
|
||||||
|
|
||||||
|
download_rust
|
||||||
|
build_rust
|
||||||
|
}
|
||||||
|
|
||||||
|
function install {
|
||||||
|
install_ppc_tools
|
||||||
|
install_rust
|
||||||
|
}
|
||||||
|
|
||||||
|
function uninstall {
|
||||||
|
uninstall_ppc_tools
|
||||||
|
}
|
||||||
|
|
||||||
|
function link {
|
||||||
|
rustup toolchain link powerpc "$prefix"
|
||||||
|
}
|
||||||
|
|
||||||
|
function unlink {
|
||||||
|
if [[ -n "$verbose" ]]; then
|
||||||
|
rustup toolchain uninstall powerpc
|
||||||
|
else
|
||||||
|
rustup toolchain uninstall powerpc 2> /dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_usage {
|
||||||
|
printf "Usage: %s [-v] command\n" "$(basename "$0")"
|
||||||
|
printf "Options:\n"
|
||||||
|
printf " -p Set the (un)install prefix\n"
|
||||||
|
printf " -v Use verbose output\n"
|
||||||
|
printf "\n"
|
||||||
|
printf "Commands:\n"
|
||||||
|
printf " build Build the cross-compiler and then Rust\n"
|
||||||
|
printf " clean Clean working directory for clean build\n"
|
||||||
|
printf " install Install Rust to the given prefix\n"
|
||||||
|
printf " (/usr/local/%s)\n" "$triple"
|
||||||
|
printf " uninstall Uninstall Rust from the given prefix and remove\n"
|
||||||
|
printf " from rustup\n"
|
||||||
|
printf " link Link to rustup toolchain\n"
|
||||||
|
printf " unlink Unlink rustup toolchain\n"
|
||||||
|
printf " help Print this message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix="/usr/local/$triple"
|
||||||
|
|
||||||
|
while getopts vp: opt
|
||||||
|
do
|
||||||
|
case $opt in
|
||||||
|
v)
|
||||||
|
verbose=1;;
|
||||||
|
p)
|
||||||
|
prefix="$(realpath "$OPTARG")";;
|
||||||
|
?)
|
||||||
|
print_usage
|
||||||
|
exit 2;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -n "$verbose" ]]; then
|
||||||
|
curl_opts=-LO
|
||||||
|
tar_opts=xzvf
|
||||||
|
else
|
||||||
|
curl_opts=-sSLO
|
||||||
|
tar_opts=xzf
|
||||||
|
fi
|
||||||
|
if [[ "$prefix" = "/" ]]; then fail "Cannot use root (/) as prefix"; fi
|
||||||
|
shift $(("$OPTIND" - 1))
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
build)
|
||||||
|
build;;
|
||||||
|
clean)
|
||||||
|
clean;;
|
||||||
|
install)
|
||||||
|
install;;
|
||||||
|
uninstall)
|
||||||
|
uninstall;;
|
||||||
|
link)
|
||||||
|
link;;
|
||||||
|
unlink)
|
||||||
|
unlink;;
|
||||||
|
help)
|
||||||
|
print_usage;;
|
||||||
|
*)
|
||||||
|
print_usage
|
||||||
|
exit 2
|
||||||
|
esac
|
32
config.toml
Normal file
32
config.toml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
[llvm]
|
||||||
|
link-shared = true
|
||||||
|
|
||||||
|
[build]
|
||||||
|
target = ["x86_64-unknown-linux-gnu", "powerpc-unknown-netbsd"]
|
||||||
|
cargo = "@@cargo@@"
|
||||||
|
rustc = "@@rustc@@"
|
||||||
|
python = "/usr/bin/python"
|
||||||
|
extended = true
|
||||||
|
sanitizers = false
|
||||||
|
profiler = false
|
||||||
|
vendor = true
|
||||||
|
docs = false
|
||||||
|
|
||||||
|
[rust]
|
||||||
|
codegen-units-std = 1
|
||||||
|
debuginfo-level = 2
|
||||||
|
channel = "stable"
|
||||||
|
rpath = false
|
||||||
|
deny-warnings = false
|
||||||
|
|
||||||
|
[target.x86_64-unknown-linux-gnu]
|
||||||
|
llvm-config = "/usr/bin/llvm-config"
|
||||||
|
|
||||||
|
[target.powerpc-unknown-netbsd]
|
||||||
|
llvm-config = "/usr/bin/llvm-config"
|
||||||
|
cc = "@@tools_dir@@/bin/powerpc--netbsd-gcc-sysroot"
|
||||||
|
cxx = "@@tools_dir@@/bin/powerpc--netbsd-g++-sysroot"
|
||||||
|
ar = "@@tools_dir@@/bin/powerpc--netbsd-ar"
|
||||||
|
|
||||||
|
[dist]
|
||||||
|
src-tarball = false
|
Loading…
Reference in New Issue
Block a user