From owner-freebsd-current@FreeBSD.ORG Mon Jul 15 06:23:14 2013 Return-Path: Delivered-To: current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 8FC8851E; Mon, 15 Jul 2013 06:23:14 +0000 (UTC) (envelope-from baptiste.daroussin@gmail.com) Received: from mail-wg0-x234.google.com (mail-wg0-x234.google.com [IPv6:2a00:1450:400c:c00::234]) by mx1.freebsd.org (Postfix) with ESMTP id C628BB1D; Mon, 15 Jul 2013 06:23:13 +0000 (UTC) Received: by mail-wg0-f52.google.com with SMTP id b12so9809763wgh.19 for ; Sun, 14 Jul 2013 23:23:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=eiqeEL1FYiHrOkpFUeKowqZOFDXZkjxNG/Bdvn0WcDs=; b=VhXJjONoB8Q9et0GUZXbyK5/jU6ggjGju+g00y0ULbNO3gO+lli1KW23Qv/eDH7MNt IFOWhx3EvMW95I+KWVqGa9TlbaDUUkJZ++7YLwrJzn0eLMvBo1CRk2tnY9MdeQkzBee+ ugJFwKILfedJXJdiNkue/WXjN0zEoIz4dKSrsKUSEz6bZ/kPRpDjLGmJ7k6rBfIFZqPI imul2ZXfBzQm2xNYc7iUW0qaz6oYWhcJy9twaxavKnIYThybcEbwa4MKfr9M/edB1GJ4 Tw/w1q3tA+ogAdC8MpAl3dUI3IopJ6AqfaFmhQ+8CSLNUjSPHo6Ty1N8cD5a+k1ltBXO z3aA== X-Received: by 10.194.75.201 with SMTP id e9mr29856916wjw.20.1373869392197; Sun, 14 Jul 2013 23:23:12 -0700 (PDT) Received: from ithaqua.etoilebsd.net (ithaqua.etoilebsd.net. [37.59.37.188]) by mx.google.com with ESMTPSA id ev19sm18565133wid.2.2013.07.14.23.23.10 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 14 Jul 2013 23:23:11 -0700 (PDT) Sender: Baptiste Daroussin Date: Mon, 15 Jul 2013 08:23:08 +0200 From: Baptiste Daroussin To: Devin Teske Subject: Re: [HEADSUP] No more pkg_install on HEAD by default Message-ID: <20130715062308.GE1516@ithaqua.etoilebsd.net> References: <13CA24D6AB415D428143D44749F57D7201FC2DBD@ltcfiswmsgmb21> <20130713080732.GV85556@ithaqua.etoilebsd.net> <13CA24D6AB415D428143D44749F57D7201FC3AA2@ltcfiswmsgmb21> <13CA24D6AB415D428143D44749F57D7201FC3C92@ltcfiswmsgmb21> <13CA24D6AB415D428143D44749F57D7201FC3FAA@ltcfiswmsgmb21> <13CA24D6AB415D428143D44749F57D7201FC4E0D@ltcfiswmsgmb21> <51E26FD3.4020208@FreeBSD.org> <13CA24D6AB415D428143D44749F57D7201FC547A@ltcfiswmsgmb21> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="jKBxcB1XkHIR0Eqt" Content-Disposition: inline In-Reply-To: <13CA24D6AB415D428143D44749F57D7201FC547A@ltcfiswmsgmb21> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: Matthew Seaman , "current@FreeBSD.org" , Peter Wemm X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Jul 2013 06:23:14 -0000 --jKBxcB1XkHIR0Eqt Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sun, Jul 14, 2013 at 10:12:19AM +0000, Teske, Devin wrote: >=20 > On Jul 14, 2013, at 2:30 AM, Matthew Seaman wrote: >=20 > > On 14/07/2013 06:48, Teske, Devin wrote: > >> Question: Where can I learn more about the actual format of what's in > >> the new tarballs? This is going to be important not for bsdconfig, > >> but $work (we have our own build platform; I'm going to have to > >> rewrite it from mastering PLIST files to mastering YAML MANIFEST > >> files and I want to know all the gritty details). > >=20 > > We do need a pkg-manifest(5) man page, which can double as a > > pkg-tarball(5) page since the manifest file is where most of the > > interesting bits are. > >=20 > > A pkg tarball is a compressed tar archive like so: > >=20 > > lucid-nonsense:...cache/pkg/All:% tar -tvf pkg-1.1.4.txz > > -rw-r--r-- 0 root wheel 530 Jan 1 1970 +COMPACT_MANIFEST > > -rw-r--r-- 0 root wheel 6385 Jan 1 1970 +MANIFEST > > -rw-r--r-- 0 root wheel 17567 Jan 1 1970 +MTREE_DIRS > > -r--r--r-- 0 root wheel 19453 Jul 7 12:26 > > /usr/local/etc/bash_completion.d/_pkg.bash > > -r-xr-xr-x 0 root wheel 629 Jul 7 12:26 > > /usr/local/etc/periodic/daily/400.status-pkg > > -r-xr-xr-x 0 root wheel 823 Jul 7 12:26 > > /usr/local/etc/periodic/daily/411.pkg-backup > > -r-xr-xr-x 0 root wheel 678 Jul 7 12:26 > > /usr/local/etc/periodic/daily/490.status-pkg-changes > > -r-xr-xr-x 0 root wheel 2558 Jul 7 12:26 > > /usr/local/etc/periodic/security/410.pkg-audit > > -r-xr-xr-x 0 root wheel 611 Jul 7 12:26 > > /usr/local/etc/periodic/security/460.pkg-checksum > > -r--r--r-- 0 root wheel 839 Jul 7 12:26 > > /usr/local/etc/pkg.conf.sample > > -r--r--r-- 0 root wheel 43432 Jul 7 12:26 /usr/local/include/pkg.h > > -r--r--r-- 0 root wheel 727558 Jul 7 12:26 /usr/local/lib/libpkg.a > > lrwxr-xr-x 0 root wheel 0 Jul 7 12:26 /usr/local/lib/libpkg.so > > -> libpkg.so.1 > > -r--r--r-- 0 root wheel 1227064 Jul 7 12:26 /usr/local/lib/libpkg.s= o.1 > > -rw-r--r-- 0 root wheel 187 Jul 7 12:26 > > /usr/local/libdata/pkgconfig/pkg.pc > > [... etc ...] > >=20 >=20 > Interesting. I notice that (while looking ahead to see a prefix: of /usr/= local in the +MANIFEST), the tarball itself has files that include /usr/loc= al in their path. >=20 > Does pkg handle packages where the prefix (in +MANIFEST) is "/usr/local" = _but_ "tar tf" of the unxz'd tarball is _not_ "/usr/local"? (e.g. pkg_insta= ll style) or is this the new way going forward? >=20 >=20 >=20 > > There must at least be a +MANIFEST -- other meta data files are > > optional. +COMPACT_MANIFEST is a subset of the full +MANIFEST. They're > > both YAML documents. +COMPACT_MANIFEST looks like this, for example: > >=20 > > --- > > name: pkg > > version: 1.1.4 > > origin: ports-mgmt/pkg > > comment: New generation package manager > > arch: freebsd:9:x86:64 > > www: https://urldefense.proofpoint.com/v1/url?u=3Dhttp://wiki.freebsd.o= rg/pkgng&k=3D%2FbkpAUdJWZuiTILCq%2FFnQg%3D%3D%0A&r=3DMrjs6vR4%2Faj2Ns9%2Fss= HJjg%3D%3D%0A&m=3DLPoff3ddLDoHE30AU6R5vgBklqxsjVAosXGjJop6uO4%3D%0A&s=3D30b= 27cf33d7e594144fc38f20bc75d84464788e715f7fc82b2495f813fd4be2d > > maintainer: portmgr@FreeBSD.org > > prefix: /usr/local > > licenselogic: single > > licenses: > > - BSD > > flatsize: 6311507 > > desc: | > > New Generation package management tool for FreeBSD > >=20 > > WWW: http://wiki.freebsd.org/pkgng > > categories: > > - ports-mgmt > > shlibs_required: > > - libpkg.so.1 > > shlibs_provided: > > - libpkg.so.1 > > message: | > > If you are upgrading from the old package format, first run: > >=20 > > # pkg2ng > >=20 >=20 > Nice. Very nice. >=20 >=20 >=20 > > +MTREE_DIRS is a compatibility thing with the old pkg_tools. It's not > > needed in general as +MANIFEST can provide all that meta data itself. > > It isn't going to be deprecated for at least as long as the ports tree > > continues to support pkg_tools though. > >=20 > > Beyond that, the rest of the pkg tarball just contains a tar archive of > > all the files, directories, sym-links etc to be installed by the > > package. Note that pkg(8) has no problem with creating an empty > > directory for a package, unlike pkg_tools. > >=20 >=20 > Excellent! >=20 >=20 > > Now, while you can grovel through the details of pkg tarballs and > > internal data formats like this, be aware: the format of the manifest > > and the details of the meta-data included in the pkg-tarballs is subject > > to change without warning as we develop pkg(8) further. We only promise > > API stability through the pkg(8) commands or for the libpkg.so library > > functions; reports of breakage from usage outside those APIs will > > receive little sympathy. > >=20 >=20 > Understood. >=20 > So just to give you a better idea of how we manage packages here. >=20 > We've realized that if you want to package for FreeBSD (in 9 and older), = you could get by alright if you knew how to create a +CONTENTS file from sc= ratch. For RedHat, it's the SPECFILE. And now for FreeBSD 10, it looks an a= wful lot like a SPECFILE (they are both in-fact YAML). The only thing you need if you really want to package is a small subset of = the manifest written in YAML: Have a look at what the ports tree do to create the minimalistic manifest a= nd what form it has and you will see how easy it is. It is so awful and complicated that there are already a load of custom scri= pts to create packages with pkg without using the ports tree. As an example: https://github.com/z0nt/pkg , but there is way more. I for example wrote in the past a plugin for pkg to be able to parse and USE RPM's specfiles as an input for pkg. >=20 > So rather than teach the people here how to use tools, I taught them what= I think is more important... how to manage +CONTENTS, SPECFILE, and now up= -and-coming, +MANIFEST. The problem is that you compare 2 things that cannot be compared, SPECFILE = is the equivalent of pkg + the ports tree. In fact specfiles are the equivalent of a given "port" !!! Are you writing = rpm files directly by hand? there is no SPECFILE inside RPM but rather a header container metadata in binary format and a body which is a cpio.(gz,bz2,xz). You are not creating the RPM file directly but rather create a SPECFILE, the equivalent on FreeBSD is to create a port!!! the +MANIFEST as used to be the +CONTENTS are the equivalent of the RPM metadata. We wrote them in YAML so = that they are easy to debug and that we can use third party well used and tested parsers instead of writting our own. >=20 > However, I'd be lying if I said I taught them *all* the gory details. In = reality, for +CONTENTS they edit a PLIST which is essentially +CONTENTS wit= hout the "@comment MD5:" entries. For SPECFILE, they manage the full thing = except there's a small section that is the standard RPM bootstrap that is l= abeled as "do not touch". >=20 > From what you posted of +COMPACT_MANIFEST was nice, except it lacks the l= ist of files. >=20 > The basic principle here is that if you have to maintain a list of files,= and that list ends up being compiled into a +MANIFEST, why not just teach = your peers how to read/write/maintain +MANIFEST files (in version control o= f course) so that there are never any mysteries as to how the package perfo= rms. Have a closer look at pkg create, you will see that we are still able to us= e the plist or +CONTENTS as a possible input for pkg create, it is even the main = way to create packages. Once again, the main and most important requirement to build packages was t= o be compatible with the ports tree, and the ports tree is using plist/+CONTENTS. and pkg2ng does only works by using the +CONTENTS. >=20 > I know this sounds screwy... but (as with our other YAML files), it's rea= lly nice because (as is the case with SPECFILE), we version-control things = as-close to the end-product as possible (take for example the case of "pre-= install" or "post-install" et cetera scripts -- I'm sure a tool like "pkg c= reate" or "pkg_create" or other could do a good job of assembling the piece= s into the +MANIFEST, but then it's not being version-controlled as closely. You can keep what you have already done. Once again pkg does not have the equivalent of the SPECFILE because we have= the ports tree! so we do not need to provide a custom package building system. We could, as it is really easy, but we do not need so it is not there yet, = as said earlier I already wrote a pkg plugin that is able to build packages fr= om a RPM specfile, I also modified archlinux's makepkg to be able to output pkgn= g files. I did the same on slackare, etc. Here the limitation is not technical at al= l. Bapt --jKBxcB1XkHIR0Eqt Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (FreeBSD) iEYEARECAAYFAlHjlUwACgkQ8kTtMUmk6Ew9UACggBbNenoJv7wzsrk3sTnaH6nu 4osAnjmGCuSJWFKVktv5ZnRPPWi2nTmj =QPsZ -----END PGP SIGNATURE----- --jKBxcB1XkHIR0Eqt--