diff --git a/Jamrules b/Jamrules index 5c47a6ab59..5e21bab6bb 100644 --- a/Jamrules +++ b/Jamrules @@ -64,6 +64,7 @@ for repository in HaikuPorts { = [ FDirName $(repositoriesDirectory) $(repository) ] ; local file = [ Glob $(repositoryDirectory) : $(HAIKU_PACKAGING_ARCH) ] ; if $(file) { + HAIKU_REPOSITORY_JAMFILE = $(file) ; include $(file) ; } } diff --git a/build/jam/BuildSetup b/build/jam/BuildSetup index 49596630c4..fd4ec32255 100644 --- a/build/jam/BuildSetup +++ b/build/jam/BuildSetup @@ -1240,11 +1240,16 @@ HAIKU_APP_TEST_DIR ?= [ FDirName $(HAIKU_TEST_DIR) apps ] ; HAIKU_APP_TEST_LIB_DIR ?= [ FDirName $(HAIKU_APP_TEST_DIR) lib ] ; HAIKU_TMP_DIR ?= [ FDirName $(HAIKU_OUTPUT_DIR) tmp ] ; -HAIKU_PACKAGES_DIR = [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR) - packages ] ; -HAIKU_PACKAGES_BUILD_DIR = [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR) - packages_build ] ; -HAIKU_PACKAGE_INFOS_DIR = [ FDirName $(HAIKU_TOP) src data package_infos ] ; +HAIKU_PACKAGING_BASE_DIR = [ FDirName $(TARGET_OBJECT_BASE_DIR) + $(HAIKU_PACKAGING_ARCH) packaging ] ; +HAIKU_PACKAGES_DIR = [ FDirName $(HAIKU_PACKAGING_BASE_DIR) + packages ] ; +HAIKU_PACKAGES_BUILD_DIR = [ FDirName $(HAIKU_PACKAGING_BASE_DIR) + packages_build ] ; +HAIKU_PACKAGE_REPOSITORIES_DIR = [ FDirName $(HAIKU_PACKAGING_BASE_DIR) + repositories ] ; +HAIKU_PACKAGE_INFOS_DIR = [ FDirName $(HAIKU_TOP) src data + package_infos ] ; TARGET_TEST_DIR ?= [ FDirName $(HAIKU_TEST_DIR) $(TARGET_PLATFORM) ] ; diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index df1fc226f8..6aac8e0a7d 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -463,20 +463,13 @@ AddTargetVariableToScript $(script) : $(commonPackages) : commonPackages ; # Generate the repository package lists and add variables for the repositories. local repository ; +local repositoryFiles ; for repository in $(HAIKU_REPOSITORIES) { - local packageListFile = $(repository:G=repository-package-list) ; - MakeLocate $(packageListFile) - : [ FDirName $(TARGET_OBJECT_BASE_DIR) $(HAIKU_PACKAGING_ARCH) ] ; - Always $(packageListFile) ; - GeneratedRepositoryPackageList $(packageListFile) : $(repository) ; - - AddTargetVariableToScript $(script) : $(packageListFile) - : repositoryPackageList_$(repository:G=) ; - AddVariableToScript $(script) : repositoryUrl_$(repository:G=) - : [ on $(repository) return $(HAIKU_REPOSITORY_URL) ] ; + repositoryFiles + += [ on $(repository) return $(HAIKU_REPOSITORY_CACHE_FILE) ] ; } -AddVariableToScript $(script) : repositories : $(HAIKU_REPOSITORIES:G=) ; +AddTargetVariableToScript $(script) : $(repositoryFiles) : repositories ; # create the other scripts HAIKU_IMAGE_MAKE_DIRS_SCRIPT = haiku.image-make-dirs ; diff --git a/build/jam/RepositoryRules b/build/jam/RepositoryRules index 7dab8d6ccd..6b65180482 100644 --- a/build/jam/RepositoryRules +++ b/build/jam/RepositoryRules @@ -39,8 +39,8 @@ rule AddRepositoryPackages repository : architecture : packages : sourcePackages } -rule PackageRepository repository : architecture : url : anyPackages : packages - : sourcePackages +rule PackageRepository repository : architecture : repositoryUrl : packagesUrl + : anyPackages : packages : sourcePackages { repository = $(repository:G=repository) ; @@ -49,12 +49,52 @@ rule PackageRepository repository : architecture : url : anyPackages : packages } HAIKU_REPOSITORIES += $(repository) ; - HAIKU_REPOSITORY_URL on $(repository) = $(url) ; + HAIKU_REPOSITORY_URL on $(repository) = $(repositoryUrl) ; + HAIKU_REPOSITORY_PACKAGES_URL on $(repository) = $(packagesUrl) ; + HAIKU_REPOSITORY_DEFINITION_FILE on $(repository) + = $(HAIKU_REPOSITORY_JAMFILE) ; AddRepositoryPackages $(repository) : any : $(anyPackages) : $(sourcePackages) ; AddRepositoryPackages $(repository) : $(architecture) : $(packages) : $(sourcePackages) ; + + # build package list file + local packageListFile = $(repository:G=repository-package-list)-packages ; + MakeLocate $(packageListFile) : $(HAIKU_PACKAGE_REPOSITORIES_DIR) ; + GeneratedRepositoryPackageList $(packageListFile) : $(repository) ; + + # build package list checksum file + local packagesChecksumFile + = $(repository:G=repository-package-checksum)-checksum ; + MakeLocate $(packagesChecksumFile) : $(HAIKU_PACKAGE_REPOSITORIES_DIR) ; + Depends $(packagesChecksumFile) : $(packageListFile) ; + ChecksumFileSHA256 $(packagesChecksumFile) : $(packageListFile) ; + + # download repository info file + local repositoryInfo = $(repository:G=repository-info)-info ; + MakeLocate $(repositoryInfo) : $(HAIKU_PACKAGE_REPOSITORIES_DIR) ; + local repoUrl = [ on $(repository) return $(HAIKU_REPOSITORY_URL) ] ; + DownloadLocatedFile $(repositoryInfo) + : "$(repoUrl)/`cat $source`/repo.info" + : $(packagesChecksumFile) ; + + # download repository file + local repositoryFile = $(repository:G=repository-cache) ; + MakeLocate $(repositoryFile) : $(HAIKU_PACKAGE_REPOSITORIES_DIR) ; + local repoUrl = [ on $(repository) return $(HAIKU_REPOSITORY_URL) ] ; + DownloadLocatedFile $(repositoryFile) + : "$(repoUrl)/`cat $source`/repo" + : $(packagesChecksumFile) ; + + # build repository config file + local repositoryConfig = $(repository:G=repository-config)-config ; + MakeLocate $(repositoryConfig) : $(HAIKU_PACKAGE_REPOSITORIES_DIR) ; + RepositoryConfig $(repositoryConfig) : $(repositoryInfo) + : $(packagesChecksumFile) : $(repository) ; + + HAIKU_REPOSITORY_CACHE_FILE on $(repository) = $(repositoryFile) ; + HAIKU_REPOSITORY_CONFIG_FILE on $(repository) = $(repositoryConfig) ; } @@ -69,6 +109,10 @@ rule GeneratedRepositoryPackageList target : repository fileNames += [ on $(package) return $(HAIKU_PACKAGE_FILE_NAME) ] ; } + local definitionFile + = [ on $(repository) return $(HAIKU_REPOSITORY_DEFINITION_FILE) ] ; + Depends $(target) : $(definitionFile) ; + HAIKU_REPOSITORY_PACKAGE_FILE_NAMES on $(target) = $(fileNames) ; GeneratedRepositoryPackageList1 $(target) ; } @@ -82,6 +126,26 @@ actions GeneratedRepositoryPackageList1 } +rule RepositoryConfig repoConfig : repoInfo : packagesChecksumFile : repository +{ + repository = $(repository:G=repository) ; + + HAIKU_REPOSITORY_URL on $(repoConfig) + = [ on $(repository) return $(HAIKU_REPOSITORY_URL) ] ; + Depends $(repoConfig) + : create_repository_config $(repoInfo) $(packagesChecksumFile) ; + RepositoryConfig1 $(repoConfig) + : create_repository_config $(repoInfo) $(packagesChecksumFile) ; +} + + +actions RepositoryConfig1 +{ + $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) + $(2[1]) $(HAIKU_REPOSITORY_URL)/`cat $(2[3])` $(2[2]) $(1) +} + + rule IsPackageAvailable package { if $(package) in $(HAIKU_AVAILABLE_PACKAGES) { @@ -107,7 +171,8 @@ rule PackageURL packageName = [ on $(packageFamily) return $(HAIKU_PACKAGE_VERSIONS[1]) ] ; local fileName = [ on $(package) return $(HAIKU_PACKAGE_FILE_NAME) ] ; local repository = [ on $(package) return $(HAIKU_PACKAGE_REPOSITORY) ] ; - local baseUrl = [ on $(repository) return $(HAIKU_REPOSITORY_URL) ] ; + local baseUrl + = [ on $(repository) return $(HAIKU_REPOSITORY_PACKAGES_URL) ] ; return $(baseUrl)/$(fileName) ; } diff --git a/build/jam/repositories/HaikuPorts/x86_gcc2 b/build/jam/repositories/HaikuPorts/x86_gcc2 index 3765f5b134..0249ff6114 100644 --- a/build/jam/repositories/HaikuPorts/x86_gcc2 +++ b/build/jam/repositories/HaikuPorts/x86_gcc2 @@ -1,5 +1,6 @@ PackageRepository HaikuPorts : x86_gcc2 + : http://haiku-files.org/files/repo : http://haiku-files.org/files/hpkg : # architecture "any" packages diff --git a/build/scripts/build_haiku_image b/build/scripts/build_haiku_image index 4ee1bd15f1..52f70c23df 100755 --- a/build/scripts/build_haiku_image +++ b/build/scripts/build_haiku_image @@ -8,6 +8,7 @@ set -o errexit # addBuildCompatibilityLibDir # systemPackages, commonPackages - lists of the hpkg packages copied/updated # (in "system" and "common" respectively) +# repositories - all repository files # downloadDir # The following are only for image types: # installDir @@ -306,21 +307,8 @@ done if [ -n "$resolvePackageDependencies" ]; then echo "Resolving package dependencies ..." - repoFiles= - for repository in $repositories; do - eval 'repositoryPackageList=$repositoryPackageList_'$repository - eval 'repositoryUrl=$repositoryUrl_'$repository - packageListHash=`sha256sum $repositoryPackageList \ - | sed -r 's,([^[:space:]]*).*,\1,'` - repoFileName=repo-$packageListHash - repoFileUrl="$repositoryUrl/repos/$repoFileName" - repoFilePath="$downloadDir/$repoFileName" - downloadFile $repoFileUrl $repoFilePath - repoFiles="$repoFiles $repoFilePath" - done - # additional packages for system - packageUrls=`$getPackageDependencies $repoFiles -- $systemPackages` + packageUrls=`$getPackageDependencies $repositories -- $systemPackages` for packageUrl in $packageUrls; do packageFileName=`basename $packageUrl` packageFilePath="$downloadDir/$packageFileName" @@ -330,7 +318,7 @@ if [ -n "$resolvePackageDependencies" ]; then done # additional packages for common - packageUrls=`$getPackageDependencies $repoFiles -- $systemPackages \ + packageUrls=`$getPackageDependencies $repositories -- $systemPackages \ $commonPackages` for packageUrl in $packageUrls; do packageFileName=`basename $packageUrl`