xref: /haiku/build/jam/PackageRules (revision 04a0e9c7b68cbe3a43d38e2bca8e860fd80936fb)
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