1#pragma mark - Private 2 3# default value for the build profile that defines the set of source packages 4# that will be put onto the bootstrap image 5HAIKU_BOOTSTRAP_SOURCES_PROFILE ?= @minimum-raw ; 6 7rule PackageFamily packageBaseName 8{ 9 return $(packageBaseName:G=package-family) ; 10} 11 12 13rule SetRepositoryMethod repository : methodName : method 14{ 15 HAIKU_REPOSITORY_METHOD_$(methodName) on $(repository) = $(method) ; 16} 17 18rule InvokeRepositoryMethod repository : methodName : arg1 : arg2 : arg3 : arg4 19 : arg5 : arg6 : arg7 20{ 21 local method 22 = [ on $(repository) return $(HAIKU_REPOSITORY_METHOD_$(methodName)) ] ; 23 if ! $(method) { 24 Exit "Method" $(methodName) " not defined for repository" 25 $(repository) ; 26 } 27 28 return [ $(method) $(repository) : $(arg1) : $(arg2) : $(arg3) : $(arg4) 29 : $(arg5) : $(arg6) : $(arg7) ] ; 30} 31 32 33rule AddRepositoryPackage repository : architecture : baseName : version 34{ 35 local package = $(baseName)-$(version) ; 36 package = $(package:E=$(baseName):G=package-in-$(repository:G=)) ; 37 HAIKU_PACKAGE_REPOSITORY on $(package) = $(repository) ; 38 HAIKU_PACKAGE_ARCHITECTURE on $(package) = $(architecture) ; 39 local packageFileName = $(package:G=)-$(architecture).hpkg ; 40 HAIKU_PACKAGE_FILE_NAME on $(package) = $(packageFileName) ; 41 42 local packageFamily = [ InvokeRepositoryMethod $(repository) : PackageFamily 43 : $(baseName) ] ; 44 baseName = $(packageFamily:G=) ; 45 46 if $(HAIKU_NO_DOWNLOADS) = 1 && $(HAIKU_IS_BOOTSTRAP) != 1 { 47 # Only add packages to repository that already exist in download 48 # directory. 49 if ! [ Glob $(HAIKU_DOWNLOAD_DIR) : $(packageFileName) ] { 50 return ; 51 } 52 } 53 54 if ! $(baseName) in $(HAIKU_AVAILABLE_PACKAGES) { 55 HAIKU_AVAILABLE_PACKAGES += $(baseName) ; 56 } 57 58 HAIKU_PACKAGE_VERSIONS on $(packageFamily) += $(package) ; 59 HAIKU_REPOSITORY_PACKAGES on $(repository) += $(package) ; 60 61 return $(package) ; 62} 63 64 65rule AddRepositoryPackages repository : architecture : packages : sourcePackages 66 : debugInfoPackages 67{ 68 local packageTargets ; 69 local package ; 70 for package in $(packages) { 71 local splitName = [ Match "([^-]*)-(.*)" : $(package) ] ; 72 local baseName = $(splitName[1]:E=$(package)) ; 73 local version = $(splitName[2]) ; 74 packageTargets += [ AddRepositoryPackage $(repository) : $(architecture) 75 : $(baseName) : $(version) ] ; 76 if $(baseName) in $(sourcePackages) { 77 AddRepositoryPackage $(repository) : source : $(baseName)_source 78 : $(version) ; 79 } 80 if $(baseName) in $(debugInfoPackages) { 81 packageTargets += [ AddRepositoryPackage $(repository) 82 : $(architecture) : $(baseName)_debuginfo : $(version) ] ; 83 } 84 } 85 86 return $(packageTargets) ; 87} 88 89 90rule PackageRepository repository : architecture : anyPackages : packages 91 : sourcePackages : debugInfoPackages 92{ 93 if $(architecture) != $(HAIKU_PACKAGING_ARCHS[1]) { 94 return ; 95 } 96 97 HAIKU_REPOSITORIES += $(repository) ; 98 HAIKU_REPOSITORY_DEFINITION_FILE on $(repository) 99 = $(HAIKU_REPOSITORY_JAMFILE) ; 100 101 return [ AddRepositoryPackages $(repository) : any : $(anyPackages) 102 : $(sourcePackages) : $(debugInfoPackages) ] 103 [ AddRepositoryPackages $(repository) : $(architecture) : $(packages) 104 : $(sourcePackages) : $(debugInfoPackages) ] ; 105} 106 107 108#pragma mark - Remote Repository 109 110 111rule RemoteRepositoryPackageFamily repository : packageBaseName 112{ 113 return [ PackageFamily $(packageBaseName) ] ; 114} 115 116 117rule RemoteRepositoryFetchPackage repository : package : fileName 118{ 119 local baseUrl = [ on $(repository) return $(HAIKU_REPOSITORY_URL) ] ; 120 local packagesChecksumFile 121 = [ on $(repository) 122 return $(HAIKU_REPOSITORY_PACKAGES_CHECKSUM_FILE) ] ; 123 124 local downloadedFile = [ DownloadFile $(fileName) 125 : "$(baseUrl)/`cat $source`/packages/$(fileName)" 126 : $(packagesChecksumFile) ] ; 127 NoUpdate $(downloadedFile) ; 128 # Don't download the file again when something in the repository 129 # changes. It is (supposed to be) still the same file. 130 return $(downloadedFile) ; 131} 132 133 134rule RemotePackageRepository repository : architecture : repositoryUrl 135 : anyPackages : packages : sourcePackages : debugInfoPackages 136{ 137 repository = $(repository:G=repository) ; 138 139 if ! $(HOST_EXTENDED_REGEX_SED) { 140 ECHO "Variable HOST_EXTENDED_REGEX_SED not set. Please run ./configure or" ; 141 EXIT "specify it manually." ; 142 } 143 144 SetRepositoryMethod $(repository) : PackageFamily 145 : RemoteRepositoryPackageFamily ; 146 SetRepositoryMethod $(repository) : FetchPackage 147 : RemoteRepositoryFetchPackage ; 148 149 HAIKU_REPOSITORY_URL on $(repository) = $(repositoryUrl) ; 150 151 PackageRepository $(repository) : $(architecture) : $(anyPackages) 152 : $(packages) : $(sourcePackages) : $(debugInfoPackages) ; 153 154 # build package list file 155 local packageListFile = $(repository:G=repository-package-list)-packages ; 156 local repositoriesDir = $(HAIKU_PACKAGE_REPOSITORIES_DIR_$(architecture)) ; 157 MakeLocate $(packageListFile) : $(repositoriesDir) ; 158 GeneratedRepositoryPackageList $(packageListFile) : $(repository) ; 159 160 # build package list checksum file 161 local packagesChecksumFile 162 = $(repository:G=repository-package-checksum)-checksum ; 163 local thisPackageRepositoryFile = [ Glob [ FDirName 164 $(HAIKU_BUILD_RULES_DIR) repositories HaikuPorts ] : 165 $(HAIKU_PACKAGING_ARCH) ] ; 166 MakeLocate $(packagesChecksumFile) : $(repositoriesDir) ; 167 Depends $(packagesChecksumFile) : $(thisPackageRepositoryFile) ; 168 ChecksumFileSHA256 $(packagesChecksumFile) : $(thisPackageRepositoryFile) ; 169 170 local repositoryInfo = $(repository:G=repository-info)-info ; 171 local repositoryFile = $(repository:G=repository-cache) ; 172 local repositoryConfig = $(repository:G=repository-config)-config ; 173 MakeLocate $(repositoryInfo) $(repositoryFile) $(repositoryConfig) 174 : $(repositoriesDir) ; 175 # Use a locally created dummy repository if downloads have been disabled. 176 # This is useful when trying to build everything locally from source. 177 if $(HAIKU_NO_DOWNLOADS) = 1 { 178 # build repository file 179 local packageFileNames = [ 180 on $(packageListFile) return $(HAIKU_REPOSITORY_PACKAGE_FILE_NAMES) 181 ] ; 182 local packageFiles ; 183 local packageFile ; 184 for packageFile in $(packageFileNames) { 185 MakeLocate $(packageFile) : $(HAIKU_DOWNLOAD_DIR) ; 186 packageFiles += $(packageFile) ; 187 } 188 RepositoryCache $(repositoryFile) : $(repositoryInfo) 189 : $(packageFiles) ; 190 } else { 191 # download repository file 192 local repoUrl = [ on $(repository) return $(HAIKU_REPOSITORY_URL) ] ; 193 DownloadLocatedFile $(repositoryFile) 194 : "$(repoUrl)/`cat $source`/repo" 195 : $(packagesChecksumFile) ; 196 } 197 198 # build the repository info file 199 local repositoryInfoTemplate = <repository-info-template>haikuports ; 200 SEARCH on $(repositoryInfoTemplate) 201 = $(HAIKU_TOP)/src/data/repository_infos ; 202 PreprocessPackageOrRepositoryInfo $(repositoryInfo) 203 : $(repositoryInfoTemplate) : $(architecture) ; 204 205 # build repository config file 206 RepositoryConfig $(repositoryConfig) : $(repositoryInfo) 207 : $(packagesChecksumFile) ; 208 209 HAIKU_REPOSITORY_CACHE_FILE on $(repository) = $(repositoryFile) ; 210 HAIKU_REPOSITORY_CONFIG_FILE on $(repository) = $(repositoryConfig) ; 211 HAIKU_REPOSITORY_PACKAGES_CHECKSUM_FILE on $(repository) 212 = $(packagesChecksumFile) ; 213} 214 215 216rule GeneratedRepositoryPackageList target : repository 217{ 218 repository = $(repository:G=repository) ; 219 220 # construct a list of file names 221 local fileNames ; 222 local package ; 223 for package in [ on $(repository) return $(HAIKU_REPOSITORY_PACKAGES) ] { 224 fileNames += [ on $(package) return $(HAIKU_PACKAGE_FILE_NAME) ] ; 225 } 226 227 local definitionFile 228 = [ on $(repository) return $(HAIKU_REPOSITORY_DEFINITION_FILE) ] ; 229 Depends $(target) : $(definitionFile) ; 230 231 HAIKU_REPOSITORY_PACKAGE_FILE_NAMES on $(target) = $(fileNames) ; 232 GeneratedRepositoryPackageList1 $(target) ; 233} 234 235 236actions GeneratedRepositoryPackageList1 237{ 238 (for file in $(HAIKU_REPOSITORY_PACKAGE_FILE_NAMES) ; do 239 echo $file 240 done) | LC_ALL=C sort -u > $(1) 241} 242 243 244rule RepositoryConfig repoConfig : repoInfo : checksumFile 245{ 246 Depends $(repoConfig) 247 : <build>create_repository_config $(repoInfo) $(checksumFile) ; 248 RepositoryConfig1 $(repoConfig) 249 : <build>create_repository_config $(repoInfo) $(checksumFile) ; 250} 251 252 253actions RepositoryConfig1 254{ 255 version= 256 if [ -n "$(2[3]:E)" ]; then 257 version=`cat "$(2[3]:E)"` 258 fi 259 $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) \ 260 $(2[1]) $(2[2]) $(1) 261} 262 263 264rule RepositoryCache repoCache : repoInfo : packageFiles 265{ 266 Depends $(repoCache) 267 : <build>package_repo $(repoInfo) $(packageFiles) ; 268 RepositoryCache1 $(repoCache) 269 : <build>package_repo $(repoInfo) $(packageFiles) ; 270} 271 272 273actions RepositoryCache1 274{ 275 $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) \ 276 $(2[1]) create -q $(2[2-]) 277 mv $(1:B=repo) $(1) 278} 279 280 281#pragma mark - Bootstrap Repository 282 283 284rule BootstrapRepositoryPackageFamily repository : packageBaseName 285{ 286 local splitBaseName = [ Match "(.*)_bootstrap(.*)" : $(packageBaseName) ] ; 287 if $(splitBaseName) { 288 packageBaseName = $(splitBaseName[1])$(splitBaseName[2]) ; 289 } 290 291 return [ PackageFamily $(packageBaseName) ] ; 292} 293 294 295rule BootstrapRepositoryFetchPackage repository : package : fileName 296{ 297 local outputDir 298 = [ on $(repository) return $(HAIKU_REPOSITORY_BUILD_DIRECTORY) ] ; 299 local configFile 300 = [ on $(repository) return $(HAIKU_REPOSITORY_BUILD_CONFIG_FILE) ] ; 301 local haikuCrossDevelPackages = [ on $(package) 302 return $(HAIKU_REPOSITORY_HAIKU_CROSS_DEVEL_PACKAGES) ] ; 303 304 local packageFile = <cross-built>$(fileName) ; 305 if [ on $(packageFile) return $(HAIKU_REPOSITORY_BUILD_DIRECTORY) ] { 306 # rule already called for this package 307 return $(packageFile) ; 308 } 309 310 HAIKU_REPOSITORY_BUILD_DIRECTORY on $(packageFile) = $(outputDir) ; 311 312 MakeLocate $(packageFile) : [ FDirName $(outputDir) packages ] ; 313 NoUpdate $(packageFile) ; 314 # Don't rebuild the file. Since the haiku cross devel package is 315 # a dependency and is updated always, this package would otherwise be 316 # rebuilt always as well. 317 318 Depends $(packageFile) : $(haikuCrossDevelPackages) $(configFile) ; 319 BootstrapRepositoryFetchPackage1 $(packageFile) 320 : $(haikuCrossDevelPackages) ; 321 322 return $(packageFile) ; 323} 324 325 326actions BootstrapRepositoryFetchPackage1 327{ 328 # don't rebuild existing package 329 package="$(1)" 330 if [ -e "$package" ]; then 331 exit 0 332 fi 333 334 # make Haiku cross devel package path absolute 335 haikuCrossDevelPackage="$(2[1])" 336 if [ "x$haikuCrossDevelPackage" = "x" ]; then 337 echo "$package does not have a cross-devel package defined!" 338 exit 1 339 fi 340 341 if [ "x$haikuCrossDevelPackage" = "x${haikuCrossDevelPackage#/}" ]; then 342 haikuCrossDevelPackage="`pwd`/$haikuCrossDevelPackage" 343 fi 344 345 # make secondary Haiku cross devel packages path absolute 346 secondaryCrossDevelPackages= 347 if [ -n "$(2[2-]:J)" ]; then 348 for secondaryCrossDevelPackage in "$(2[2-])" ; do 349 if [ "x$secondaryCrossDevelPackage" = "x${secondaryCrossDevelPackage#/}" ]; then 350 secondaryCrossDevelPackage="`pwd`/$secondaryCrossDevelPackage" 351 fi 352 if [ -n "$secondaryCrossDevelPackages" ]; then 353 secondaryCrossDevelPackages="$secondaryCrossDevelPackages,$secondaryCrossDevelPackage" 354 else 355 secondaryCrossDevelPackages="--secondary-cross-devel-package=$secondaryCrossDevelPackage" 356 fi 357 done 358 fi 359 360 # determine the port-specification from the package name 361 portSpec=`basename "$package" | sed 's@-.*@@'` 362 363 cd $(HAIKU_REPOSITORY_BUILD_DIRECTORY) 364 365 export $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) 366 if [ -n "$secondaryCrossDevelPackages" ]; then 367 $(HOST_HAIKU_PORTER) -j$(HAIKU_PORTER_CONCURRENT_JOBS) \ 368 --all-dependencies $(HAIKU_PORTER_EXTRA_OPTIONS) \ 369 --cross-devel-package "$haikuCrossDevelPackage" \ 370 "$secondaryCrossDevelPackages" $portSpec 371 else 372 $(HOST_HAIKU_PORTER) -j$(HAIKU_PORTER_CONCURRENT_JOBS) \ 373 --all-dependencies $(HAIKU_PORTER_EXTRA_OPTIONS) \ 374 --cross-devel-package "$haikuCrossDevelPackage" $portSpec 375 fi 376 377 if [ ! -e "$package" ]; then 378 echo "Supposedly built package $package does not exist; version mismatch?" 379 exit 1 380 fi 381} 382 383 384actions BuildBootstrapRepositoryConfig 385{ 386cat > $(1) << EOF 387PACKAGER="The Haiku build system <build-system@haiku-os.org>" 388TREE_PATH="$(HAIKU_REPOSITORY_TREE_PATH)" 389TARGET_ARCHITECTURE="$(HAIKU_PACKAGING_ARCH)" 390 391DOWNLOAD_IN_PORT_DIRECTORY="yes" 392PACKAGE_COMMAND="$(PWD)/$(2[1])" 393MIMESET_COMMAND="$(PWD)/$(2[2])" 394SYSTEM_MIME_DB="$(PWD)/$(2[3])" 395LICENSES_DIRECTORY="$(HAIKU_ABSOLUTE_TOP)/data/system/data/licenses" 396OUTPUT_DIRECTORY="$(HAIKU_REPOSITORY_BUILD_DIRECTORY)" 397CREATE_SOURCE_PACKAGES="yes" 398EOF 399 400 # If we have cross tools, add the cross tools directory. 401 gcc=$(HAIKU_CC_$(HAIKU_PACKAGING_ARCH)) 402 if [ "x$gcc" != "x${gcc#/}" ]; then 403 if [ `basename $gcc` = \ 404 $(HAIKU_GCC_MACHINE_$(HAIKU_PACKAGING_ARCH))-gcc ]; then 405 dir=`dirname $gcc` 406 dir=`dirname $dir` 407 echo CROSS_TOOLS=\"$dir\" >> $(1) 408 fi 409 fi 410 411 # Add secondary architectures and cross tools. 412 secondaryArchs="$(HAIKU_PACKAGING_ARCHS[2-]:E=)" 413 if [ -n "$secondaryArchs" ]; then 414 echo SECONDARY_TARGET_ARCHITECTURES=\" >> $(1) 415 for arch in $secondaryArchs; do 416 echo " $arch" >> $(1) 417 done 418 echo \" >> $(1) 419 420 echo SECONDARY_CROSS_TOOLS=\" >> $(1) 421 for gcc in $(HAIKU_CC_$(HAIKU_PACKAGING_ARCHS[2-])) ; do 422 dir=`dirname $gcc` 423 dir=`dirname $dir` 424 echo " $dir" >> $(1) 425 done 426 echo \" >> $(1) 427 fi 428} 429 430 431rule BootstrapPackageRepository repository : architecture 432 : anyPackages : packagesStage0 : packagesStage1 : packagesStage2 433 : sourcePackages : debugInfoPackages 434{ 435 repository = $(repository:G=repository) ; 436 packagesStage0 = [ FFilterByBuildFeatures $(packagesStage0) ] ; 437 packagesStage1 = [ FFilterByBuildFeatures $(packagesStage1) ] ; 438 packagesStage2 = [ FFilterByBuildFeatures $(packagesStage2) ] ; 439 sourcePackages = [ FFilterByBuildFeatures $(sourcePackages) ] ; 440 debugInfoPackages = [ FFilterByBuildFeatures $(debugInfoPackages) ] ; 441 442 SetRepositoryMethod $(repository) : PackageFamily 443 : BootstrapRepositoryPackageFamily ; 444 SetRepositoryMethod $(repository) : FetchPackage 445 : BootstrapRepositoryFetchPackage ; 446 447 # register repository with stage 0 packages 448 local stage0PackageTargets = [ PackageRepository $(repository) 449 : $(architecture) : $(anyPackages) : $(packagesStage0) 450 : $(sourcePackages) : $(debugInfoPackages) ] ; 451 if ! $(stage0PackageTargets) { 452 return ; 453 } 454 local crossDevelPackageSuffixes = $(architecture) 455 $(architecture)_$(HAIKU_PACKAGING_ARCHS[2-]) ; 456 HAIKU_REPOSITORY_HAIKU_CROSS_DEVEL_PACKAGES on $(stage0PackageTargets) 457 = haiku_cross_devel_sysroot_stage0_$(crossDevelPackageSuffixes).hpkg ; 458 459 # register repository with stage 1 packages 460 local stage1PackageTargets = [ PackageRepository $(repository) 461 : $(architecture) : $(anyPackages) : $(packagesStage1) 462 : $(sourcePackages) : $(debugInfoPackages) ] ; 463 if ! $(stage1PackageTargets) { 464 return ; 465 } 466 HAIKU_REPOSITORY_HAIKU_CROSS_DEVEL_PACKAGES on $(stage1PackageTargets) 467 = haiku_cross_devel_sysroot_stage1_$(crossDevelPackageSuffixes).hpkg ; 468 469 # add stage 2 packages 470 local stage2PackageTargets = [ AddRepositoryPackages $(repository) 471 : $(architecture) : $(packagesStage2) : $(sourcePackages) 472 : $(debugInfoPackages) ] ; 473 HAIKU_REPOSITORY_HAIKU_CROSS_DEVEL_PACKAGES on $(stage2PackageTargets) 474 = haiku_cross_devel_sysroot_$(crossDevelPackageSuffixes).hpkg ; 475 476 # prepare the config file for the HaikuPorts cross build 477 # This path needs to be absolute due to haikuporter's cwd 478 local outputDir = [ FDirName 479 $(PWD) 480 $(HAIKU_PACKAGE_REPOSITORIES_DIR_$(architecture)) 481 $(repository:G=)-build ] ; 482 local configFile = haikuports.conf ; 483 configFile = $(configFile:G=repository-config-$(repository:G=)) ; 484 MakeLocate $(configFile) : $(outputDir) ; 485 NoUpdate $(configFile) ; 486 Depends $(configFile) : <build>package <build>mimeset <mimedb>mime_db ; 487 HAIKU_REPOSITORY_BUILD_DIRECTORY on $(configFile) = $(outputDir) ; 488 HAIKU_PACKAGING_ARCH on $(configFile) = $(architecture) ; 489 HAIKU_REPOSITORY_TREE_PATH on $(configFile) = $(HAIKU_PORTS_CROSS) ; 490 BuildBootstrapRepositoryConfig $(configFile) 491 : <build>package <build>mimeset <mimedb>mime_db ; 492 493 HAIKU_REPOSITORY_BUILD_CONFIG_FILE on $(repository) = $(configFile) ; 494 HAIKU_REPOSITORY_BUILD_DIRECTORY on $(repository) = $(outputDir) ; 495 496 # Serialize all package file targets. We need to do this, since 497 # haikuporter uses a common directory for building the ports, so building 498 # two ports concurrently isn't possible. 499 local previousPackageFile ; 500 local package ; 501 for package in $(stage1PackageTargets) $(stage2PackageTargets) { 502 local fileName = [ on $(package) return $(HAIKU_PACKAGE_FILE_NAME) ] ; 503 local packageFile = [ BootstrapRepositoryFetchPackage $(repository) 504 : $(package) : $(fileName) ] ; 505 Depends $(packageFile) : $(previousPackageFile) ; 506 507 previousPackageFile = $(packageFile) ; 508 } 509} 510 511 512#pragma mark - Public 513 514 515rule FSplitPackageName packageName 516{ 517 local splitName = [ Match "(.*)_([^_]*)" : $(packageName) ] ; 518 local knownPackageSuffixes = devel doc source debuginfo ; 519 if $(splitName[2]) && $(splitName[2]) in $(knownPackageSuffixes) { 520 return $(splitName) ; 521 } 522 523 return $(packageName) ; 524} 525 526 527rule IsPackageAvailable packageName : flags 528{ 529 # for a secondary architecture adjust the package name 530 if $(TARGET_PACKAGING_ARCH) != $(TARGET_PACKAGING_ARCHS[1]) 531 && ! nameResolved in $(flags) { 532 # The position of the secondary architecture within the package name 533 # is not well defined, so we scan for it starting from the back. 534 local packageNameHead = $(packageName) ; 535 local packageNameTail = ; 536 while $(packageNameHead) { 537 local splitName = [ FSplitPackageName $(packageNameHead) ] ; 538 splitName = $(splitName[1]) $(TARGET_PACKAGING_ARCH) $(splitName[2]) 539 $(packageNameTail) ; 540 packageName = $(splitName:J=_) ; 541 if $(packageName) in $(HAIKU_AVAILABLE_PACKAGES) { 542 return $(packageName) ; 543 } 544 local splitHead = [ Match "(.*)_([^_]*)" : $(packageNameHead) ] ; 545 packageNameHead = $(splitHead[1]) ; 546 packageNameTail = $(splitHead[2]) $(packageNameTail) ; 547 } 548 } 549 550 if $(packageName) in $(HAIKU_AVAILABLE_PACKAGES) { 551 return $(packageName) ; 552 } 553 554 return ; 555} 556 557 558rule FetchPackage packageName : flags 559{ 560 local foundPackageName = [ IsPackageAvailable $(packageName) : $(flags) ] ; 561 if ! $(foundPackageName) { 562 Exit "FetchPackage: package" $(packageName) "not available!" ; 563 return ; 564 } 565 packageName = $(foundPackageName) ; 566 567 # TODO: We should support explicitly specified versions (or partial/minimum 568 # versions like gcc-2 or gcc-4). 569 570 local packageFamily = [ PackageFamily $(packageName) ] ; 571 local package 572 = [ on $(packageFamily) return $(HAIKU_PACKAGE_VERSIONS[1]) ] ; 573 local fileName = [ on $(package) return $(HAIKU_PACKAGE_FILE_NAME) ] ; 574 local repository = [ on $(package) return $(HAIKU_PACKAGE_REPOSITORY) ] ; 575 576 if $(HAIKU_DONT_FETCH_PACKAGES) { 577 Exit "FetchPackage: file" $(fileName) "not found and fetching" 578 "disabled!" ; 579 return ; 580 } 581 582 return [ InvokeRepositoryMethod $(repository) : FetchPackage : $(package) 583 : $(fileName) ] ; 584} 585 586 587rule BuildHaikuPortsSourcePackageDirectory 588{ 589 local architecture = $(TARGET_PACKAGING_ARCH) ; 590 local outputDir = [ FDirName 591 $(PWD) 592 $(HAIKU_PACKAGE_REPOSITORIES_DIR_$(architecture)) 593 HaikuPorts-sources-build ] ; 594 595 local sourcePackageDir = <HaikuPorts-repository-source-packages>packages ; 596 MakeLocate $(sourcePackageDir) : $(outputDir) ; 597 598 # build the package list file 599 local packageList 600 = <repository-package-list-HaikuPorts-sources>package_list ; 601 MakeLocate $(packageList) : $(outputDir) ; 602 Depends $(packageList) : 603 [ FDirName $(HAIKU_BUILD_RULES_DIR) repositories HaikuPorts 604 $(architecture) ] ; 605 BuildHaikuPortsPackageList $(packageList) ; 606 607 # prepare the config file for the HaikuPorts build 608 local configFile = <repository-config-HaikuPorts-sources>haikuports.conf ; 609 MakeLocate $(configFile) : $(outputDir) ; 610 NoUpdate $(configFile) ; 611 Depends $(configFile) : <build>package <build>mimeset <mimedb>mime_db ; 612 HAIKU_REPOSITORY_BUILD_DIRECTORY on $(configFile) = $(outputDir) ; 613 HAIKU_PACKAGING_ARCH on $(configFile) = $(architecture) ; 614 HAIKU_REPOSITORY_TREE_PATH on $(configFile) = $(HAIKU_PORTS) ; 615 BuildBootstrapRepositoryConfig $(configFile) 616 : <build>package <build>mimeset <mimedb>mime_db ; 617 618 # get Haiku cross-devel packages and build the sources 619 local crossDevelPackageSuffixes = $(architecture) 620 $(architecture)_$(HAIKU_PACKAGING_ARCHS[2-]) ; 621 local haikuCrossDevelPackages 622 = haiku_cross_devel_sysroot_stage1_$(crossDevelPackageSuffixes).hpkg ; 623 624 HAIKU_REPOSITORY_BUILD_DIRECTORY on $(sourcePackageDir) = $(outputDir) ; 625 626 Depends $(sourcePackageDir) : $(packageList) $(haikuCrossDevelPackages) 627 $(configFile) ; 628 BuildHaikuPortsSourcePackageDirectory1 $(sourcePackageDir) 629 : $(packageList) $(haikuCrossDevelPackages) ; 630 631 return $(sourcePackageDir) ; 632} 633 634 635actions BuildHaikuPortsPackageList 636{ 637 $(JAM:E=jam) $(HAIKU_BOOTSTRAP_SOURCES_PROFILE) build-package-list $(1) \ 638 $(HAIKU_REPOSITORY_BUILD_ADDITIONAL_PACKAGES) 639} 640 641 642actions BuildHaikuPortsSourcePackageDirectory1 643{ 644 packageList="$(2[1])" 645 646 # make Haiku cross devel package path absolute 647 haikuCrossDevelPackage="$(2[2])" 648 if [ "x$haikuCrossDevelPackage" = "x${haikuCrossDevelPackage#/}" ]; then 649 haikuCrossDevelPackage="`pwd`/$haikuCrossDevelPackage" 650 fi 651 652 # make secondary Haiku cross devel packages path absolute 653 secondaryCrossDevelPackages= 654 if [ -n "$(2[3-]:J)" ]; then 655 for secondaryCrossDevelPackage in "$(2[3-])" ; do 656 if [ "x$secondaryCrossDevelPackage" = "x${secondaryCrossDevelPackage#/}" ]; then 657 secondaryCrossDevelPackage="`pwd`/$secondaryCrossDevelPackage" 658 fi 659 if [ -n "$secondaryCrossDevelPackages" ]; then 660 secondaryCrossDevelPackages="$secondaryCrossDevelPackages,$secondaryCrossDevelPackage" 661 else 662 secondaryCrossDevelPackages="--secondary-cross-devel-package=$secondaryCrossDevelPackage" 663 fi 664 done 665 fi 666 667 cd $(HAIKU_REPOSITORY_BUILD_DIRECTORY) 668 669 export $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) 670 if [ -n "$secondaryCrossDevelPackages" ]; then 671 $(HOST_HAIKU_PORTER) --cross-devel-package "$haikuCrossDevelPackage" \ 672 "$secondaryCrossDevelPackages" \ 673 --all-dependencies $(HAIKU_PORTER_EXTRA_OPTIONS) \ 674 --create-source-packages-for-bootstrap --portsfile $packageList 675 else 676 $(HOST_HAIKU_PORTER) --cross-devel-package "$haikuCrossDevelPackage" \ 677 --all-dependencies $(HAIKU_PORTER_EXTRA_OPTIONS) \ 678 --create-source-packages-for-bootstrap --portsfile $packageList 679 fi 680} 681 682 683rule BuildHaikuPortsRepositoryConfig treePath 684{ 685 local architecture = $(TARGET_PACKAGING_ARCH) ; 686 local outputDir = [ FDirName 687 $(HAIKU_PACKAGE_REPOSITORIES_DIR_$(architecture)) 688 HaikuPorts-bootstrap ] ; 689 690 local configFile = <repository-config-HaikuPorts-bootstrap>haikuports.conf ; 691 MakeLocate $(configFile) : $(outputDir) ; 692 NoUpdate $(configFile) ; 693 694 HAIKU_REPOSITORY_TREE_PATH on $(configFile) = $(treePath) ; 695 BuildHaikuPortsRepositoryConfig1 $(configFile) ; 696 697 return $(configFile) ; 698} 699 700 701actions BuildHaikuPortsRepositoryConfig1 702{ 703 # use a specific packager for continuous integration builds (buildbot) 704 if [ "$(HAIKU_CONTINUOUS_INTEGRATION_BUILD)" = "1" ]; then 705 echo 'PACKAGER="Haiku buildmaster <buildmaster@haiku-os.org>"' > $(1) 706 else 707 echo '#PACKAGER="Joe Hacker <user@host.com>"' > $(1) 708 fi 709 cat >> $(1) << EOF 710TREE_PATH="$(HAIKU_REPOSITORY_TREE_PATH)" 711TARGET_ARCHITECTURE="$(HAIKU_PACKAGING_ARCH)" 712EOF 713} 714 715 716rule HaikuRepository repository : repoInfoTemplate : packages 717{ 718 # HaikuRepository <repository> : <repoInfoTemplate> : <packages> 719 # [ : <url> [ : <versionFile> ] ] ; 720 # Builds the Haiku repository from the given packages and repository info 721 # template. <repository> must already be located. 722 # 723 # <repository> - The repository target. Resolves to a directory that will be 724 # (removed,) created and populated with the package files and repository 725 # meta data files. 726 # <repoInfoTemplate> - The repository info template file to be used. 727 # <packages> - The packages to be added to the repository. 728 729 local architecture = $(HAIKU_PACKAGING_ARCH) ; 730 local secondaryArchitecture ; 731 if $(TARGET_PACKAGING_ARCH) != $(architecture) { 732 secondaryArchitecture = $(TARGET_PACKAGING_ARCH) ; 733 } 734 735 local repositoriesDir = $(HAIKU_PACKAGE_REPOSITORIES_DIR_$(architecture)) ; 736 737 # build the repository info 738 local repositoryInfo = $(repository:G=repository-info)-info ; 739 MakeLocate $(repositoryInfo) : $(repositoriesDir) ; 740 PreprocessPackageOrRepositoryInfo $(repositoryInfo) : $(repoInfoTemplate) 741 : $(architecture) : $(secondaryArchitecture) ; 742 743 # build the respository config 744 local repositoryConfig = $(repository:G=repository-config)-config ; 745 MakeLocate $(repositoryConfig) : $(repositoriesDir) ; 746 RepositoryConfig $(repositoryConfig) : $(repositoryInfo) ; 747 HAIKU_REPOSITORY_CONFIG_FILE on $(repository) = $(repositoryConfig) ; 748 749 # setup the repository cache file 750 local repositoryCache = $(repository:B=repo:G=repository-cache) ; 751 MakeLocate $(repositoryCache) 752 : [ FDirName $(repositoriesDir) $(repository:G=) ] ; 753 Depends $(repositoryCache) : $(repository) ; 754 HAIKU_REPOSITORY_CACHE_FILE on $(repository) = $(repositoryCache) ; 755 756 # add the repository to the list of known package repositories 757 HAIKU_REPOSITORIES += $(repository) ; 758 759 # prepare the script that initializes the shell variables 760 local initVariablesScript = $(repository)-repository-init-vars ; 761 MakeLocate $(initVariablesScript) 762 : $(HAIKU_PACKAGE_REPOSITORIES_DIR_$(architecture)) ; 763 Always $(initVariablesScript) ; 764 765 local script = $(initVariablesScript) ; 766 AddVariableToScript $(script) : addBuildCompatibilityLibDir 767 : "export $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR)" ; 768 AddVariableToScript $(script) : sha256 : $(HOST_SHA256) ; 769 AddVariableToScript $(script) : sedExtendedRegex 770 : $(HOST_EXTENDED_REGEX_SED) ; 771 AddTargetVariableToScript $(script) : <build>package ; 772 AddTargetVariableToScript $(script) : <build>package_repo : packageRepo ; 773 774 # call the build actions 775 local mainScript = build_haiku_repository ; 776 SEARCH on $(mainScript) = [ FDirName $(HAIKU_TOP) build scripts ] ; 777 778 Depends $(repository) : $(mainScript) $(initVariablesScript) 779 $(repositoryInfo) $(packages) ; 780 HaikuRepository1 $(repository) : $(mainScript) $(initVariablesScript) 781 $(repositoryInfo) $(packages) ; 782 Always $(repository) ; 783 784 RmTemps $(repository) : $(initVariablesScript) ; 785} 786 787 788actions HaikuRepository1 789{ 790 $(2[1]) "$(2[2])" "$(1)" "$(2[3-])" 791} 792