1#------------------------------------------------------------------------------- 2# Packages for OBOS alpha/beta testers 3#------------------------------------------------------------------------------- 4 5rule Copy 6{ 7 if $(2) { 8 SEARCH on $(2) += $(SEARCH_SOURCE) ; 9 Depends $(1) : <build>copyattr $(2) ; 10 Copy1 $(1) : <build>copyattr $(2) ; 11 } 12} 13 14actions Copy1 15{ 16 $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) 17 "$(2[1])" -d "$(2[2-])" "$(1)" 18} 19 20rule Packages 21{ 22 local packagenames = $(1) ; 23 local packagefiles = $(2) ; 24 local path = $(3) ; 25 for name in $(packagenames) { 26 Package $(name) : $(packagefiles) : $(path) ; 27 } 28} 29 30rule FPackageConfigSubPath 31{ 32 # FPackageConfigSubPath <packagename> 33 # 34 local packagename = $(1) ; 35 36 local configSubPath ; 37 on $(packagename) { 38 if $(PLATFORM) = host { 39 configSubPath = $(HOST_PLATFORM) $(HOST_ARCH) ; 40 } else { 41 configSubPath = $(TARGET_PLATFORM) $(TARGET_ARCH) ; 42 } 43 44 if $(DEBUG) = 0 { 45 configSubPath += release ; 46 } else { 47 configSubPath += debug_$(DEBUG) ; 48 } 49 } 50 51 return $(configSubPath) ; 52} 53 54rule Package 55{ 56 local packagename = $(1) ; 57 local packagefiles = $(2) ; 58 local path = $(3) ; 59 60 local configSubPath = [ FPackageConfigSubPath $(packagename) ] ; 61 local packagezip = $(packagename:S=.zip:G=_packages) ; 62 local targetDir = [ FDirName $(HAIKU_PACKAGE_DIR) $(configSubPath) ] ; 63 local packagedir = [ FDirName $(targetDir) $(packagename) ] ; 64 65 local installscript = install.sh ; 66 local packageinstallscript = $(installscript:G=_packages!$(packagename)) ; 67 local installzip = install.zip ; 68 local packageinstallzip = $(installzip:G=_packages!$(packagename)) ; 69 70 local packageobjectdir = [ FDirName $(HAIKU_PACKAGE_OBJECT_DIR) 71 $(configSubPath) $(packagename) ] ; 72 local packagefiledir = [ FDirName $(packageobjectdir) $(path) ] ; 73 local packagefileinstallzip 74 = $(installzip:G=_package_objects!$(packagename)) ; 75 76 # add the files to the install.zip 77 local packagefilegrist = [ FGrist _package_files $(packagename) $(path) ] ; 78 for file in $(packagefiles) { 79 if $(path[0]) = "boot" { 80 local packagefile = $(file:G=$(packagefilegrist)) ; 81 MakeLocate $(packagefile) : $(packagefiledir) ; 82 Copy $(packagefile) : $(file) ; 83 Clean cleanPackages : $(packagefile) ; 84 PackageInstallZip $(packagefileinstallzip) : $(packagefile) ; 85 } else { 86 local packagefile = $(file:G=_packages!$(packagename)) ; 87 MakeLocate $(packagefile) : $(packagedir) ; 88 Copy $(packagefile) : [ FGristFiles $(file) ] ; 89 Clean cleanPackages : $(packagefile) ; 90 Depends $(packagezip) : $(packagefile) ; 91 } 92 } 93 94 # general setup for this package -- only on first invocation 95 if ! $(_setup_$(packagename)) { 96 _setup_$(packagename) = true ; 97 98 NotFile $(packagename) ; 99 LocalDepends packages : $(packagename) ; 100 101 MakeLocate $(packagezip) : $(targetDir) ; 102 MakeLocate $(packageinstallscript) : $(packagedir) ; 103 MakeLocate $(packageinstallzip) : $(packagedir) ; 104 MakeLocate $(packagefileinstallzip) : $(packageobjectdir) ; 105 106 PackageInstallScript $(packageinstallscript) : $(packagedir) ; 107 LinkInstallZip $(packageinstallzip) : $(packagefileinstallzip) ; 108 Depends $(packagename) : $(packagezip) ; 109 PackageZip $(packagezip) : $(packagedir) 110 : $(packageinstallscript) $(packageinstallzip) ; 111 } 112 113} 114 115rule PackageSymLink 116{ 117 # PackageSymLink <packageName> : <symlink path components> 118 # : <symlink target> 119 # 120 local packagename = $(1) ; 121 local symlinkPath = $(2) ; 122 local symlinkTarget = $(3) ; 123 124 local configSubPath = [ FPackageConfigSubPath $(packagename) ] ; 125 126 local symlinkDir = [ FReverse $(symlinkPath) ] ; 127 local symlink = $(symlinkDir[1]) ; 128 symlinkDir = [ FReverse $(symlinkDir[2-]) ] ; 129 local symlinkGrist = [ FGrist _package $(packagename) $(symlinkDir) ] ; 130 symlink = $(symlink:G=$(symlinkGrist)) ; 131 132 if $(symlinkDir[1]) = boot { 133 local installzip = install.zip ; 134 local packagefileinstallzip 135 = $(installzip:G=_package_objects!$(packagename)) ; 136 137 local packageobjectdir = [ FDirName $(HAIKU_PACKAGE_OBJECT_DIR) 138 $(configSubPath) $(packagename) ] ; 139 symlinkDir = [ FDirName $(packageobjectdir) $(symlinkDir) ] ; 140 141 PackageInstallZip $(packagefileinstallzip) : $(symlink) ; 142 143 } else { 144 local packagezip = $(packagename:S=.zip:G=_packages) ; 145 146 local packagedir = [ FDirName $(HAIKU_PACKAGE_DIR) $(configSubPath) 147 $(packagename) ] ; 148 symlinkDir = [ FDirName $(packagedir) $(symlinkDir) ] ; 149 150 Depends $(packagezip) : $(symlink) ; 151 } 152 153 MakeLocate $(symlink) : $(symlinkDir) ; 154 SymLink $(symlink) : $(symlinkTarget) : false ; 155 Clean cleanPackages : $(symlink) ; 156} 157 158rule PackageDriverSymLink 159{ 160 # PackageDriverSymLink <packageName> : <devRelativeSymlinkComponents> ; 161 # <packageName>: Package name. 162 # <devRelativeSymlinkComponents>: Path components relative to the 163 # /boot/home/config/add-ons/kernel/drivers/dev directory, e.g. 164 # "graphics mga.driver" (no quotation, of course). 165 # 166 local packageName = $(1) ; 167 local symlinkComponents = $(2) ; 168 169 # construct the symlink contents 170 local symlinkPath = [ FReverse $(symlinkComponents) ] ; 171 symlinkPath = bin $(symlinkPath[1]) ; 172 173 for i in $(symlinkComponents) { 174 symlinkPath = $(DOTDOT) $(symlinkPath) ; 175 } 176 177 PackageSymLink $(packageName) 178 : boot home config add-ons kernel drivers dev $(symlinkComponents) 179 : [ FDirName $(symlinkPath) ] ; 180} 181 182rule PackageZip 183{ 184 local dir = $(2:G=dir) ; 185 Depends $(1) : $(dir) $(3) ; 186 Clean cleanPackages : $(1) ; 187 PackageZip1 $(1) : $(dir) ; 188} 189 190actions together PackageZip1 { 191 cd "$(2:P)" ; 192 zip -rq "$(1:BS)" "$(2:BS)" ; 193} 194 195rule PackageInstallScript 196{ 197 MakeLocate $(1) : $(2) ; 198 Clean cleanPackages : $(1) ; 199 PackageInstallScript1 $(1) : $(2:G=dir) ; 200} 201 202actions together PackageInstallScript1 203{ 204echo '#!/bin/sh 205base=`dirname "$0"` 206cd "$base" 207if [ -n "$TTY" ] 208then 209 unzip -d / install.zip 210else 211 response=`alert "Would you like to automatically overwrite existing files, or receive a prompt?" "Overwrite" "Prompt"` 212 if [ $response == "Overwrite" ] 213 then 214 unzip -od / install.zip 215 alert "Finished installing" "Thanks" 216 else 217 if [ -e /boot/beos/apps/Terminal ] 218 then 219 terminal=/boot/beos/apps/Terminal 220 else 221 terminal=`query Terminal | head -1` 222 fi 223 $terminal -t "installer" /bin/sh "$0" 224 fi 225fi' > "$(1)" ; 226 chmod 755 "$(1)" ; 227} 228 229rule PackageInstallZip 230{ 231 Depends $(1) : $(2) ; 232 Clean cleanPackages : $(1) ; 233} 234 235actions together PackageInstallZip 236{ 237 cd "$(1:P)" ; 238 zip -rqy "$(1:BS)" boot ; 239} 240 241rule LinkInstallZip 242{ 243 Depends $(1) : $(2) ; 244 Clean cleanPackages : $(1) ; 245} 246 247actions together LinkInstallZip 248{ 249 ln -sf "`pwd`/$(2)" "$(1)" ; 250} 251 252 253# TODO: The stuff above should be moved (Copy) or removed (the rest). 254 255 256#pragma mark - Haiku Packages 257 258 259rule FHaikuPackageGrist package 260{ 261 local grist = [ Match "<(.*)>" : $(package:G) ] ; 262 return hpkg_$(grist:E="")_$(package:G=) ; 263} 264 265 266rule HaikuPackage package 267{ 268 local grist = [ FHaikuPackageGrist $(package) ] ; 269 270 HAIKU_CONTAINER_GRIST on $(package) = $(grist) ; 271 HAIKU_INCLUDE_IN_CONTAINER_VAR on $(package) = HAIKU_INCLUDE_IN_PACKAGES ; 272 HAIKU_INSTALL_TARGETS_VAR on $(package) 273 = $(grist)_HAIKU_PACKAGE_INSTALL_TARGETS ; 274 HAIKU_CONTAINER_SYSTEM_DIR_TOKENS on $(package) = ; 275 276 HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE = $(package) ; 277 278 if $(HAIKU_PACKAGES_UPDATE_ONLY) { 279 HAIKU_CONTAINER_UPDATE_ONLY on $(package) = 1 ; 280 HAIKU_CONTAINER_INHERIT_UPDATE_VARIABLE on $(package) 281 = HAIKU_INCLUDE_IN_IMAGE ; 282 } else if $(HAIKU_UPDATE_ALL_PACKAGES) { 283 HAIKU_INCLUDE_IN_IMAGE on $(package) = 1 ; 284 } 285 286 HAIKU_CONTAINER_ALWAYS_CREATE_DIRECTORIES on $(package) = 1 ; 287} 288 289 290rule BuildHaikuPackage package : packageInfo 291{ 292 local grist = [ FHaikuPackageGrist $(package) ] ; 293 294 local tempDir = [ FDirName $(HAIKU_PACKAGES_BUILD_DIR) $(grist) ] ; 295 local scriptDir = [ FDirName $(tempDir) scripts ] ; 296 297 # locate the package and package info 298 MakeLocate $(package) : $(HAIKU_PACKAGES_DIR) ; 299 SEARCH on $(packageInfo) += $(HAIKU_PACKAGE_INFOS_DIR) ; 300 LocalDepends $(package) : $(packageInfo) ; 301 302 # prepare the script that initializes the shell variables 303 local initVariablesScript = <$(grist)>haiku.package-init-vars ; 304 MakeLocate $(initVariablesScript) : $(scriptDir) ; 305 Always $(initVariablesScript) ; 306 307 local script = $(initVariablesScript) ; 308 AddVariableToScript $(script) : sourceDir : $(HAIKU_TOP) ; 309 AddVariableToScript $(script) : outputDir : $(HAIKU_OUTPUT_DIR) ; 310 AddVariableToScript $(script) : tmpDir : $(tempDir) ; 311 AddVariableToScript $(script) : addBuildCompatibilityLibDir 312 : $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) ; 313 AddVariableToScript $(script) : updateOnly 314 : [ on $(package) return $(HAIKU_CONTAINER_UPDATE_ONLY) ] ; 315 AddTargetVariableToScript $(script) : <build>addattr ; 316 AddTargetVariableToScript $(script) : <build>copyattr ; 317 AddTargetVariableToScript $(script) : <mimedb>mime_db : mimeDB ; 318 AddTargetVariableToScript $(script) : <build>mimeset ; 319 AddTargetVariableToScript $(script) : <build>package ; 320 AddTargetVariableToScript $(script) : <build>rc ; 321 AddTargetVariableToScript $(script) : <build>resattr ; 322 AddTargetVariableToScript $(script) : <build>unzip ; 323 if $(HOST_RM_ATTRS_TARGET) { 324 AddTargetVariableToScript $(script) : $(HOST_RM_ATTRS_TARGET) 325 : rmAttrs ; 326 } else { 327 AddVariableToScript $(script) : rmAttrs : rm ; 328 } 329 330 # create the other scripts 331 local makeDirsScript = <$(grist)>haiku.package-make-dirs ; 332 local copyFilesScript = <$(grist)>haiku.package-copy-files ; 333 334 MakeLocate $(makeDirsScript) $(copyFilesScript) : $(scriptDir) ; 335 336 CreateContainerMakeDirectoriesScript $(package) : $(makeDirsScript) ; 337 CreateContainerCopyFilesScript $(package) : $(copyFilesScript) ; 338 339 local scripts = $(initVariablesScript) $(makeDirsScript) 340 $(copyFilesScript) ; 341 342 # call the build actions 343 local mainScript = build_haiku_package ; 344 SEARCH on $(mainScript) = [ FDirName $(HAIKU_TOP) build scripts ] ; 345 346 LocalDepends $(package) : $(mainScript) $(scripts) ; 347 BuildHaikuPackage1 $(package) : $(mainScript) $(packageInfo) $(scripts) ; 348} 349 350 351actions BuildHaikuPackage1 352{ 353 $(2[1]) "$(1)" "$(2[2])" $(2[3-]) 354} 355 356 357rule AddDirectoryToPackage directoryTokens : attributeFiles 358{ 359 return [ AddDirectoryToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 360 : $(directoryTokens) : $(attributeFiles) ] ; 361} 362 363 364rule AddFilesToPackage directory : targets : destName 365{ 366 AddFilesToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) : $(directory) 367 : $(targets) : $(destName) ; 368} 369 370 371rule AddSymlinkToPackage directoryTokens : linkTarget : linkName 372{ 373 linkTarget = $(linkTarget:J=/) ; 374 375 AddSymlinkToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 376 : $(directoryTokens) : $(linkTarget) : $(linkName) ; 377} 378 379 380rule CopyDirectoryToPackage directoryTokens : sourceDirectory 381 : targetDirectoryName : excludePatterns : flags 382{ 383 CopyDirectoryToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 384 : $(directoryTokens) : $(sourceDirectory) : $(targetDirectoryName) 385 : $(excludePatterns) : $(flags) ; 386} 387 388 389rule AddHeaderDirectoryToPackage dirTokens : dirName : flags 390{ 391 AddHeaderDirectoryToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 392 : $(dirTokens) : $(dirName) : $(flags) ; 393} 394 395 396rule AddWifiFirmwareToPackage driver : subDirToExtract : archive 397 : extract 398{ 399 AddWifiFirmwareToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 400 : $(driver) : $(subDirToExtract) : $(archive) : $(extract) ; 401} 402 403 404rule ExtractArchiveToPackage dirTokens : archiveFile : flags : extractedSubDir 405{ 406 ExtractArchiveToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 407 : $(dirTokens) : $(archiveFile) : $(flags) : $(extractedSubDir) ; 408} 409 410 411rule AddDriversToPackage relativeDirectoryTokens : targets 412{ 413 AddDriversToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 414 : $(relativeDirectoryTokens) : $(targets) ; 415} 416 417 418rule AddNewDriversToPackage relativeDirectoryTokens : targets 419{ 420 AddNewDriversToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 421 : $(relativeDirectoryTokens) : $(targets) ; 422} 423 424 425rule AddBootModuleSymlinksToPackage targets 426{ 427 AddBootModuleSymlinksToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 428 : $(targets) ; 429} 430 431 432rule AddLibrariesToPackage directory : libs 433{ 434 AddLibrariesToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 435 : $(directory) : $(libs) ; 436} 437