Jordan K. Hubbard wrote:

This is what RPM does already... rpmbuild(8) builds, rpm(8) installs.

Building has BuildRequires, Installing has Requires. Otherwise both use .rpm packages (for digests, signatures, etc). There's even separate types of binary packages. Some packages have really long and complex needs for building from source, but installing the binary does not. So having "foo" and "foo-devel" helps cut down the number of dependencies, when not always wanting to install the developer files too (like done with ports). Libraries can also be split off from programs, same reason.

Yep, RPM already has this whole ecosystem covered - SRPMs are their "ports" and the RPMs their packages. However, I think we can also all agree that the "spec" format for declaring all of this has always been pretty ugly (I don't know what Jeff has in store for RPM's future, but right now we have what we have) and we don't necessarily want to target it without a good reason. Arguably, we also have a really good build system already, so all of those portions of RPM would be redundant extra code to carry around, in a certain sense, and what we really need are just the package delivery bits so RPM is probably overkill.

I don't think the yaml-based .spec format is _that_ much uglier than the text-based .port, but that is all handled behind the scenes anyway since the MacPorts build system stays the same. This was more about "the package delivery bits". Splitting packages into subpackages is optional with RPM, not required. OpenPKG doesn't do it, for instance (they have no *-devel).

But you know where RPM is, if wanted. The previous versions are at http://rpm4darwin.sourceforge.net/ (or just use "port install rpm") or http://rpm5.org/files/rpm/rpm-5.2/BINARY/RPM5-20090707.dmg (port "rpm52"), or build the new stuff for Snow Leopard from source on http://rpm5.org/sources.php for all the new features that Jeff mentioned... If wanting more than archives.

Where the only difference to what it does now is that the final install step is separate from the others, so that you can start with just "pkg(1)" and "*.xpkg" and not have to do all the rest ?

Correct! More to the point, you should also be able to do something like: pkg -R -add someCoolPackage.xpkg in order to connect to a remote HTTP / FTP server somewhere and just grab the latest version of someCoolPackage for your relevant OS / architecture, installing any dependencies that someCoolPackage might have automatically.

This isn't just a weird idea - *BSD's pkg_add command currently supports this with the -r flag, e.g.:

freebsd8# pkg_add -r bash
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.1- release/Latest/bash.tbz... Done. Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.1- release/All/libiconv-1.13.1_1.tbz... Done. Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.1- release/All/gettext-0.18_1.tbz... Done.

I can install FreeBSD 8.1 for AMD64/SPARC/PowerPC on the relevant hardware, for example, and then as the very first thing on the new box "pkg_add -r bash" and it just works, automatically appending the architecture and FreeBSD version # to a built-in search path which is used to search around at ftp://ftp.freebsd.org/pub/FreeBSD/ packages/ until the most applicable bash package can be found (I think it looks in about 5 places, in decreasing order of specific relevance). I don't have to know or care which OS revision or architecture I'm on if the nice package makers over at FreeBSD.org have taken my needs into account with their package building fleet, and it's all very convenient and easy to use - my internet connection is the only bottleneck in quickly populating my system with the extra software I need.

I don't care very much for pkg_add(1) directly, as it's a bit too lowlevel for me. I prefer using portinstall(1) from pkgtools, with the -PP (--use-packages-only) option if I'm looking for binaries...

But yeah it is nice, the main missing features are the package size or the package contents. But that is easy enough to add with additional metadata beyond the INDEX (such as FILE_LIST, or MANIFEST)

Archives are different in that they only allow you to shortcut the "destroot" phase, but do need all of the others. Packages would need to have all runtime information available, without peeking in the port. I think you are missing the "activate" step above, but then again I don't think that step is very useful.

The activate step was a wrinkle I kind of deliberately glossed over. :-) We'd have to decide, in a package producing world, just what to do about the different installation types, direct and image, and perhaps make some hard decisions about perhaps just supporting one of them. I can certainly see packages being somewhat polymorphic in how they deal with direct/image, doing different things at install time (I even have a pretty fair idea as to how to do it), but it still begs the question as to whether the additional complexity would really be worth it or if we couldn't just say "to hell with it, packages are always direct mode installs!". Food for thought.

That is what the current package targets (pkg, rpm) do, as they don't have any images. Image mode is only useful if you can have multiple versions active at the same time, and since you can't they're just sitting there wasting space. At least the packages are archived and compressed, but still there without rebuild if you need to reinstall.

I'm not sure why the runtime has to be in the packages themselves, it seems less redundant to have a small "installer" program installation contain that ? But either way, it would have been a "MacPorts Developer" that would offer to build things from ports and a "MacPorts User" that would simply install pre-made archives. And for that to work better, archives would need some improvements (extra data).

I also don't know how far the pkg tool and xpkg format have come, and I would be the last person to argue for some crufty legacy system in favor of something truly new and shiny, but if we're a ways from seeing home-grown tools and people are sick and tired of hearing me talk about packaging all the time, I would be more than willing to port the FreeBSD package tools over since I know how they work and what their OS dependencies are, then enhance archives to the point to where the +CONTENTS file is actually meaningful and relevant to the task of installing packages. At that point, archives really would be packages since you could scrape them all together and put them on an FTP / HTTP site for use by pkg_add -r, as demonstrated earlier. I would probably have to contrive a new Portfile variable for expressing some of the extra metadata which can't be easily contrived from inspecting ${DESTROOT}, and for some period of time this would "parallel" the post-install/post-activate procedures in some of the ports until we could retire one in favor of the other, but that's also the easiest transition to make which doesn't break anything.

The pkg(1) tool was just a copy/paste of port(1) tool, with lots of sections ripped out and a shortcut to handle file arguments (rather than port names). This was so you could say "pkg install foo-1.2_3.tgz" or "pkg install http://example.com/foo-1.2_3.tgz";, rather than "pkg install foo" and use the pkgindex. But it didn't make it as far as a separate install or anything.

The xpkg format "version 0.2" was added in MacPorts 1.8.0, it would need similar improvements to +CONTENTS. Porting the needed fields over from FreeBSD sounds like a good transition, but pkg would probably still need to embed Tcl for the more complex package scripts. And yes, it would still all be "archives". The main difference with xpkg was the XML...

It just seems like a lot of work, making a new package manager and reinventing digests and signatures and embedded scripts and storage formats ?

Not if we start with something existing.  See above.

Archives didn't have digests or signatures, but could use something simplistic like "CHECKSUMS.md5.asc" or "Release.gpg". That is, just have GNU Coreutils digest all the package containers into one index and then sign that file with GnuPG, like Slackware or Debian does it.

Or use .rmd160 and openssl, for each archive file ? (like http:// trac.macports.org/browser/trunk/base/src/package1.0/ portarchivefetch.tcl) Depends on what new fields you end up with for the pkgdata and pkgindex, I suppose...

Well, the increasing popularity of HomeBrew probably says something about the popularity of Ruby vs Tcl, but I would also maintain that most folks writing Portfiles don't even really know they're using Tcl since the language looks so much like standard english ("frob some arguments") in its simpler form. I don't think Tcl is the biggest barrier to entry for most users, simply the lack of pre- built software which mirrors their experience on other platforms (including the iPhone :) ).

I prefer my recipes to be markup rather than scripts, but I'm OK with either scripting language (Sh, Tcl, Ruby) for the build scripts.

It's not needed for "base" to be in Tcl too, just because the "dports" tree is, but I think that is also being fixed now (with Objective-C).

And I didn't think MacPorts cared about making binary packages…

I think MacPorts "cares" for some value of care, it's just waiting for someone else to do the work. I'm even volunteering, since I'm tired of always just ranting about it and then wandering off again. ;-) Of course, there are always dissenting opinions:

Then again, why *should* MacPorts care about making binary packages that can be installed without MacPorts ? That was the main argument for going with archives, as they were "internal".

But actually building binaries, or fixing licensing issues such as openssl, was much more important than discussing storage formats or logging formats or bikeshed colors. Thus: archives.


On Sep 21, 2010, at 5:08 AM, Takeshi Enomoto wrote:

Those who prefer binaries could use Fink or Homebrew.
To me MacPorts is an aid to build open source software.
It is better than free format instructions and binary packages that
could be inconsistent with others.
Even with consistent binaries it would not be easy to provide
every possible combination of variants.

Which to me suggests kind of an admission of defeat. "We can't provide packages, so why not go use Fink or Homebrew?" I think that really under-sells what MacPorts is capable of, and one reason I *don't* just use Fink or Homebrew has a lot to do with the quality of the build system and my faith in its ability to create software which has been compiled in an appropriate "jail" such that I know it's going to work. I also have a lot more faith in MacPorts' small army of volunteers keeping the build recipes up to date and otherwise making sure it works on a reasonable number of Darwin platforms, I just also want to offer that magic "pkg_add -r" functionality such that building stuff is more of a step of last resort.

So the first step would be finishing the MPAB project ?

As to the variants, I would agree that they're harder to create packages for since you would have to iterate through every possible package/variant combination to truly generate a package collection which anyone could use, but that's perhaps where the idea of an "on demand package builder" makes sense, since you then only have to build and cache stuff users are actually asking for, and this would also allow you to keep stats on the most popular packages (globally) such that people who don't actually know what variants to ask for can simply look at what other people are using and pick the most popular variant configuration.

Just building the default variants sounds like a start.


On Sep 21, 2010, at 10:00 AM, Landon J Fuller wrote:

I agree with just about everything Jordan has had to say, but I also agree that it would be a shame to put the breaks on an emerging pragmatic solution. As long as MacPorts doesn't *require* a development environment for end-users, then using signed archives -- as long as they include the same metadata a port install would -- seems like a good first step.

Thanks, Landon. I think that first step is actually fairly straight-forward, and unless Anders would like to pursue pkg(1) + xpkg format, which I would also enthusiastically support, I'll be happy to do the work. All this management is making my brain turn to sludge and I could use the distraction. :-)

Well, MacPorts *does* require Xcode now. (http://trac.macports.org/ changeset/68593) Even if all you want to do is install archives... It also requires a full ports tree, and even does a "sync" for you automagically. When using packages you would probably have a (similar) "pkgindex" rather than the "portindex" (+Portfiles), once archives have all metadata. The "selfupdate" could simply link to the download webpage.

I don't think pursuing your xpkg format is worthwhile, IMHO it (.xar and .xml) doesn't offer anything over the usual (.tar and .txt) besides worse compression ratios and more complex parsing. Adding pkg (1) as a complement to port(1) is still doable, but one can just use "port -b" meanwhile ? Of course, the first thing required for that to work would be to enable "archivemode" which is currently disabled by default.

--anders

_______________________________________________
macports-dev mailing list
[email protected]
http://lists.macosforge.org/mailman/listinfo.cgi/macports-dev

Reply via email to