Add envkernel.sh: instant mainlining environment (#1424)
Changes: * `helpers/envkernel.sh`: * installs everything needed for kernel compilation in the native chroot * mounts the kernel source to `/mnt/linux` inside the chroot * creates `/mnt/linux/.output` and chowns it to the `pmos` user, that folder will be used for the kernel build output * sets up aliases for `make`, `pmbootstrap`, `pmbroot`, `kernelroot` * new action `pmbootstrap work_migrate`: does the interactive work folder migration if necessary, otherwise it doesn't output anything * when calling this first, we can safely use all other commands non-interactively without showing the output Benefits: * Fast setup (especially for people who are new to kernel compilation * No need to figure out distribution specific package names (cross compilers!) * No need to do a test build just to verify that the right packages are installed * Less error prone * The right dependencies are always installed * `ARCH` and `CROSS_COMPILE` variables always get set automatically and based on `deviceinfo_arch` * If the build environment is broken for some reason, just zap and start over * Easy to reproduce problems Notes: * `make menuconfig` works as well * Sourcing was tested with `zsh`, `bash` and `fish`, it should be easy to extend for other shells
This commit is contained in:
parent
8927ac5c3a
commit
a77a0dcc32
|
@ -0,0 +1,17 @@
|
|||
#!/usr/bin/env fish
|
||||
# Copyright 2018 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# Fish compatibility code from envkernel.sh
|
||||
set script_dir (dirname (status filename))
|
||||
sh "$script_dir/envkernel.sh" --fish 1>| read -z fishcode
|
||||
|
||||
# Verbose output
|
||||
if [ "$argv" = "-v" ]
|
||||
echo "(eval code start)"
|
||||
printf "$fishcode"
|
||||
echo "(eval code end)"
|
||||
end
|
||||
|
||||
# Execute generated code
|
||||
echo -e "$fishcode" | source -
|
|
@ -0,0 +1,183 @@
|
|||
#!/bin/sh
|
||||
# Copyright 2018 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
#
|
||||
# usage example:
|
||||
# $ cd ~/code/linux
|
||||
# $ source ~/code/pmbootstrap/helpers/envkernel.sh
|
||||
|
||||
check_kernel_folder() {
|
||||
[ -e "Kbuild" ] && return
|
||||
echo "ERROR: This folder is not a linux source tree: $PWD"
|
||||
return 1
|
||||
}
|
||||
|
||||
|
||||
export_pmbootstrap_dir() {
|
||||
# Get pmbootstrap dir based on this script's location
|
||||
# See also: <https://stackoverflow.com/a/29835459>
|
||||
# shellcheck disable=SC2039
|
||||
if [ -n "${BASH_SOURCE[0]}" ]; then
|
||||
script_dir="$(dirname "${BASH_SOURCE[0]}")"
|
||||
else
|
||||
script_dir="$(dirname "$1")"
|
||||
fi
|
||||
|
||||
# Fail with debug information
|
||||
# shellcheck disable=SC2155
|
||||
export pmbootstrap_dir=$(realpath "$script_dir/..")
|
||||
if ! [ -e "$pmbootstrap_dir/pmbootstrap.py" ]; then
|
||||
echo "ERROR: Failed to get the script's location with your shell."
|
||||
echo "Please adjust export_pmbootstrap_dir in envkernel.sh. Debug info:"
|
||||
echo "\$1: $1"
|
||||
echo "\$pmbootstrap_dir: $pmbootstrap_dir"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
set_alias_pmbootstrap() {
|
||||
pmbootstrap="$pmbootstrap_dir"/pmbootstrap.py
|
||||
# shellcheck disable=SC2139
|
||||
alias pmbootstrap="$pmbootstrap"
|
||||
if [ -e ~/.config/pmbootstrap.cfg ]; then
|
||||
$pmbootstrap work_migrate
|
||||
else
|
||||
echo "NOTE: First run of pmbootstrap, running 'pmbootstrap init'"
|
||||
$pmbootstrap init
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
export_chroot_device_deviceinfo() {
|
||||
chroot="$(pmbootstrap config work)/chroot_native"
|
||||
device="$(pmbootstrap config device)"
|
||||
deviceinfo="$pmbootstrap_dir/aports/device/device-$device/deviceinfo"
|
||||
export chroot device deviceinfo
|
||||
}
|
||||
|
||||
|
||||
check_device() {
|
||||
[ -e "$deviceinfo" ] && return
|
||||
echo "ERROR: Please select a valid device in 'pmbootstrap init'"
|
||||
return 1
|
||||
}
|
||||
|
||||
|
||||
initialize_chroot() {
|
||||
# Don't initialize twice
|
||||
flag="$chroot/tmp/envkernel/setup_done"
|
||||
[ -e "$flag" ] && return
|
||||
|
||||
# Install needed packages
|
||||
echo "Initializing Alpine chroot (details: 'pmbootstrap log')"
|
||||
# shellcheck disable=SC2154
|
||||
pmbootstrap -q chroot -- apk -q add \
|
||||
abuild \
|
||||
bc \
|
||||
binutils-"$deviceinfo_arch" \
|
||||
binutils \
|
||||
bison \
|
||||
flex \
|
||||
gcc-"$deviceinfo_arch" \
|
||||
gcc \
|
||||
linux-headers \
|
||||
libressl-dev \
|
||||
make \
|
||||
musl-dev \
|
||||
ncurses-dev \
|
||||
perl || return 1
|
||||
|
||||
# Create /mnt/linux
|
||||
sudo mkdir -p "$chroot/mnt/linux"
|
||||
|
||||
# Mark as initialized
|
||||
mkdir -p "$chroot/tmp/envkernel"
|
||||
touch "$flag"
|
||||
}
|
||||
|
||||
|
||||
mount_kernel_source() {
|
||||
[ -e "$chroot/mnt/linux/Kbuild" ] && return
|
||||
sudo mount --bind "$PWD" "$chroot/mnt/linux"
|
||||
}
|
||||
|
||||
|
||||
create_output_folder() {
|
||||
[ -d "$chroot/mnt/linux/.output" ] && return
|
||||
mkdir -p ".output"
|
||||
pmbootstrap -q chroot -- chown -R pmos:pmos "/mnt/linux/.output"
|
||||
}
|
||||
|
||||
|
||||
set_alias_make() {
|
||||
# Cross compiler prefix
|
||||
# shellcheck disable=SC1090
|
||||
prefix="$(. "$chroot/usr/share/abuild/functions.sh";
|
||||
arch_to_hostspec "$deviceinfo_arch")"
|
||||
|
||||
# Kernel architecture
|
||||
case "$deviceinfo_arch" in
|
||||
aarch64*) arch="arm64" ;;
|
||||
arm*) arch="arm" ;;
|
||||
esac
|
||||
|
||||
# Build make command
|
||||
cmd="echo '*** pmbootstrap envkernel.sh active for $PWD! ***';"
|
||||
cmd="$cmd pmbootstrap -q chroot --"
|
||||
cmd="$cmd ARCH=$arch"
|
||||
cmd="$cmd CROSS_COMPILE=/usr/bin/$prefix-"
|
||||
cmd="$cmd make -C /mnt/linux O=/mnt/linux/.output"
|
||||
# shellcheck disable=SC2139
|
||||
alias make="$cmd"
|
||||
}
|
||||
|
||||
|
||||
set_alias_pmbroot_kernelroot() {
|
||||
# shellcheck disable=SC2139
|
||||
alias pmbroot="cd '$pmbootstrap_dir'"
|
||||
# shellcheck disable=SC2139
|
||||
alias kernelroot="cd '$PWD'"
|
||||
}
|
||||
|
||||
main() {
|
||||
# Stop executing once a function fails
|
||||
# shellcheck disable=SC1090
|
||||
if check_kernel_folder \
|
||||
&& export_pmbootstrap_dir "$1" \
|
||||
&& set_alias_pmbootstrap \
|
||||
&& export_chroot_device_deviceinfo \
|
||||
&& check_device \
|
||||
&& . "$deviceinfo" \
|
||||
&& initialize_chroot \
|
||||
&& mount_kernel_source \
|
||||
&& create_output_folder \
|
||||
&& set_alias_make \
|
||||
&& set_alias_pmbroot_kernelroot; then
|
||||
|
||||
# Success
|
||||
echo "pmbootstrap envkernel.sh activated successfully."
|
||||
echo " * kernel source: $PWD"
|
||||
echo " * output folder: $PWD/.output"
|
||||
echo " * architecture: $arch ($device is $deviceinfo_arch)"
|
||||
echo " * aliases: make, kernelroot, pmbootstrap, pmbroot" \
|
||||
"(see 'type make' etc.)"
|
||||
else
|
||||
# Failure
|
||||
echo "See also: <https://postmarketos.org/troubleshooting>"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Print fish alias syntax (when called from envkernel.fish)
|
||||
fish_compat() {
|
||||
[ "$1" = "--fish" ] || return
|
||||
for name in make kernelroot pmbootstrap pmbroot; do
|
||||
echo "alias $(alias $name | sed 's/=/ /')"
|
||||
done
|
||||
}
|
||||
|
||||
# Run main() with all output redirected to stderr
|
||||
# Afterwards print fish compatible syntax to stdout
|
||||
main "$0" >&2 && fish_compat "$1"
|
|
@ -317,6 +317,11 @@ def stats(args):
|
|||
pmb.chroot.user(args, ["ccache", "-s"], suffix, log=False)
|
||||
|
||||
|
||||
def work_migrate(args):
|
||||
# do nothing (pmb/__init__.py already did the migration)
|
||||
pmb.helpers.logging.disable()
|
||||
|
||||
|
||||
def log(args):
|
||||
if args.clear_log:
|
||||
pmb.helpers.run.user(args, ["truncate", "-s", "0", args.log],
|
||||
|
|
|
@ -240,6 +240,9 @@ def arguments():
|
|||
sub.add_parser("shutdown", help="umount, unregister binfmt")
|
||||
sub.add_parser("index", help="re-index all repositories with custom built"
|
||||
" packages (do this after manually removing package files)")
|
||||
sub.add_parser("work_migrate", help="run this before using pmbootstrap"
|
||||
" non-interactively to migrate the"
|
||||
" work folder version on demand")
|
||||
arguments_export(sub)
|
||||
arguments_flasher(sub)
|
||||
arguments_initfs(sub)
|
||||
|
|
|
@ -45,6 +45,7 @@ sh_files="
|
|||
./aports/main/mdss-fb-init-hack/mdss-fb-init-hack.sh
|
||||
./aports/main/postmarketos-ui-hildon/postmarketos-ui-hildon.post-install
|
||||
./helpers/envsetup.sh
|
||||
./helpers/envkernel.sh
|
||||
$(find . -path './aports/main/postmarketos-ui-hildon/*.sh')
|
||||
$(find . -name '*.trigger')
|
||||
$(find . -path './aports/main/devicepkg-dev/*.sh')
|
||||
|
|
Loading…
Reference in New Issue