1rule FHaikuPackageGrist package 2{ 3 local grist = [ Match "<(.*)>" : $(package:G) ] ; 4 return hpkg_$(grist:E="")-$(package:G=) ; 5} 6 7 8rule HaikuPackage package 9{ 10 local grist = [ FHaikuPackageGrist $(package) ] ; 11 12 HAIKU_CONTAINER_GRIST on $(package) = $(grist) ; 13 HAIKU_INCLUDE_IN_CONTAINER_VAR on $(package) = HAIKU_INCLUDE_IN_PACKAGES ; 14 HAIKU_INSTALL_TARGETS_VAR on $(package) 15 = $(grist)_HAIKU_PACKAGE_INSTALL_TARGETS ; 16 HAIKU_CONTAINER_SYSTEM_DIR_TOKENS on $(package) = ; 17 18 HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE = $(package) ; 19 20 if $(HAIKU_PACKAGES_UPDATE_ONLY) { 21 HAIKU_CONTAINER_UPDATE_ONLY on $(package) = 1 ; 22 HAIKU_CONTAINER_INHERIT_UPDATE_VARIABLE on $(package) 23 = HAIKU_INCLUDE_IN_IMAGE ; 24 } else if $(HAIKU_UPDATE_ALL_PACKAGES) { 25 HAIKU_INCLUDE_IN_IMAGE on $(package) = 1 ; 26 } 27 28 HAIKU_CONTAINER_ALWAYS_CREATE_DIRECTORIES on $(package) = 1 ; 29} 30 31 32rule PreprocessPackageInfo source : directory : architecture 33 : secondaryArchitecture 34{ 35 source = $(source:G=package-info-source) ; 36 SEARCH on $(source) += 37 [ FDirName $(HAIKU_PACKAGE_INFOS_DIR) $(architecture) ] 38 [ FDirName $(HAIKU_PACKAGE_INFOS_DIR) any ] 39 [ FDirName $(HAIKU_PACKAGE_INFOS_DIR) generic ] 40 ; 41 42 local target = $(source:BSG=package-info)-package-info ; 43 local defines = HAIKU_PACKAGING_ARCH=$(architecture) ; 44 local sedReplacements = %HAIKU_PACKAGING_ARCH%,$(architecture) ; 45 if $(HAIKU_BOOTSTRAP_BUILD) { 46 defines += HAIKU_BOOTSTRAP_BUILD ; 47 target = $(target)-bootstrap ; 48 } 49 if $(secondaryArchitecture) { 50 defines += HAIKU_SECONDARY_PACKAGING_ARCH=$(secondaryArchitecture) ; 51 sedReplacements 52 += %HAIKU_SECONDARY_PACKAGING_ARCH%,$(secondaryArchitecture) ; 53 sedReplacements += 54 %HAIKU_SECONDARY_PACKAGING_ARCH_SUFFIX%,_$(secondaryArchitecture) ; 55 } else { 56 sedReplacements 57 += %HAIKU_SECONDARY_PACKAGING_ARCH_SUFFIX%, ; 58 } 59 60 local revisionFile = [ DetermineHaikuRevision ] ; 61 local updateRequiresFiles ; 62 local haikuPortsRepositoryFile ; 63 if ! $(HAIKU_BOOTSTRAP_BUILD) { 64 updateRequiresFiles = 65 <build>update_package_requires 66 [ on <repository>HaikuPorts return $(HAIKU_REPOSITORY_CACHE_FILE) ] 67 ; 68 } 69 70 MakeLocate $(target) : $(directory) ; 71 Depends $(target) : $(source) $(revisionFile) $(updateRequiresFiles) ; 72 73 CCDEFS on $(target) = [ FDefines $(defines) ] ; 74 HAIKU_SED_REPLACEMENTS on $(target) = "-e s,$(sedReplacements),g" ; 75 76 PreprocessPackageInfo1 $(target) : $(source) $(revisionFile) 77 $(updateRequiresFiles) ; 78 79 return $(target) ; 80} 81 82 83actions PreprocessPackageInfo1 84{ 85 revision=`sed -n 's,^\(hrev[0-9]*\).*,\1,p' $(2[2])` 86 sed $(HAIKU_SED_REPLACEMENTS) \ 87 -e s,%HAIKU_VERSION%,$(HAIKU_VERSION)_${revision:-0}-1, < $(2[1]) \ 88 | $(HOST_CC) -E -w $(CCDEFS) - -o $(1) 89 90 if [ -n "$(2[4]:E)" ]; then 91 $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) 92 "$(2[3])" "$(1)" "$(2[4])" || exit 1 93 fi 94} 95 96 97rule BuildHaikuPackage package : packageInfo 98{ 99 local architecture = $(HAIKU_PACKAGING_ARCH) ; 100 local secondaryArchitecture ; 101 if $(TARGET_PACKAGING_ARCH) != $(architecture) { 102 secondaryArchitecture = $(TARGET_PACKAGING_ARCH) ; 103 } 104 105 local grist = [ FHaikuPackageGrist $(package) ] ; 106 107 local tempDir 108 = [ FDirName $(HAIKU_PACKAGES_BUILD_DIR_$(architecture)) $(grist) ] ; 109 local scriptDir = [ FDirName $(tempDir) scripts ] ; 110 111 # build the package info and locate the package 112 packageInfo = [ PreprocessPackageInfo $(packageInfo) : $(tempDir) 113 : $(architecture) : $(secondaryArchitecture) ] ; 114 MakeLocate $(package) : $(HAIKU_PACKAGES_DIR_$(architecture)) ; 115 Depends $(package) : $(packageInfo) ; 116 117 # prepare the script that initializes the shell variables 118 local initVariablesScript = <$(grist)>haiku.package-init-vars ; 119 MakeLocate $(initVariablesScript) : $(scriptDir) ; 120 Always $(initVariablesScript) ; 121 122 local script = $(initVariablesScript) ; 123 AddVariableToScript $(script) : sourceDir : $(HAIKU_TOP) ; 124 AddVariableToScript $(script) : outputDir : $(HAIKU_OUTPUT_DIR) ; 125 AddVariableToScript $(script) : tmpDir : $(tempDir) ; 126 AddVariableToScript $(script) : addBuildCompatibilityLibDir 127 : $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) ; 128 AddVariableToScript $(script) : compressionLevel 129 : [ on $(package) return $(HAIKU_PACKAGE_COMPRESSION_LEVEL) ] ; 130 AddVariableToScript $(script) : updateOnly 131 : [ on $(package) return $(HAIKU_CONTAINER_UPDATE_ONLY) ] ; 132 AddVariableToScript $(script) : cc : $(TARGET_CC_$(architecture)) ; 133 AddTargetVariableToScript $(script) : <build>addattr ; 134 AddTargetVariableToScript $(script) : <build>copyattr ; 135 AddTargetVariableToScript $(script) : <mimedb>mime_db : mimeDB ; 136 AddTargetVariableToScript $(script) : <build>mimeset ; 137 AddTargetVariableToScript $(script) : <build>package ; 138 AddTargetVariableToScript $(script) : <build>rc ; 139 AddTargetVariableToScript $(script) : <build>resattr ; 140 AddTargetVariableToScript $(script) : <build>unzip ; 141 if $(HOST_RM_ATTRS_TARGET) { 142 AddTargetVariableToScript $(script) : $(HOST_RM_ATTRS_TARGET) 143 : rmAttrs ; 144 } else { 145 AddVariableToScript $(script) : rmAttrs : rm ; 146 } 147 148 # create the other scripts 149 local makeDirsScript = <$(grist)>haiku.package-make-dirs ; 150 local copyFilesScript = <$(grist)>haiku.package-copy-files ; 151 local extractFilesScript = <$(grist)>haiku.package-extract-files ; 152 153 MakeLocate $(makeDirsScript) $(copyFilesScript) $(extractFilesScript) 154 : $(scriptDir) ; 155 156 CreateContainerMakeDirectoriesScript $(package) : $(makeDirsScript) ; 157 CreateContainerCopyFilesScript $(package) : $(copyFilesScript) ; 158 CreateContainerExtractFilesScript $(package) : $(extractFilesScript) ; 159 160 local scripts = $(initVariablesScript) $(makeDirsScript) 161 $(copyFilesScript) $(extractFilesScript) ; 162 163 # call the build actions 164 local mainScript = build_haiku_package ; 165 SEARCH on $(mainScript) = [ FDirName $(HAIKU_TOP) build scripts ] ; 166 167 LocalDepends $(package) : $(mainScript) $(scripts) ; 168 BuildHaikuPackage1 $(package) : $(mainScript) $(packageInfo) $(scripts) ; 169} 170 171 172actions BuildHaikuPackage1 173{ 174 $(2[1]) "$(1)" "$(2[2])" $(2[3-]) 175} 176 177 178rule AddDirectoryToPackage directoryTokens : attributeFiles 179{ 180 return [ AddDirectoryToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 181 : $(directoryTokens) : $(attributeFiles) ] ; 182} 183 184 185rule AddFilesToPackage directory : targets : destName 186{ 187 AddFilesToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) : $(directory) 188 : $(targets) : $(destName) ; 189} 190 191 192rule AddSymlinkToPackage directoryTokens : linkTarget : linkName 193{ 194 linkTarget = $(linkTarget:J=/) ; 195 196 AddSymlinkToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 197 : $(directoryTokens) : $(linkTarget) : $(linkName) ; 198} 199 200 201rule CopyDirectoryToPackage directoryTokens : sourceDirectory 202 : targetDirectoryName : excludePatterns : flags 203{ 204 CopyDirectoryToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 205 : $(directoryTokens) : $(sourceDirectory) : $(targetDirectoryName) 206 : $(excludePatterns) : $(flags) ; 207} 208 209 210rule AddHeaderDirectoryToPackage dirTokens : dirName : flags 211{ 212 AddHeaderDirectoryToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 213 : $(dirTokens) : $(dirName) : $(flags) ; 214} 215 216 217rule AddWifiFirmwareToPackage driver : subDirToExtract : archive 218 : extract 219{ 220 AddWifiFirmwareToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 221 : $(driver) : $(subDirToExtract) : $(archive) : $(extract) ; 222} 223 224 225rule ExtractArchiveToPackage dirTokens : archiveFile : flags : extractedSubDir 226{ 227 ExtractArchiveToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 228 : $(dirTokens) : $(archiveFile) : $(flags) : $(extractedSubDir) ; 229} 230 231 232rule AddDriversToPackage relativeDirectoryTokens : targets 233{ 234 AddDriversToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 235 : $(relativeDirectoryTokens) : $(targets) ; 236} 237 238 239rule AddNewDriversToPackage relativeDirectoryTokens : targets 240{ 241 AddNewDriversToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 242 : $(relativeDirectoryTokens) : $(targets) ; 243} 244 245 246rule AddBootModuleSymlinksToPackage targets 247{ 248 AddBootModuleSymlinksToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 249 : $(targets) ; 250} 251 252 253rule AddLibrariesToPackage directory : libs 254{ 255 AddLibrariesToContainer $(HAIKU_CURRENTLY_BUILT_HAIKU_PACKAGE) 256 : $(directory) : $(libs) ; 257} 258 259 260# default value for the package compression level 261HAIKU_PACKAGE_COMPRESSION_LEVEL ?= 9 ; 262