mirror of
https://gitlab.redox-os.org/redox-os/redox.git
synced 2026-06-25 06:14:18 +08:00
A variable called DEPENDS in recipes contains the runtime dependency information for packages. These get added to the package during tarring.
326 lines
8.5 KiB
Bash
Executable File
326 lines
8.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -e
|
|
shopt -s nullglob
|
|
|
|
source config.sh
|
|
|
|
# Variables to be overriden by recipes
|
|
export BINDIR=bin
|
|
export CARGOFLAGS=
|
|
export DEBUG=
|
|
|
|
if [ ! "$(uname -s)" = "Redox" ]
|
|
then
|
|
function pkg {
|
|
CC=cc cargo run --release --manifest-path "$ROOT/pkgutils/Cargo.toml" --bin pkg -- $@
|
|
}
|
|
fi
|
|
|
|
function usage {
|
|
echo "cook.sh $1 <op>" >&2
|
|
echo " dist" >&2
|
|
echo " distclean" >&2
|
|
echo " build" >&2
|
|
echo " clean" >&2
|
|
echo " fetch" >&2
|
|
echo " unfetch" >&2
|
|
echo " prepare" >&2
|
|
echo " unprepare" >&2
|
|
echo " publish" >&2
|
|
echo " unpublish" >&2
|
|
echo " stage" >&2
|
|
echo " unstage" >&2
|
|
echo " tar" >&2
|
|
echo " untar" >&2
|
|
echo " update" >&2
|
|
echo " version" >&2
|
|
}
|
|
|
|
function op {
|
|
if [ ! "$COOK_QUIET" = "1" ]
|
|
then
|
|
echo -e "\033[01;38;5;215mcook - $1 $2\033[0m" >&2
|
|
fi
|
|
|
|
case "$2" in
|
|
dist)
|
|
op $1 prepare
|
|
op $1 build
|
|
op $1 stage
|
|
op $1 tar
|
|
;;
|
|
distclean)
|
|
op $1 untar
|
|
op $1 unstage
|
|
op $1 unprepare
|
|
;;
|
|
fetch)
|
|
skip=0
|
|
if [ "$(type -t recipe_fetch)" = "function" ]
|
|
then
|
|
recipe_fetch
|
|
fi
|
|
if [ "$skip" -eq "0" ]
|
|
then
|
|
if [ -n "$TAR" ]
|
|
then
|
|
if [ ! -f source.tar ]
|
|
then
|
|
wget "$TAR" -O source.tar
|
|
fi
|
|
|
|
if [ ! -d source ]
|
|
then
|
|
mkdir source
|
|
tar xvf source.tar -C source --strip-components 1
|
|
fi
|
|
elif [ -n "$GIT" ]
|
|
then
|
|
if [ ! -d source ]
|
|
then
|
|
if [ -n "$BRANCH" ]
|
|
then
|
|
git clone --recursive "$GIT" -b "$BRANCH" source
|
|
else
|
|
git clone --recursive "$GIT" source
|
|
fi
|
|
fi
|
|
|
|
pushd source > /dev/null
|
|
git pull
|
|
git submodule sync
|
|
git submodule update --init --recursive
|
|
popd > /dev/null
|
|
fi
|
|
fi
|
|
;;
|
|
unfetch)
|
|
rm -rfv source
|
|
if [ -n "$TAR" ]
|
|
then
|
|
rm -f source.tar
|
|
fi
|
|
;;
|
|
update)
|
|
pushd source > /dev/null
|
|
skip=0
|
|
if [ "$(type -t recipe_update)" = "function" ]
|
|
then
|
|
recipe_update
|
|
fi
|
|
if [ "$skip" -eq "0" ]
|
|
then
|
|
xargo update
|
|
fi
|
|
popd > /dev/null
|
|
;;
|
|
prepare)
|
|
rm -rf sysroot
|
|
mkdir sysroot
|
|
|
|
if [ ${#BUILD_DEPENDS} -gt 0 ]
|
|
then
|
|
pushd $ROOT
|
|
./repo.sh "${BUILD_DEPENDS[@]}"
|
|
popd
|
|
|
|
for i in "${BUILD_DEPENDS[@]}"
|
|
do
|
|
pkg --target=$TARGET install --root sysroot "$REPO/$i.tar.gz"
|
|
done
|
|
fi
|
|
|
|
rm -rf build
|
|
cp -rp source build
|
|
|
|
for patch in *.patch
|
|
do
|
|
patch -p1 -d build < "$patch"
|
|
done
|
|
;;
|
|
unprepare)
|
|
rm -rf build
|
|
rm -rf sysroot
|
|
;;
|
|
version)
|
|
pushd build > /dev/null
|
|
skip=0
|
|
if [ "$(type -t recipe_version)" = "function" ]
|
|
then
|
|
recipe_version
|
|
fi
|
|
if [ "$skip" -eq "0" ]
|
|
then
|
|
cargo config package.version | tr -d '"'
|
|
fi
|
|
popd > /dev/null
|
|
;;
|
|
gitversion)
|
|
if [ -d build/.git ]
|
|
then
|
|
echo "$(op $1 version)-$(git -C build rev-parse --short HEAD)"
|
|
else
|
|
op $1 version
|
|
fi
|
|
;;
|
|
build)
|
|
pushd build > /dev/null
|
|
skip=0
|
|
if [ "$(type -t recipe_build)" = "function" ]
|
|
then
|
|
recipe_build
|
|
fi
|
|
|
|
release_flag="--release"
|
|
if [ "$DEBUG" == 1 ]
|
|
then
|
|
release_flag=
|
|
fi
|
|
|
|
if [ "$skip" -eq "0" ]
|
|
then
|
|
cp -r "$ROOT/Xargo.toml" .
|
|
xargo build --target "$TARGET" $release_flag $CARGOFLAGS
|
|
fi
|
|
popd > /dev/null
|
|
;;
|
|
test)
|
|
pushd build > /dev/null
|
|
skip=0
|
|
if [ "$(type -t recipe_test)" = "function" ]
|
|
then
|
|
recipe_test
|
|
fi
|
|
|
|
release_flag="--release"
|
|
if [ "$DEBUG" == 1 ]
|
|
then
|
|
release_flag=
|
|
fi
|
|
|
|
if [ "$skip" -eq "0" ]
|
|
then
|
|
cp -r "$ROOT/Xargo.toml" .
|
|
xargo test --no-run --target "$TARGET" $release_flag $CARGOFLAGS
|
|
fi
|
|
popd > /dev/null
|
|
;;
|
|
clean)
|
|
pushd build > /dev/null
|
|
skip=0
|
|
if [ "$(type -t recipe_clean)" = "function" ]
|
|
then
|
|
recipe_clean
|
|
fi
|
|
if [ "$skip" -eq "0" ]
|
|
then
|
|
xargo clean
|
|
fi
|
|
popd > /dev/null
|
|
;;
|
|
stage)
|
|
op $1 unstage
|
|
mkdir -p stage
|
|
pushd build > /dev/null
|
|
skip=0
|
|
if [ "$(type -t recipe_stage)" = "function" ]
|
|
then
|
|
recipe_stage ../stage
|
|
fi
|
|
if [ "$skip" -eq "0" ]
|
|
then
|
|
#TODO xargo install --root "../stage" $CARGOFLAGS
|
|
if [ "$DEBUG" == 1 ]
|
|
then
|
|
build=debug
|
|
else
|
|
build=release
|
|
fi
|
|
bins="$(find target/$TARGET/$build/ -maxdepth 1 -type f ! -name '*.*')"
|
|
if [ -n "$bins" ]
|
|
then
|
|
mkdir -p "../stage/$BINDIR"
|
|
for bin in $bins
|
|
do
|
|
if [ "$DEBUG" == 1 ]
|
|
then
|
|
cp -v "$bin" "../stage/$BINDIR/$(basename $bin)"
|
|
else
|
|
strip -v "$bin" -o "../stage/$BINDIR/$(basename $bin)"
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
popd > /dev/null
|
|
;;
|
|
unstage)
|
|
rm -rfv stage
|
|
;;
|
|
tar)
|
|
echo "name = \"$1\"" > "stage.toml"
|
|
echo "version = \"$(op $1 version)\"" >> "stage.toml"
|
|
echo "target = \"$TARGET\"" >> "stage.toml"
|
|
|
|
# Add runtime dependencies to package if they exist
|
|
if [ -n "$DEPENDS" ]
|
|
then
|
|
# Remove leading and trailing whitespace, replace whitespace between
|
|
# package names with commas, and surround package names with quotes
|
|
dependencies=$(echo -e "$DEPENDS" | sed -E 's/^[[:space:]]*//;s/[[:space:]]*$//;s/[[:space:]]+/,/g;s/[^, ][^, ]*/"&"/g')
|
|
echo "depends = [$dependencies]" >> "stage.toml"
|
|
else
|
|
echo "depends = []" >> "stage.toml"
|
|
fi
|
|
|
|
mkdir -p stage/pkg
|
|
cp -v stage.toml "stage/pkg/$1.toml"
|
|
pkg --target=$TARGET create stage
|
|
;;
|
|
untar)
|
|
rm -rfv stage.tar.gz stage.sig stage.toml
|
|
;;
|
|
publish)
|
|
mkdir -p "$REPO"
|
|
cp -v stage.tar.gz "$REPO/$1.tar.gz"
|
|
cp -v stage.sig "$REPO/$1.sig"
|
|
cp -v stage.toml "$REPO/$1.toml"
|
|
;;
|
|
unpublish)
|
|
rm -rfv "$REPO/$1.tar.gz" "$REPO/$1.sig" "$REPO/$1.toml"
|
|
;;
|
|
*)
|
|
usage $1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
if [ -n "$1" ]
|
|
then
|
|
if [ -d "$ROOT/recipes/$1" ]
|
|
then
|
|
cd "$ROOT/recipes/$1"
|
|
source recipe.sh
|
|
|
|
ops=()
|
|
for arg in "${@:2}"
|
|
do
|
|
if [ "$arg" == "--debug" ]
|
|
then
|
|
DEBUG=1
|
|
else
|
|
ops[${#ops[@]}]="$arg"
|
|
fi
|
|
done
|
|
|
|
for i in "${ops[@]}"
|
|
do
|
|
op "$1" "$i"
|
|
done
|
|
else
|
|
echo "cook.sh: recipe '$1' not found" >&2
|
|
exit 1
|
|
fi
|
|
else
|
|
usage "{package}"
|
|
fi
|