From d7ce4d4d65b505a1c8428434ade5f49a143d59b2 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jackpot51@gmail.com> Date: Thu, 10 Nov 2022 12:03:32 -0700 Subject: [PATCH] Build packages in separate folder per target --- .gitignore | 22 +------ bin/aarch64-unknown-redox-pkg-config | 2 +- bin/i686-unknown-redox-pkg-config | 2 +- bin/x86_64-unknown-redox-llvm-config | 2 +- bin/x86_64-unknown-redox-pkg-config | 2 +- cook.sh | 87 +++++++++++++++------------- recipes/netsurf/recipe.sh | 4 +- repo.sh | 51 +++++++++------- src/bin/cook.rs | 31 ++++++---- 9 files changed, 108 insertions(+), 95 deletions(-) diff --git a/.gitignore b/.gitignore index c85b9a858..d63ce24e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,8 @@ -build -repo +/build +/repo source source.tmp source-new source.tar source.tar.tmp -stage -stage.tmp -stage.pkg -stage.pkgar -stage.sig -stage.tar -stage.tar.gz -stage.toml -sysroot -sysroot.tmp -xargo - - -#Added by cargo - -/target -**/*.rs.bk +target diff --git a/bin/aarch64-unknown-redox-pkg-config b/bin/aarch64-unknown-redox-pkg-config index c1eb83233..0bcf777b9 100755 --- a/bin/aarch64-unknown-redox-pkg-config +++ b/bin/aarch64-unknown-redox-pkg-config @@ -1,6 +1,6 @@ #!/usr/bin/env bash -export PKG_CONFIG_SYSROOT_DIR="${COOKBOOK_RECIPE}/sysroot" +export PKG_CONFIG_SYSROOT_DIR="${COOKBOOK_SYSROOT}" export PKG_CONFIG_LIBDIR="${PKG_CONFIG_SYSROOT_DIR}/lib/pkgconfig" export PKG_CONFIG_PATH="${PKG_CONFIG_SYSROOT_DIR}/share/pkgconfig" diff --git a/bin/i686-unknown-redox-pkg-config b/bin/i686-unknown-redox-pkg-config index c1eb83233..0bcf777b9 100755 --- a/bin/i686-unknown-redox-pkg-config +++ b/bin/i686-unknown-redox-pkg-config @@ -1,6 +1,6 @@ #!/usr/bin/env bash -export PKG_CONFIG_SYSROOT_DIR="${COOKBOOK_RECIPE}/sysroot" +export PKG_CONFIG_SYSROOT_DIR="${COOKBOOK_SYSROOT}" export PKG_CONFIG_LIBDIR="${PKG_CONFIG_SYSROOT_DIR}/lib/pkgconfig" export PKG_CONFIG_PATH="${PKG_CONFIG_SYSROOT_DIR}/share/pkgconfig" diff --git a/bin/x86_64-unknown-redox-llvm-config b/bin/x86_64-unknown-redox-llvm-config index c3658a16d..210eca976 100755 --- a/bin/x86_64-unknown-redox-llvm-config +++ b/bin/x86_64-unknown-redox-llvm-config @@ -98,7 +98,7 @@ def fail(message): print(message, file=sys.stderr) sys.exit(1) -prefix = os.environ["COOKBOOK_RECIPE"] + "/sysroot" +prefix = os.environ["COOKBOOK_SYSROOT"] args = [] link_static = False diff --git a/bin/x86_64-unknown-redox-pkg-config b/bin/x86_64-unknown-redox-pkg-config index c1eb83233..0bcf777b9 100755 --- a/bin/x86_64-unknown-redox-pkg-config +++ b/bin/x86_64-unknown-redox-pkg-config @@ -1,6 +1,6 @@ #!/usr/bin/env bash -export PKG_CONFIG_SYSROOT_DIR="${COOKBOOK_RECIPE}/sysroot" +export PKG_CONFIG_SYSROOT_DIR="${COOKBOOK_SYSROOT}" export PKG_CONFIG_LIBDIR="${PKG_CONFIG_SYSROOT_DIR}/lib/pkgconfig" export PKG_CONFIG_PATH="${PKG_CONFIG_SYSROOT_DIR}/share/pkgconfig" diff --git a/cook.sh b/cook.sh index 5ac9471e0..de191d279 100755 --- a/cook.sh +++ b/cook.sh @@ -266,8 +266,8 @@ function op { fi if [ "$skip" -eq "0" ] then - rm -rf sysroot - mkdir sysroot + rm -rf "${COOKBOOK_SYSROOT}" + mkdir "${COOKBOOK_SYSROOT}" if [ ${#BUILD_DEPENDS} -gt 0 ] then @@ -279,32 +279,32 @@ function op { do pkgar \ extract \ - sysroot \ + "${COOKBOOK_SYSROOT}" \ --archive "$REPO/$i.pkgar" \ --pkey "${ROOT}/build/id_ed25519.pub.toml" done fi - rm -rf build + rm -rf "${COOKBOOK_BUILD}" if [ "$PREPARE_COPY" -eq "0" ] then - mkdir build + mkdir "${COOKBOOK_BUILD}" else - cp -rp source build + cp -rp source "${COOKBOOK_BUILD}" fi for patch in *.patch do - patch -p1 -d build < "$patch" + patch -p1 -d "${COOKBOOK_BUILD}" < "$patch" done fi ;; unprepare) - rm -rf build - rm -rf sysroot + rm -rf "${COOKBOOK_BUILD}" + rm -rf "${COOKBOOK_SYSROOT}" ;; version) - pushd build > /dev/null + pushd "${COOKBOOK_BUILD}" > /dev/null skip=0 if [ "$(type -t recipe_version)" = "function" ] then @@ -317,15 +317,15 @@ function op { popd > /dev/null ;; gitversion) - if [ -d build/.git ] + if [ -d "${COOKBOOK_BUILD}"/.git ] then - echo "$(op $1 version)-$(git -C build rev-parse --short HEAD)" + echo "$(op $1 version)-$(git -C "${COOKBOOK_BUILD}" rev-parse --short HEAD)" else op $1 version fi ;; build) - pushd build > /dev/null + pushd "${COOKBOOK_BUILD}" > /dev/null skip=0 if [ "$(type -t recipe_build)" = "function" ] then @@ -352,7 +352,7 @@ function op { popd > /dev/null ;; test) - pushd build > /dev/null + pushd "${COOKBOOK_BUILD}" > /dev/null skip=0 if [ "$(type -t recipe_test)" = "function" ] then @@ -373,7 +373,7 @@ function op { popd > /dev/null ;; clean) - pushd build > /dev/null + pushd "${COOKBOOK_BUILD}" > /dev/null skip=0 if [ "$(type -t recipe_clean)" = "function" ] then @@ -387,10 +387,10 @@ function op { ;; stage) op $1 unstage - mkdir -p stage - stage="$(realpath stage)" + mkdir -p "${COOKBOOK_STAGE}" + stage="$(realpath "${COOKBOOK_STAGE}")" source="$(realpath source)" - pushd build > /dev/null + pushd "${COOKBOOK_BUILD}" > /dev/null skip=0 if [ "$(type -t recipe_stage)" = "function" ] then @@ -438,22 +438,22 @@ function op { popd > /dev/null ;; unstage) - rm -rfv stage + rm -rfv "${COOKBOOK_STAGE}" ;; pkg) pkgar \ create \ - --archive stage.pkgar \ + --archive "${COOKBOOK_STAGE}.pkgar" \ --skey "${ROOT}/build/id_ed25519.toml" \ - stage + "${COOKBOOK_STAGE}" ;; unpkg) - rm -fv stage.pkgar + rm -fv "${COOKBOOK_STAGE}.pkgar" ;; tar) - echo "name = \"$1\"" > "stage.toml" - echo "version = \"$(op $1 version)\"" >> "stage.toml" - echo "target = \"$TARGET\"" >> "stage.toml" + echo "name = \"$1\"" > "${COOKBOOK_STAGE}.toml" + echo "version = \"$(op $1 version)\"" >> "${COOKBOOK_STAGE}.toml" + echo "target = \"$TARGET\"" >> "${COOKBOOK_STAGE}.toml" # Add runtime dependencies to package if they exist if [ -n "$DEPENDS" ] @@ -461,32 +461,34 @@ function op { # 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" + echo "depends = [$dependencies]" >> "${COOKBOOK_STAGE}.toml" + else + echo "depends = []" >> "${COOKBOOK_STAGE}.toml" fi - rm -rf stage/pkg - mkdir -p stage/pkg + rm -rf "${COOKBOOK_STAGE}/pkg" + mkdir -p "${COOKBOOK_STAGE}/pkg" - pushd stage > /dev/null + pushd "${COOKBOOK_STAGE}" > /dev/null find -L . -type f | cut -d / -f 2- | sort | while read file do $SHASUM "$file" >> "pkg/$1.sha256sums" done popd > /dev/null - cp -v stage.toml "stage/pkg/$1.toml" - pkg --target=$TARGET create stage + cp -v "${COOKBOOK_STAGE}.toml" "${COOKBOOK_STAGE}/pkg/$1.toml" + pushd "$(dirname "${COOKBOOK_STAGE}")" > /dev/null + pkg --target="$TARGET" create "$(basename "${COOKBOOK_STAGE}")" + popd > /dev/null ;; untar) - rm -rfv stage.tar.gz stage.sig stage.toml + rm -rfv "${COOKBOOK_STAGE}.tar.gz" "${COOKBOOK_STAGE}.sig" "${COOKBOOK_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" + cp -v "${COOKBOOK_STAGE}.tar.gz" "$REPO/$1.tar.gz" + cp -v "${COOKBOOK_STAGE}.sig" "$REPO/$1.sig" + cp -v "${COOKBOOK_STAGE}.toml" "$REPO/$1.toml" ;; unpublish) rm -rfv "$REPO/$1.tar.gz" "$REPO/$1.sig" "$REPO/$1.toml" @@ -503,11 +505,18 @@ then then export COOKBOOK_RECIPE="${ROOT}/recipes/$1" + TARGET_DIR="${COOKBOOK_RECIPE}/target/${TARGET}" + mkdir -p "${TARGET_DIR}" + + export COOKBOOK_BUILD="${TARGET_DIR}/build" + export COOKBOOK_STAGE="${TARGET_DIR}/stage" + export COOKBOOK_SOURCE="${COOKBOOK_RECIPE}/source" + export COOKBOOK_SYSROOT="${TARGET_DIR}/sysroot" 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" + export PKG_CONFIG_LIBDIR="${COOKBOOK_SYSROOT}/lib/pkgconfig" + export PKG_CONFIG_SYSROOT_DIR="${COOKBOOK_SYSROOT}" cd "${COOKBOOK_RECIPE}" diff --git a/recipes/netsurf/recipe.sh b/recipes/netsurf/recipe.sh index 82c7ea748..ac4be6add 100644 --- a/recipes/netsurf/recipe.sh +++ b/recipes/netsurf/recipe.sh @@ -35,9 +35,9 @@ function recipe_clean { } function recipe_stage { - dest="$(realpath $1)" + dest="$(realpath "$1")" "$REDOX_MAKE" DESTDIR="$dest" install mkdir -pv "$dest/ui/apps" - cp -v ../manifest "$dest/ui/apps/00_netsurf" + cp -v "${COOKBOOK_RECIPE}/manifest" "$dest/ui/apps/00_netsurf" skip=1 } diff --git a/repo.sh b/repo.sh index 92aa673c2..f85b4da9a 100755 --- a/repo.sh +++ b/repo.sh @@ -22,17 +22,24 @@ fi for recipe in $recipes do - if [ -e "recipes/$recipe/recipe.toml" ] + COOKBOOK_RECIPE="recipes/$recipe" + TARGET_DIR="${COOKBOOK_RECIPE}/target/${TARGET}" + COOKBOOK_BUILD="${TARGET_DIR}/build" + COOKBOOK_STAGE="${TARGET_DIR}/stage" + COOKBOOK_SOURCE="${COOKBOOK_RECIPE}/source" + COOKBOOK_SYSROOT="${TARGET_DIR}/sysroot" + + if [ -e "${COOKBOOK_RECIPE}/recipe.toml" ] then target/release/cook "$recipe" - if [ ! -f "recipes/$recipe/stage.tar.gz" ] + if [ ! -f "${COOKBOOK_STAGE}.tar.gz" ] then echo -e "\033[01;38;5;155mrepo - legacy packaging $recipe\033[0m" >&2 ./cook.sh "$recipe" tar $DEBUG else - TIME_PKG="$($STAT -c "%Y" recipes/$recipe/stage.pkgar)" - TIME_STAGE="$($STAT -c "%Y" recipes/$recipe/stage.tar.gz)" + TIME_PKG="$($STAT -c "%Y" "${COOKBOOK_STAGE}.pkgar")" + TIME_STAGE="$($STAT -c "%Y" "${COOKBOOK_STAGE}.tar.gz")" if [ "$TIME_PKG" -gt "$TIME_STAGE" ] then echo -e "\033[01;38;5;155mrepo - legacy repackaging $recipe\033[0m" >&2 @@ -41,28 +48,28 @@ do fi # Match pkgar and tar time - touch --no-create --reference="recipes/$recipe/stage.tar.gz" "recipes/$recipe/stage.pkgar" + touch --no-create --reference="${COOKBOOK_STAGE}.tar.gz" "${COOKBOOK_STAGE}.pkgar" continue fi - if [ ! -d "recipes/$recipe/source/" ] + if [ ! -d "${COOKBOOK_SOURCE}" ] then echo -e "\033[01;38;5;155mrepo - fetching $recipe\033[0m" >&2 ./cook.sh "$recipe" fetch fi - if [ ! -d "recipes/$recipe/build/" ] + if [ ! -d "${COOKBOOK_BUILD}" ] then echo -e "\033[01;38;5;155mrepo - preparing $recipe\033[0m" >&2 ./cook.sh "$recipe" prepare - elif [ ! -d "recipes/$recipe/sysroot/" ] + elif [ ! -d "${COOKBOOK_SYSROOT}" ] then echo -e "\033[01;38;5;155mrepo - repreparing $recipe\033[0m" >&2 ./cook.sh "$recipe" unprepare prepare else - TIME_SOURCE="$($FIND recipes/$recipe/source/ -type f -not -path '*/.git*' -printf "%Ts\n" | sort -nr | head -n 1)" - TIME_BUILD="$($FIND recipes/$recipe/build/ -type f -not -path '*/.git*' -printf "%Ts\n" | sort -nr | head -n 1)" + TIME_SOURCE="$($FIND "${COOKBOOK_SOURCE}" -type f -not -path '*/.git*' -printf "%Ts\n" | sort -nr | head -n 1)" + TIME_BUILD="$($FIND "${COOKBOOK_BUILD}" -type f -not -path '*/.git*' -printf "%Ts\n" | sort -nr | head -n 1)" if [ "$TIME_SOURCE" -gt "$TIME_BUILD" ] then echo -e "\033[01;38;5;155mrepo - repreparing $recipe\033[0m" >&2 @@ -70,14 +77,14 @@ do fi fi - if [ ! -f "recipes/$recipe/stage.tar.gz" ] + if [ ! -f "${COOKBOOK_STAGE}.tar.gz" ] then echo -e "\033[01;38;5;155mrepo - building $recipe\033[0m" >&2 ./cook.sh "$recipe" build stage tar $DEBUG else - TIME_BUILD="$($FIND recipes/$recipe/build/ -type f -not -path '*/.git*' -printf "%Ts\n" | sort -nr | head -n 1)" - TIME_STAGE="$($STAT -c "%Y" recipes/$recipe/stage.tar.gz)" - TIME_RECIPE="$($FIND recipes/$recipe/{recipe.sh,*.patch} -printf '%Ts\n' | sort -nr | head -n 1)" + TIME_BUILD="$($FIND "${COOKBOOK_BUILD}" -type f -not -path '*/.git*' -printf "%Ts\n" | sort -nr | head -n 1)" + TIME_STAGE="$($STAT -c "%Y" "${COOKBOOK_STAGE}.tar.gz")" + TIME_RECIPE="$($FIND "${COOKBOOK_RECIPE}"/{recipe.sh,*.patch} -printf '%Ts\n' | sort -nr | head -n 1)" if [ "$TIME_BUILD" -gt "$TIME_STAGE" -o "$TIME_RECIPE" -gt "$TIME_STAGE" ] then echo -e "\033[01;38;5;155mrepo - rebuilding $recipe\033[0m" >&2 @@ -87,13 +94,13 @@ do fi fi - if [ ! -f "recipes/$recipe/stage.pkgar" ] + if [ ! -f "${COOKBOOK_STAGE}.pkgar" ] then echo -e "\033[01;38;5;155mrepo - packaging $recipe\033[0m" >&2 ./cook.sh "$recipe" pkg $DEBUG else - TIME_STAGE="$($STAT -c "%Y" recipes/$recipe/stage.tar.gz)" - TIME_PKG="$($STAT -c "%Y" recipes/$recipe/stage.pkgar)" + TIME_STAGE="$($STAT -c "%Y" "${COOKBOOK_STAGE}.tar.gz")" + TIME_PKG="$($STAT -c "%Y" "${COOKBOOK_STAGE}.pkgar")" if [ "$TIME_STAGE" -gt "$TIME_PKG" ] then echo -e "\033[01;38;5;155mrepo - repackaging $recipe\033[0m" >&2 @@ -106,16 +113,20 @@ mkdir -p "$REPO" for recipe in $recipes do - if [ "recipes/$recipe/stage.tar.gz" -nt "$REPO/$recipe.tar.gz" ] + COOKBOOK_RECIPE="recipes/$recipe" + TARGET_DIR="${COOKBOOK_RECIPE}/target/${TARGET}" + COOKBOOK_STAGE="${TARGET_DIR}/stage" + + if [ "${COOKBOOK_STAGE}.tar.gz" -nt "$REPO/$recipe.tar.gz" ] then echo -e "\033[01;38;5;155mrepo - publishing $recipe\033[0m" >&2 ./cook.sh $recipe publish fi - if [ "recipes/$recipe/stage.pkgar" -nt "$REPO/$recipe.pkgar" ] + if [ "${COOKBOOK_STAGE}.pkgar" -nt "$REPO/$recipe.pkgar" ] then echo -e "\033[01;38;5;155mrepo - publishing $recipe\033[0m" >&2 - cp -v "recipes/$recipe/stage.pkgar" "$REPO/$recipe.pkgar" + cp -v "${COOKBOOK_STAGE}.pkgar" "$REPO/$recipe.pkgar" fi done diff --git a/src/bin/cook.rs b/src/bin/cook.rs index f87c257db..5d36682da 100644 --- a/src/bin/cook.rs +++ b/src/bin/cook.rs @@ -374,10 +374,10 @@ fi"#); Ok(source_dir) } -fn build(recipe_dir: &Path, source_dir: &Path, build: &BuildRecipe) -> Result<PathBuf, String> { +fn build(recipe_dir: &Path, source_dir: &Path, target_dir: &Path, build: &BuildRecipe) -> Result<PathBuf, String> { let source_modified = modified_dir_ignore_git(&source_dir)?; - let sysroot_dir = recipe_dir.join("sysroot"); + let sysroot_dir = target_dir.join("sysroot"); // Rebuild sysroot if source is newer //TODO: rebuild on recipe changes if sysroot_dir.is_dir() { @@ -388,7 +388,7 @@ fn build(recipe_dir: &Path, source_dir: &Path, build: &BuildRecipe) -> Result<Pa } if ! sysroot_dir.is_dir() { // Create sysroot.tmp - let sysroot_dir_tmp = recipe_dir.join("sysroot.tmp"); + let sysroot_dir_tmp = target_dir.join("sysroot.tmp"); create_dir_clean(&sysroot_dir_tmp)?; // Make sure sysroot/include exists @@ -399,7 +399,7 @@ fn build(recipe_dir: &Path, source_dir: &Path, build: &BuildRecipe) -> Result<Pa for dependency in build.dependencies.iter() { let public_path = "build/id_ed25519.pub.toml"; //TODO: sanitize name - let archive_path = format!("recipes/{}/stage.pkgar", dependency); + let archive_path = format!("recipes/{}/target/{}/stage.pkgar", dependency, redoxer::target()); pkgar::extract( public_path, &archive_path, @@ -416,7 +416,7 @@ fn build(recipe_dir: &Path, source_dir: &Path, build: &BuildRecipe) -> Result<Pa rename(&sysroot_dir_tmp, &sysroot_dir)?; } - let stage_dir = recipe_dir.join("stage"); + let stage_dir = target_dir.join("stage"); // Rebuild stage if source is newer //TODO: rebuild on recipe changes if stage_dir.is_dir() { @@ -427,12 +427,12 @@ fn build(recipe_dir: &Path, source_dir: &Path, build: &BuildRecipe) -> Result<Pa } if ! stage_dir.is_dir() { // Create stage.tmp - let stage_dir_tmp = recipe_dir.join("stage.tmp"); + let stage_dir_tmp = target_dir.join("stage.tmp"); create_dir_clean(&stage_dir_tmp)?; // Create build, if it does not exist //TODO: flag for clean builds where build is wiped out - let build_dir = recipe_dir.join("build"); + let build_dir = target_dir.join("build"); if ! build_dir.is_dir() { create_dir_clean(&build_dir)?; } @@ -554,7 +554,7 @@ done Ok(stage_dir) } -fn package(recipe_dir: &Path, stage_dir: &Path, package: &PackageRecipe) -> Result<PathBuf, String> { +fn package(recipe_dir: &Path, stage_dir: &Path, target_dir: &Path, package: &PackageRecipe) -> Result<PathBuf, String> { //TODO: metadata like dependencies, name, and version let secret_path = "build/id_ed25519.toml"; @@ -574,7 +574,7 @@ fn package(recipe_dir: &Path, stage_dir: &Path, package: &PackageRecipe) -> Resu ))?; } - let package_file = recipe_dir.join("stage.pkgar"); + let package_file = target_dir.join("stage.pkgar"); // Rebuild package if stage is newer //TODO: rebuild on recipe changes if package_file.is_file() { @@ -606,12 +606,21 @@ fn cook(recipe_dir: &Path, recipe: &Recipe, fetch_only: bool) -> Result<(), Stri if fetch_only { return Ok(()); } - let stage_dir = build(&recipe_dir, &source_dir, &recipe.build).map_err(|err| format!( + let target_parent_dir = recipe_dir.join("target"); + if ! target_parent_dir.is_dir() { + create_dir(&target_parent_dir)?; + } + let target_dir = target_parent_dir.join(redoxer::target()); + if ! target_dir.is_dir() { + create_dir(&target_dir)?; + } + + let stage_dir = build(&recipe_dir, &source_dir, &target_dir, &recipe.build).map_err(|err| format!( "failed to build: {}", err ))?; - let package_file = package(&recipe_dir, &stage_dir, &recipe.package).map_err(|err| format!( + let package_file = package(&recipe_dir, &stage_dir, &target_dir, &recipe.package).map_err(|err| format!( "failed to package: {}", err ))?; -- GitLab