Skip to content
Snippets Groups Projects
cook.sh 13.3 KiB
Newer Older
Jeremy Soller's avatar
Jeremy Soller committed
#!/usr/bin/env bash
set -e
shopt -s nullglob
Jeremy Soller's avatar
Jeremy Soller committed

# Variables to be overriden by recipes
export PREPARE_COPY=1
if [ ! "$(uname -s)" = "Redox" ]
then
function pkg {
    CC=cc cargo run --release --manifest-path "$ROOT/pkgutils/Cargo.toml" --bin pkg -- $@
}

function docgen {
    CC=cc cargo run --release --manifest-path "$ROOT/docgen/Cargo.toml" --bin docgen -- $@
}

function usage {
    echo "cook.sh $1 <op>" >&2
    echo "  dist" >&2
    echo "  distclean" >&2
    echo "  build" >&2
    echo "  clean" >&2
Jeremy Soller's avatar
Jeremy Soller committed
    echo "  diff" >&2
    echo "  diff_origin" >&2
    echo "  diff_upstream" >&2
Jeremy Soller's avatar
Jeremy Soller committed
    echo "  difftool" >&2
    echo "  difftool_origin" >&2
    echo "  difftool_upstream" >&2
    echo "  fetch" >&2
    echo "  unfetch" >&2
Jeremy Soller's avatar
Jeremy Soller committed
    echo "  prepare" >&2
    echo "  unprepare" >&2
    echo "  publish" >&2
    echo "  unpublish" >&2
    echo "  stage" >&2
    echo "  unstage" >&2
Jeremy Soller's avatar
Jeremy Soller committed
    echo "  status" >&2
Jeremy Soller's avatar
Jeremy Soller committed
    echo "  status_origin" >&2
    echo "  status_upstream" >&2
    echo "  tar" >&2
    echo "  untar" >&2
    echo "  update" >&2
    echo "  version" >&2
}

Jeremy Soller's avatar
Jeremy Soller committed
function op {
    if [ ! "$COOK_QUIET" = "1" ]
    then
        echo -e "\033[01;38;5;215mcook - $1 $2\033[0m" >&2
    fi

Jeremy Soller's avatar
Jeremy Soller committed
    case "$2" in
Jeremy Soller's avatar
Jeremy Soller committed
            op $1 prepare
            op $1 build
            op $1 stage
            op $1 tar
            ;;
        distclean)
            op $1 untar
            op $1 unstage
Jeremy Soller's avatar
Jeremy Soller committed
            op $1 unprepare
Jeremy Soller's avatar
Jeremy Soller committed
        fetch)
            skip=0
            if [ "$(type -t recipe_fetch)" = "function" ]
            then
                recipe_fetch
            fi
            if [ "$skip" -eq "0" ]
Jeremy Soller's avatar
Jeremy Soller committed
            then
                if [ -n "$TAR" ]
                    if [ ! -f source.tar ]
                    then
                        wget "$TAR" -O source.tar
                    fi
                    if [ -n "$TAR_SHA256" ]
                    then
                        sha256sum -c <<< "${TAR_SHA256} source.tar"
                    fi

                    if [ ! -d source ]
                    then
                        mkdir source
                        tar xvf source.tar -C source --strip-components 1
                    fi
                elif [ -n "$GIT" ]
                    if [ ! -d source ]
                        if [ -n "$BRANCH" ]
                        then
                            git clone --recursive "$GIT" -b "$BRANCH" source
                        else
                            git clone --recursive "$GIT" source
                        fi
                    pushd source > /dev/null
                    git remote set-url origin "$GIT"
                    git fetch origin
                    if [ -n "$GIT_UPSTREAM" ]
                    then
                        git remote set-url upstream "$GIT_UPSTREAM" &> /dev/null ||
                        git remote add upstream "$GIT_UPSTREAM"
                        git fetch upstream
                    fi
                    git submodule sync --recursive
                    git submodule update --init --recursive
                    popd > /dev/null
                fi
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        unfetch)
Jeremy Soller's avatar
Jeremy Soller committed
            rm -rfv source
Jeremy Soller's avatar
Jeremy Soller committed
            if [ -n "$TAR" ]
Jeremy Soller's avatar
Jeremy Soller committed
                rm -f source.tar
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        status)
            if [ -n "$TAR" ]
            then
                tar --compare --file="source.tar" -C "source" --strip-components=1 2>&1 |
                grep -v "tar: :" | grep -v '\(Mod time\|Mode\|Gid\|Uid\) differs' ||
                true
            elif [ -n "$GIT" ]
            then
                git -C source diff --stat --color
Jeremy Soller's avatar
Jeremy Soller committed
            fi
Jeremy Soller's avatar
Jeremy Soller committed
        status_origin)
            if [ -n "$GIT" ]
            then
                if [ -n "$BRANCH" ]
                then
                    git -C source diff --stat --color "origin/$BRANCH"
Jeremy Soller's avatar
Jeremy Soller committed
                else
                    git -C source diff --stat --color "origin/master"
        status_upstream)
            if [ -n "$GIT_UPSTREAM" ]
            then
                if [ -n "$BRANCH" ]
                then
                    git -C source diff --stat --color "upstream/$BRANCH"
                    git -C source diff --stat --color "upstream/master"
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        diff)
            if [ -n "$GIT" ]
            then
                git -C source diff
            fi
            ;;
        diff_origin)
            if [ -n "$GIT" ]
            then
                if [ -n "$BRANCH" ]
                then
                    git -C source diff "origin/$BRANCH"
                else
                    git -C source diff "origin/master"
                fi
            fi
            ;;
        diff_upstream)
            if [ -n "$GIT_UPSTREAM" ]
            then
                if [ -n "$BRANCH" ]
                then
                    git -C source diff "upstream/$BRANCH"
                else
                    git -C source diff "upstream/master"
                fi
            fi
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        difftool)
            if [ -n "$GIT" ]
            then
                git -C source difftool -d
            fi
            ;;
        difftool_origin)
            if [ -n "$GIT" ]
            then
                if [ -n "$BRANCH" ]
                then
                    git -C source difftool -d "origin/$BRANCH"
                else
                    git -C source difftool -d "origin/master"
                fi
            fi
            ;;
        difftool_upstream)
            if [ -n "$GIT_UPSTREAM" ]
            then
                if [ -n "$BRANCH" ]
                then
                    git -C source difftool -d "upstream/$BRANCH"
                else
                    git -C source difftool -d "upstream/master"
                fi
            fi
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        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
            ;;
Jeremy Soller's avatar
Jeremy Soller committed
        prepare)
            skip=0
            if [ "$(type -t recipe_prepare)" = "function" ]
                recipe_prepare
            fi
            if [ "$skip" -eq "0" ]
            then
                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
                if [ "$PREPARE_COPY" -eq "0" ]
                then
                    mkdir build
                else
                    cp -rp source build
                fi

                for patch in *.patch
                    patch -p1 -d build < "$patch"
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        unprepare)
            rm -rf build
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
            pushd build > /dev/null
Jeremy Soller's avatar
Jeremy Soller committed
            skip=0
            if [ "$(type -t recipe_version)" = "function" ]
Jeremy Soller's avatar
Jeremy Soller committed
                recipe_version
                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
            ;;
Jeremy Soller's avatar
Jeremy Soller committed
        build)
            pushd build > /dev/null
Jeremy Soller's avatar
Jeremy Soller committed
            skip=0
            if [ "$(type -t recipe_build)" = "function" ]
            then
Jeremy Soller's avatar
Jeremy Soller committed
                recipe_build
            if [ "$DEBUG" == 1 ]
                cp -p "$ROOT/Xargo.toml" "Xargo.toml"
                xargo rustc --target "$TARGET" $release_flag $CARGOFLAGS
Jeremy Soller's avatar
Jeremy Soller committed
            popd > /dev/null
            ;;
        test)
            pushd build > /dev/null
Jeremy Soller's avatar
Jeremy Soller committed
            skip=0
            if [ "$(type -t recipe_test)" = "function" ]
            then
Jeremy Soller's avatar
Jeremy Soller committed
                recipe_test
            if [ "$DEBUG" == 1 ]
                cp -p "$ROOT/Xargo.toml" "Xargo.toml"
                xargo test --no-run --target "$TARGET" $release_flag $CARGOFLAGS
            popd > /dev/null
            ;;
Jeremy Soller's avatar
Jeremy Soller committed
        clean)
            pushd build > /dev/null
Jeremy Soller's avatar
Jeremy Soller committed
            skip=0
            if [ "$(type -t recipe_clean)" = "function" ]
            then
Jeremy Soller's avatar
Jeremy Soller committed
                recipe_clean
            fi
            if [ "$skip" -eq "0" ]
            then
                xargo clean
            fi
Jeremy Soller's avatar
Jeremy Soller committed
            popd > /dev/null
            ;;
        stage)
            op $1 unstage
Jeremy Soller's avatar
Jeremy Soller committed
            mkdir -p stage
jD91mZM2's avatar
jD91mZM2 committed
            stage="$(realpath stage)"
Jeremy Soller's avatar
Jeremy Soller committed
            pushd build > /dev/null
Jeremy Soller's avatar
Jeremy Soller committed
            skip=0
Jeremy Soller's avatar
Jeremy Soller committed
            if [ "$(type -t recipe_stage)" = "function" ]
            then
jD91mZM2's avatar
jD91mZM2 committed
                recipe_stage "$stage"
jD91mZM2's avatar
jD91mZM2 committed
                #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 '*.*')"
jD91mZM2's avatar
jD91mZM2 committed
                if [ -z "$bins" ]
                then
                    example=true
                    bins="$(find target/$TARGET/$build/examples/ -maxdepth 1 -type f ! -name '*.*' ! -name '*-*' \
                            2> /dev/null || true)"
                fi
                if [ -n "$bins" ]
                then
jD91mZM2's avatar
jD91mZM2 committed
                    if [ -n "$example" ]
                    then
jD91mZM2's avatar
jD91mZM2 committed
                        echo "$(tput bold)Note$(tput sgr0): No binaries detected, using example binaries"
jD91mZM2's avatar
jD91mZM2 committed
                    fi
jD91mZM2's avatar
jD91mZM2 committed
                    mkdir -p "$stage/$BINDIR"
                    for bin in $bins
                    do
                        if [ "$DEBUG" == 1 ]
                        then
jD91mZM2's avatar
jD91mZM2 committed
                            cp -v "$bin" "$stage/$BINDIR/$(basename $bin)"
Jeremy Soller's avatar
Jeremy Soller committed
                            "${STRIP}" -v "$bin" -o "$stage/$BINDIR/$(basename $bin)"
                    done
jD91mZM2's avatar
jD91mZM2 committed
                else
                    echo "$(tput bold)Warning$(tput sgr0): Recipe does not have any binaries" >&2
                docgen ../source ../stage/ref
Jeremy Soller's avatar
Jeremy Soller committed
            fi
Jeremy Soller's avatar
Jeremy Soller committed
            popd > /dev/null
            ;;
        unstage)
Jeremy Soller's avatar
Jeremy Soller committed
            rm -rfv stage
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        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
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        untar)
            rm -rfv stage.tar.gz stage.sig stage.toml
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        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"
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        unpublish)
            rm -rfv "$REPO/$1.tar.gz" "$REPO/$1.sig" "$REPO/$1.toml"
            usage $1
Jeremy Soller's avatar
Jeremy Soller committed
if [ -n "$1" ]
then
    if [ -d "$ROOT/recipes/$1" ]
Jeremy Soller's avatar
Jeremy Soller committed
    then
        export COOKBOOK_RECIPE="${ROOT}/recipes/$1"
Jeremy Soller's avatar
Jeremy Soller committed

        export PKG_CONFIG_ALLOW_CROSS=1
        export PKG_CONFIG_PATH=
        export PKG_CONFIG_LIBDIR="${COOKBOOK_RECIPE}/sysroot/lib/pkgconfig"
        export PKG_CONFIG_SYSROOT_DIR="${COOKBOOK_RECIPE}/sysroot"
        cd "${COOKBOOK_RECIPE}"
Jeremy Soller's avatar
Jeremy Soller committed
        source recipe.sh
        for arg in "${@:2}"
        do
            else
                ops[${#ops[@]}]="$arg"
            fi
        done

        for i in "${ops[@]}"
        do
            op "$1" "$i"
Jeremy Soller's avatar
Jeremy Soller committed
    else
        echo "cook.sh: recipe '$1' not found" >&2
Jeremy Soller's avatar
Jeremy Soller committed
    fi
else
    usage "{package}"
Jeremy Soller's avatar
Jeremy Soller committed
fi