From 161d45feb55fde0e00e3e065ddd800529bdd1074 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 3 Jul 2011 08:44:19 +0200 Subject: [PATCH] Support for package "update" build profile action * Add global HAIKU_PACKAGES_UPDATE_ONLY build system variable, which is set for the "update" and "update-all" build profile actions. * Change the HAIKU_INCLUDE_IN_CONTAINER_VAR variable on packages to HAIKU_INCLUDE_IN_PACKAGES for all packages. The variable is also set for the "update" and "update-all" build profile actions. * Introduce HAIKU_CONTAINER_INHERIT_UPDATE_VARIABLE on container variable. If set, the contained variable will be set on the container when one or more files in it are updated. It is set on packages so an update of a file in a package causes the package to be updated in the image. * Introduce HAIKU_CONTAINER_ALWAYS_CREATE_DIRECTORIES on container variable. If set, directories will be created also in update mode. It is set on packages. --- build/jam/ImageRules | 16 +++++++++++++++- build/jam/MiscRules | 4 ++++ build/jam/PackageRules | 13 +++++++++++-- build/scripts/build_haiku_package | 10 +++++++--- 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/build/jam/ImageRules b/build/jam/ImageRules index 48fb107f73..ae4ecd6516 100644 --- a/build/jam/ImageRules +++ b/build/jam/ImageRules @@ -177,6 +177,18 @@ rule AddFilesToContainer container : directoryTokens : targets : destName if $(filterVar) { targets = [ FilterContainerUpdateTargets $(targets) : $(filterVar) ] ; + + # If there are any targets, mark the container as to be included in + # an update, too, if it has set the update inheritance variable. + # This makes updating a target that lives in a package on an image + # work. + if $(targets) { + local updateVariable = [ on $(container) return + $(HAIKU_CONTAINER_INHERIT_UPDATE_VARIABLE) ] ; + if $(updateVariable) { + $(updateVariable) on $(container) = 1 ; + } + } } } @@ -480,7 +492,9 @@ rule CreateContainerMakeDirectoriesScript container : script # If the image shall only be updated, we don't create directories. if $(dirsToCreate) && ( ! [ on $(container) return $(HAIKU_CONTAINER_UPDATE_ONLY) ] - || [ IncludeAllTargetsInContainer $(container) ] ) { + || [ IncludeAllTargetsInContainer $(container) ] + || [ on $(container) return + $(HAIKU_CONTAINER_ALWAYS_CREATE_DIRECTORIES) ] ) { Depends $(scriptBody) : $(dirsToCreate) ; CreateContainerMakeDirectoriesScript1 $(scriptBody) : $(dirsToCreate) ; diff --git a/build/jam/MiscRules b/build/jam/MiscRules index 973c368e08..326f0b90d1 100644 --- a/build/jam/MiscRules +++ b/build/jam/MiscRules @@ -394,13 +394,17 @@ rule DefineBuildProfile name : type : path { case "update" : { JAM_TARGETS = $(buildTarget) ; SetUpdateHaikuImageOnly 1 ; + HAIKU_PACKAGES_UPDATE_ONLY = 1 ; HAIKU_INCLUDE_IN_IMAGE on $(HAIKU_BUILD_PROFILE_PARAMETERS) = 1 ; + HAIKU_INCLUDE_IN_PACKAGES on $(HAIKU_BUILD_PROFILE_PARAMETERS) = 1 ; } case "update-all" : { JAM_TARGETS = $(buildTarget) ; SetUpdateHaikuImageOnly 1 ; + HAIKU_PACKAGES_UPDATE_ONLY = 1 ; HAIKU_INCLUDE_IN_IMAGE = 1 ; + HAIKU_INCLUDE_IN_PACKAGES = 1 ; } case "mount" : { diff --git a/build/jam/PackageRules b/build/jam/PackageRules index b6bf583e35..4011cb8e37 100644 --- a/build/jam/PackageRules +++ b/build/jam/PackageRules @@ -268,13 +268,20 @@ rule HaikuPackage package local grist = [ FHaikuPackageGrist $(package) ] ; HAIKU_CONTAINER_GRIST on $(package) = $(grist) ; - HAIKU_INCLUDE_IN_CONTAINER_VAR on $(package) - = $(grist)_HAIKU_INCLUDE_IN_PACKAGE ; + HAIKU_INCLUDE_IN_CONTAINER_VAR on $(package) = HAIKU_INCLUDE_IN_PACKAGES ; HAIKU_INSTALL_TARGETS_VAR on $(package) = $(grist)_HAIKU_PACKAGE_INSTALL_TARGETS ; HAIKU_CONTAINER_SYSTEM_DIR_TOKENS on $(package) = ; HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE = $(package) ; + + if $(HAIKU_PACKAGES_UPDATE_ONLY) { + HAIKU_CONTAINER_UPDATE_ONLY on $(package) = 1 ; + HAIKU_CONTAINER_INHERIT_UPDATE_VARIABLE on $(package) + = HAIKU_INCLUDE_IN_IMAGE ; + } + + HAIKU_CONTAINER_ALWAYS_CREATE_DIRECTORIES on $(package) = 1 ; } @@ -301,6 +308,8 @@ rule BuildHaikuPackage package : packageInfo AddVariableToScript $(script) : tmpDir : $(tempDir) ; AddVariableToScript $(script) : addBuildCompatibilityLibDir : $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) ; + AddVariableToScript $(script) : updateOnly + : [ on $(package) return $(HAIKU_CONTAINER_UPDATE_ONLY) ] ; AddTargetVariableToScript $(script) : addattr ; AddTargetVariableToScript $(script) : copyattr ; AddTargetVariableToScript $(script) : package ; diff --git a/build/scripts/build_haiku_package b/build/scripts/build_haiku_package index 0e8228dd88..fbbefdfd81 100755 --- a/build/scripts/build_haiku_package +++ b/build/scripts/build_haiku_package @@ -6,6 +6,7 @@ set -o errexit # outputDir # tmpDir # addBuildCompatibilityLibDir +# updateOnly # # addattr # copyattr @@ -23,7 +24,6 @@ fi packagePath="$1" packageInfoPath="$2" shift 2 -echo "Building package $1 with info $2..." if [ $# -gt 0 ]; then . $1 @@ -61,5 +61,9 @@ done # create the package -rm -f "$packagePath" -$package create -i "$packageInfoPath" -C "$contentsDir" "$packagePath" +if [ ! $updateOnly ]; then + rm -f "$packagePath" + $package create -q -i "$packageInfoPath" -C "$contentsDir" "$packagePath" +else + $package add -q -f -i "$packageInfoPath" -C "$contentsDir" "$packagePath" . +fi