4 # The contents of this file are subject to the terms of the
5 # Common Development and Distribution License (the "License").
6 # You may not use this file except in compliance with the License.
8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 # or http://www.opensolaris.org/os/licensing.
10 # See the License for the specific language governing permissions
11 # and limitations under the License.
13 # When distributing Covered Code, include this CDDL HEADER in each
14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 # If applicable, add the following below this CDDL HEADER, with the
16 # fields enclosed by brackets "[]" replaced with your own identifying
17 # information: Portions Copyright [yyyy] [name of copyright owner]
23 # Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
29 This README describes some basics about creating, modifying, and
30 building packages in ON. All package creation in ON is done using
31 tools available to our customers. If terminology in this document
32 is confusing, you may wish to review the pkg(5) manpage.
37 usr/src/pkg/ contains the definitions and rules needed to build an IPS
38 repository which contain the deliverables from an ON build.
40 The manifests directory contains all manifests, and has one file
41 per package. For most packaging changes you only need to add or
42 change the packaging manifests themselves.
44 The build rules create a package repository. Separate DEBUG and
45 non-DEBUG versions are built, and are available at:
46 $SRCTOP/packages/$MACH/nightly[-nd]/repo.redist
51 The -p option to nightly will build the IPS repository.
53 Alternatively, in usr/src/pkg/Makefile there are make targets for:
56 Process manifests into their final form with unresolved
57 dependencies before publication.
63 Run `pkgdepend resolve`. See Dependencies section.
66 Compare the proto area against package definitions for
67 missing or incorrect files.
70 Check file and directory modes for best practices.
73 Run protocmp and pmodes.
75 The build behavior may modified by the following variables:
78 If SUPPRESSPKGDEP is set to "true" in your environment,
79 package dependencies will not be generated. This variable
80 should not be set in normal builds as it will mask product
84 If PKGDEBUG is set in your environment, $MAKE will print
85 detailed information about the commands it executes to
86 process and publish packages.
88 A set of intermediate build products are placed in
89 usr/src/pkg/packages.$MACH/. These can be useful during development.
92 The resulting package manifest after running pkgmogrify(1)
93 on the supplied manifest. See below for details on
94 pkgmogrify(1) use in ON.
97 The resulting manifest after running `pkgdepend generate`
101 The resulting manifest after running `pkgdepend resolve`
102 on the .dep manifest.
107 If you want to process a subset of manifests, simply set PKGS on the
108 make command line and specify the "all" target. If you want to process
109 them all, simply specify the "all" target.
111 % dmake -e PKGS="BRCMbnx BRCMbnxe" all
114 If you want to publish a subset of packages, simply set PKGS on the
115 make command line and specify the "install" target. Overriding PKGS
116 will cause dependency resolution to be limited to PKGS from the
117 current build, with a fallback to packages installed on the build
118 system. If you want to publish them all, simply specify the
121 % dmake -e PKGS="BRCMbnx BRCMbnxe" install
124 You can also use package names, or package names with ".pub"
125 extensions, as build targets. This will cause processing or
126 publication of the specified package(s).
128 The on-disk repository will be initialized when it does not exist,
129 or when you run nightly -p. If you build incrementally,
130 packages will simply be added to the existing repository.
132 To do cross-platform packaging, prefix your target with (for
133 example) "sparc/", as in "dmake sparc/install". Note that we
134 currently pull some license files directly from a built source
135 tree, so if you do this in a workspace that had proto area copied
136 in via nightly -U, then you'll need to set $SRC to point to the
137 workspace that was actually built.
142 To test the generated repository, you should use the "onu" tool
143 available from /opt/onbld/bin or usr/src/tools/scripts/ to setup and
144 upgrade your system. A manpage is available in /opt/onbld/man
145 or usr/src/tools/scripts/onu.1.
147 Alternatively, you can manually start a pkg.depot(8) server to
148 serve the generated repository to multiple test machines.
150 Start up a depot on your build machine.
151 cd $SRCTOP/packages/$MACH/nightly[-nd]
152 /usr/lib/pkg.depotd -d repo.redist -p <port> &
154 Make SURE you choose an unused port and the depot
157 The depot can be started across NFS as well if you
160 Configure your test system.
161 pkg set-publisher -P -g http://<your server host>:<port> on-nightly
162 pkg set-publisher --non-sticky opensolaris.org
165 pkg image-update your test system.
166 pkg image-update will upgrade all packages on your test system
168 Always make sure your bits are installed with image-update.
170 pkg info osnet-incorporation
172 Multiple packages should be updated.
173 If you did a full build, all ON packages will be updated.
174 When image-update tells you that only one or two packages has
175 been updated, you likely did not get the updates you expected.
177 There are various tactics for troubleshooting a failed upgrade.
178 Make sure entire is uninstalled.
180 pkg install -nv osnet-incorporation@<your version>
181 Ask IPS to explicitly check if ON can be installed, and
182 if it can't, tell you why not.
184 Obsolete and renamed packages can cause trouble.
185 pkg search -l ::pkg.renamed:true
186 pkg search -l ::pkg.obsolete:true
189 Making Packaging Changes
190 ------------------------
192 Package definitions are in usr/src/pkg/manifests/, and have one
193 file per package, including for multi-architecture packages. For
194 most packaging changes you only need to add or change the packaging
195 manifests themselves. No packaging metadata may be kept outside of the
196 manifests. If you find yourself needing to modify usr/src/pkg/Makefile,
197 you're almost certainly doing something wrong.
199 Remember that the "check" target is available to check many of
200 your packaging changes.
202 We run pkgmogrify(1) over the manifests before publication. This
203 allows us to apply a set of macros and package transformations in
204 order to make the manifests themselves easier to maintain.
206 We supply a set of commonly-used macros for use in package manifests.
207 These are the PKGMOG_DEFINES in usr/src/pkg/Makefile.
212 $(PKGVERS), which is set to
213 $(PKGVERS_COMPONENT),$(PKGVERS_BUILTON)$(PKGVERS_BRANCH)
215 pkgmogrify(1) also allows us to include a set of default transformations.
216 The definitions for these transforms are in usr/src/pkg/transforms/. An
217 overview of their use is supplied here, but for a full accounting, please
218 read pkmogrify(1) and the files themselves.
221 This transform is applied to all manifests. It specifies
222 a set of sensible default permissions, a set of
223 directory locations for which the reboot-needed actuator
224 is always applied to files, and some other basic defaults.
227 This transform is applied to all manifests. It ensures
228 that manifest lines which don't apply to the current
229 architecture are stripped.
232 This transform is applied to all manifests. It modifies
233 all package manifest lines for SMF manifests in standard
234 locations to include an actuator which runs manifest-import
235 on installation/update/removal, as well as some others. If
236 you're adding a new class of file that would benefit from
237 a restart or refresh of a specific SMF service, please add
241 This transform is applied to all manifests. It deals with
242 manipulations required for packaging metadata like
243 pkg.renamed, and pkg.obsolete.
246 This transform is available for explicit inclusion in
247 some manifests. It ensures that all contents of the
248 package are not installed within a non-global zone, but the
249 package and its metadata are available in order to satisfy
250 packaging dependencies.
252 pkgmogrify(1) also allows us to use comments and continuation lines
258 pkg(5) uses variants to implement zones. If a package is marked
259 with both global and non-global zone variants, the package contents will
260 be installed in both global and non-global by default.
261 set name=variant.opensolaris.zone value=global value=nonglobal
263 Specific actions within a package can be tagged as applying to only
264 the global zone or only the non-global zones.
266 The hollow_zone_pkg transform described above is also available to
267 simplify a common packaging scenario.
272 Package dependencies are automatically calculated during build time
273 using pkgdepend(1). After you've done a build, you can verify your
274 dependencies in the <package>.res file described above. If the
275 file is missing a dependency that you believe could be auto-detected,
276 please file a bug against pkgdepend(1).
278 Dependencies can be added manually using the "depend" action. Please
279 add a comment describing why the dependency is required.
281 Moving Content Between Packages and Removing Content
282 ----------------------------------------------------
284 pkg(5) tracks when content is removed from packages, and automatically
287 If you need to move content between packages, there are two primary
290 "preserve" files must be marked with original_name.
291 The first time a "preserve" file moves between packages,
292 you must set original_name=<original package>:<file>
293 in that file's action. Subsequent moves do not require
296 Consider adding a dependency on the new package.
297 The only way a system will end up with a new package
298 after upgrade is if an existing package depends on it.
303 To rename a package, leave the old package manifest in place, but
304 empty it of all delivered content. The old package should include:
306 set name=pkg.fmri with the version set explicitly to the
307 build you're integrating into. For example, if you wanted
308 to rename SUNWrmodu in build 133 you'd change the pkg.fmri
310 set name=pkg.fmri value=pkg:/SUNWrmodu@0.5.11,5.11-0.133
312 set name=pkg.renamed value=true
314 The architectures and variants you're renaming. These
315 should just be copied from your old package, as you
316 must rename a package on all architectures and
317 variants simultaneously.
319 A dependency on the new package.
321 If there were "preserve" files in the package you're renaming, make
322 sure to create original_name settings in the new package.
324 If there was a org.opensolaris.noincorp property in the package being
325 renamed, make sure you keep it in both the original and the renamed
331 To remove files, directories, drivers, or anything else within a package,
332 simply stop delivering them in the package. IPS will manage the removal
333 of no longer delivered content.
335 Package removals have impact on the rest of the system. Before marking
336 a package as obsolete, search in the OpenSolaris development
337 repository (http://pkg.opensolaris.org/dev or http://ipkg.sfbay/dev)
338 to find out if any other packages depend on the software you intend
339 to EOF. If any packages do, you need to coordinate with those
342 The "slim_install" package may depend on ON packages. If it does,
343 you must send a FLAG DAY message for ON users and PIT who test
344 install. You must also file an installation bug to get that package
345 updated in the same build or earlier than you intend to integrate.
346 You should also test install yourself. You can do this by replacing
347 the "slim_install" in your Distro Constructor manifest with the
348 explicit list of packages to install.
350 To remove a package, you must mark it as obsolete. You must *also* mark
351 as obsolete any packages which are renamed ancestors of this package, and
352 remove their rename dependencies. Here is what you must do.
354 To find rename ancestors, select all of the manifests which are renames,
355 then look for the one which was renamed to the package you care about.
356 For example, to find rename ancestors of 'system/zones', do the following:
358 $ cd usr/src/pkg/manifests
359 $ mypkgname=system/zones
360 $ grep -l "fmri=pkg:/$mypkgname@" `grep -l pkg.renamed *.mf` /dev/null
363 Make sure to check that the package has not undergone multiple renames!
366 $ grep -l "fmri=pkg:/$mypkgname@" `grep -l pkg.renamed *.mf` /dev/null
369 Once you have the renamed ancestor list, for *each* of the packages (the
370 newly obsolete package, and its renamed ancestors), edit the package as
373 Update 'set name=pkg.fmri' with the version set explicitly to the
374 build you're integrating into. For example, if you wanted
375 to remove SUNWwbsd in build 133 you'd change the pkg.fmri
377 'set name=pkg.fmri value=pkg:/SUNWwbsd@0.5.11,5.11-0.133'
379 Add 'set name=pkg.obsolete value=true'.
381 Maintain the architecture and variant declarations in the
382 package you are obsoleting. Note that you must obsolete a
383 package on all architectures and variants simultaneously.
385 Delete everything else.
387 If the package is a renamed ancestor, leave a comment behind as
390 # Was renamed to <other-pkg-name>, both now obsolete.
392 Here is a complete example. SUNWfoobar was a package which was renamed
393 to system/foobar in build 140, and then later obsoleted in build 150.
394 Note that in all cases the package FMRI is updated to the obsoletion
398 # Was renamed to system/foobar, both now obsolete.
399 set name=pkg.fmri value=pkg:/SUNWfoobar@0.5.11,5.11-0.150
400 set name=pkg.obsolete value=true
401 set name=variant.arch value=$(ARCH)
404 set name=pkg.fmri value=pkg:/system/foobar@0.5.11,5.11-0.150
405 set name=pkg.obsolete value=true
406 set name=variant.arch value=$(ARCH)
411 The easiest thing is to copy a package similar to the one you're
412 trying to create. Note that packages are no longer split on the
415 The following actions are required for all packages in ON.
417 Every package must have an FMRI. That is the package's
421 Every package must have a short summary of its purpose.
423 set name=pkg.description
424 Every package must have a one-sentence description of
427 set name=variant.arch
428 Every package must specify which architectures it delivers.
430 set name=info.classification
431 Every package must specify a category for the packaging GUI.
432 You must use an existing category, and may not invent new ones.
433 Existing categories and their subcategories are listed
434 in /usr/share/package-manager/data/opensolaris.org.sections.
437 All packages must specify a set of license actions. If
438 you're adding items here that are not already included in
439 usr/src/pkg/license_files, then you will also need to modify
440 usr/src/tools/opensolaris/license-list.
442 You don't need to set the following. They're taken care of for all OS/Net
443 packages in the transforms/common_actions file.
445 set name=variant.opensolaris.zone
446 Every package must specify whether it can be installed in
447 global zones, non-global zones, or both. All ON packages are
448 delivered in both global and non-global zones.
450 set name=org.opensolaris.consolidation value=osnet
451 All packages from OS/Net come from OS/Net...
456 Scripting is no longer required to deal with addition or removal of
457 drivers in ON. A "driver" action should be specified for each driver,
458 and IPS will handle updates to all the driver files.