Yoshihiro Ota wrote:
On Thu, 26 Jul 2007 02:17:50 -0700
Garrett Cooper <[EMAIL PROTECTED]> wrote:

Yoshihiro Ota wrote:
To Whom Slowness of Portupgrade Concerns a Lot:

As I got tired of long waiting of portupgrade trying to resolve dependencies, I 
came up with
yet another tool for upgrading FreeBSD ports system.  Unlink other tools, it 
tries to maximize
existing resource to maximize its performance.  This program attempts to wrap 
around with
another 'make' and expand use of FreeBSD ports system.  The heart of ports+ is 
parsing INDEX
and +CONTENTS files.  The rest is handed to GNU make.  I think it comes to a 
point where I seek
wider audiences to test with it.

Hiro,
You're correct when you say that reading INDEX* does take a long time
for portupgrade, but the problem is partly with how portupgrade formats
its version of the INDEX database in BDB format, as well as how it
doesn't buffer up proper information (pkg database information for
instance), and guesses at port dependencies (origins, deporigins, etc).

Portupgrade is not only slow reading INDEX file but also on dependency resolving and 
updating +CONTENTS files, too.  I think portmaster is also one tries to read and do the 
same things but with shell script.  I personally didn't have good luck with portmaster 
and haven't really used to evaluate.  However, "portmaster -a -n" wasn't not 
fast, neither.  By the way, it builds ports in background, doesn't it?
Yes, but a lot of time is spent reading the INDEX file, especially since portupgrade / portinstall don't keep that information in memory (probably for the better though).

Like Doug said, portmaster doesn't built ports in the background, and the way that the package system is currently setup I don't advise doing that unless you plan everything out properly (I see potential for duplicated installs, race conditions, and other unwanted possibilities). I'm working on getting away from that at the moment.
1. Can your solution be made bsdmake and bsd awk compatible?

I am not as familiar in newer BSD awk and make extensions.  I can point out 
what kinds of GNU extensions are being used so that someone can tell it is also 
available in BSD make/awk.

For awk, this feature is required, quoted from "man gawk".  I am not sure if 
BSD awk implements this feature.

       The book indicates that command line variable assignment  happens  when
       awk  would  otherwise  open  the argument as a file, which is after the
       BEGIN block is executed.  However,  in  earlier  implementations,  when
       such an assignment appeared before any file names, the assignment would
       happen before the BEGIN block was run.  Applications came to depend  on
       this  "feature."   When awk was changed to match its documentation, the
       -v option for assigning variables before program execution was added to
       accommodate  applications  that  depended upon the old behavior.  (This
       feature was agreed upon by both  the  Bell  Laboratories  and  the  GNU
       developers.)

For make, 1.1 and 1.2 below are in the same topic.  I use GNU extension which 
keeps generating makefiles until dependency rule saticifies and use it part of 
the make rule.  GNU extension reloads newer makefiles and reconstruct 
dependencies.  I am not sure if it is possible in BSD make; however, this is 
not a heart of this program.  We can work around with bootstrap script or 
something.
1.3 This is recursive expansion of variables.  If you take a look, every port 
needs upgrade uses $(UPGRADE).  $(UPGRADE) is expanded multiple times using the 
target variable, $@, such that it backups up correct old package names and so 
on.  This is very important and unless this works in BSD make, my tool really 
needed full redesign from scratch.
1.4 is just how GNU make does shell invocations.  It is available in most of 
Make tools.
1.5 is something I am not sure which makes support these.  I don't think GUN make recommends 
using special characters as variable names.  However, when I tried, it was too difficult to 
normalize to alphabets and underscore only.  If we cannot use variable like PORTS+IGNORE as a 
variable name, it will be very difficult and personally I don't even think about trying that 
myself.  If you take a look at compat.gmk which ports+ generates as a part of its build rule, you 
can find something like "COMPAT_$(PKG_DIR)Hermes-1.3.3_2 = cp -f 
/usr/local/lib/libHermes.so.1 /usr/local/lib/compat/pkg&&" being variable.

1.1 How makefiles get remade:
http://uw713doc.sco.com/cgi-bin/info2html?(make.info)Remaking%2520Makefiles&lang=en

1.2 Including Other Makefiles:
http://uw713doc.sco.com/cgi-bin/info2html?(make.info)Include&lang=en

1.3 Computed Variable Names or recursive expandsion of variables:
http://uw713doc.sco.com/cgi-bin/info2html?(make.info)Computed%2520Names&lang=en

1.4 The `shell' Function
http://uw713doc.sco.com/cgi-bin/info2html?(make.info)Shell%2520Function&lang=en

1.5 Special characters in variable names such as dot, ., comma, ,, slash, /, 
and so on.
Ah, good ole SCO.. I can't believe they're posting docs like that. Lol.

I do see your variable naming scheme as a cause for concern though, unfortunately. I steer clear of shell-like configurations like this when you can potentially get malicious text inside a variable name / declaration.
2. Does your solution account for cases when you're trying to install
package a, which depends on package b, but because you built package b
while trying to build a, and are at an intermediate package c (between a
and b), the dependencies for a are only partially complete. Thus when
you try to install direct or indirect dependences, the install fails?

Some of answers are explain in the GNUmakefile.  Anyway, ports+ categorizes all ports 
into three, NEW as ones not installed, UPGRADE as installed and newer version is 
available, NOOP as installed an no newer version is available. I only started with 
upgrading only and haven't really though thought installing new ones.  I am not ready to 
talk about installing new ports via ports+.   Short answer for upgrade is, "Yes, it 
does."  Here are some examples.  Let's say 'a' depends on 'b'.  Then, it builds 'b' 
first and than 'a'.  If new version of 'b' has new requirement of 'c'.  Making 'a' will 
result installing 'c' and than upgrading 'b.'  If 'e' requires 'f', 'g', and 'h' and 
these are independent from each other, upgrading 'e' with -j 3 will start upgrading 'f', 
'g', and 'h' at the same time and once all three are upgraded, it will start on 'e'.
That's really good thinking sir for single installs. Props to you for that :).
3. How is this different from pkg_version combined with similar scripts?

I wasn't aware of pkg_version, but it looks like it only tells if port is up to 
date or not.  It doesn't tell anything about dependencies among ports, does it? 
 If so, it doesn't provide enough information to upgrade.
Every time you run make install, portmaster, or portupgrade, there's a lot of stuff going on behind the scenes. One of the things involved is installing package information in /var/db/pkg. That's where pkg_version gets its information from, along with portmaster (AFAIK) and the makefiles for ports (for sure). It does provide enough info to tell whether or not something needs to be upgraded, based on the output (<, =, or >). It doesn't tell you the official target you're upgrading to, but it doesn't really need to do that though.
The difference from other two is the following.  Portupgrade and portmaster "reads" what's in ports, INDEX, 
and what's installed, +CONTENTS, "solves" dependencies itself, and "manages" upgrading port itself. 
 Instead, ports+ "converts" INDEX and +CONTENTS to (GNU) Makefile and let the dependency expert solve the 
rest.

Hiro
I do like the ideas of simplified makefiles, but I see dependencies changing frequency, unfortunately, and if dependencies are changed or touch(1)'ed, then things have to be rebuilt to make gmake happy :). Your exercise in doing this is interesting though, nonetheless.
-Garrett
_______________________________________________
freebsd-ports@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-ports
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to