From owner-freebsd-arch@FreeBSD.ORG Thu Aug 28 01:26:11 2008 Return-Path: Delivered-To: FreeBSD-arch@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1EFC4106564A for ; Thu, 28 Aug 2008 01:26:11 +0000 (UTC) (envelope-from keramida@freebsd.org) Received: from igloo.linux.gr (igloo.linux.gr [62.1.205.36]) by mx1.freebsd.org (Postfix) with ESMTP id A17228FC18 for ; Thu, 28 Aug 2008 01:26:10 +0000 (UTC) (envelope-from keramida@freebsd.org) Received: from kobe.laptop (adsl106-184.kln.forthnet.gr [77.49.225.184]) (authenticated bits=128) by igloo.linux.gr (8.14.3/8.14.3/Debian-5) with ESMTP id m7S1Cx0A007871 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Thu, 28 Aug 2008 04:13:05 +0300 Received: from kobe.laptop (kobe.laptop [127.0.0.1]) by kobe.laptop (8.14.2/8.14.2) with ESMTP id m7S1Cxue090781; Thu, 28 Aug 2008 04:12:59 +0300 (EEST) (envelope-from keramida@freebsd.org) Received: (from keramida@localhost) by kobe.laptop (8.14.2/8.14.2/Submit) id m7S1CwsH090780; Thu, 28 Aug 2008 04:12:58 +0300 (EEST) (envelope-from keramida@freebsd.org) From: Giorgos Keramidas To: Chuck Robey References: <48B58846.6040400@telenix.org> Date: Thu, 28 Aug 2008 04:12:58 +0300 In-Reply-To: <48B58846.6040400@telenix.org> (Chuck Robey's message of "Wed, 27 Aug 2008 13:00:54 -0400") Message-ID: <8763pmt011.fsf@kobe.laptop> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-MailScanner-ID: m7S1Cx0A007871 X-Hellug-MailScanner: Found to be clean X-Hellug-MailScanner-SpamCheck: not spam, SpamAssassin (not cached, score=-4.29, required 5, autolearn=not spam, ALL_TRUSTED -1.80, AWL 0.11, BAYES_00 -2.60) X-Hellug-MailScanner-From: keramida@freebsd.org X-Spam-Status: No Cc: FreeBSD-arch@freebsd.org Subject: Re: an argument of make(1) X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Aug 2008 01:26:11 -0000 On Wed, 27 Aug 2008 13:00:54 -0400, Chuck Robey wrote: > I am posting this to our arch list; if I'm wrong, we can move this. I > want to argue for some changes to our great make(1) tool. > > I've long been a fan of make, and in particular, FreeBSD's make. In > my own career, I've often had to do more custom creation of Makefiles, > and while there are some folks here who definitely DO know our make > better, I think I can honestly say I know it pretty well. In creating > tools for customers, I've often been forced, unwillingly, to go to the > GNU make tool. The reason is just one of compatibility. There are > several different reasons for this, which I want to list: I can certainly feel the `pain' of reluctantly choosing GNU make, or even of going the automake/autoconf/libtool way. I have written a fair amount of build glue myself too, and I know that I'd love to have BSD make in other systems too. Since the topic of (re)using FreeBSD make on non-BSD platforms seems to pop up more or less every 4-6 months the last year, I've started at least two attempts at porting 'FreeBSD make' to non BSD systems. The last attempt was aiming for a 'clean' set of minimal changes to the source of make. And it's done. At least the *binary* of make builds and tries to pull bsd.*.mk files on Linux and Solaris 10 here. The actual *source* code changes needed to build a BSD-make executable on Linux are pretty 'small': keramida@mithra:/home/keramida/tools$ uname -a Linux mithra 2.6.24-19-generic #1 SMP Fri Jul 11 23:41:49 UTC 2008 i686 GNU/Linux keramida@mithra:/home/keramida/tools$ hg short -r1 1:664527963082 | 2008-07-25 16:47 +0300 | keramida: Import FreeBSD make-20080724 snapshot (svn 180782) The diff from the first snapshot import of FreeBSD make touches only a few files: keramida@mithra:/home/keramida/tools$ hg diff -r 1:tip bin/make | diffstat -p1 bin/make/Makefile | 8 +++++- bin/make/compat.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ bin/make/compat.h | 36 +++++++++++++++++++++++++++ bin/make/job.c | 8 +++++- bin/make/main.c | 17 ++++++++++++ bin/make/pathnames.h | 2 - 6 files changed, 135 insertions(+), 3 deletions(-) keramida@mithra:/home/keramida/tools$ Now I'm looking for some spare time to clean-up the changes a bit and integrate them in `http://hg.hellug.gr/bmake/gker/'. The tricky part is, however, that a lot of the functionality of make(1) depends on the `share/mk/bsd.*.mk' files. I have finished writing the automake glue that installs these in `$prefix/share/mk' but now I am kind of stuck while thinking about a good way to make the bsd.*.mk files actually usable on, say, FreeBSD, Linux and Solaris. > 1) while the GNU make has the -v to allow one to both identify the > tool and the version, FreeBSD's make has no such facility, that I'm > aware of. You can't test & capture the type of make here, except by > the rather inadequate trapping of getting no response at all. Both -v and -V are taken, and I don't really like the idea of adding long options to make(1). Maybe we can partially ``hijack'' the -v option to also display a verbose version string, i.e.: % make -v FreeBSD make (version 5200408120) make: no target to make. % It's probably ok to print a version number when 'being extra verbose' :) > OK, that'st the major argument. I'm going to ask for one thing here, > but it's truly extra, just my own bias's showing thru. I wish that a > fair number of the changes that have gone into make be taken back. > I'm not talking about those that enhanced it's operation, I'm talking > about all of the changes that, while trying to increase the elegance > of the code, have really destroyed it's porrting portability, in a > major way. Make used to depend on a smaller set of libraries, and > those libraries were largely those available on other systems, so the > task for a programmer, to port our make(1) to a different platform > wasn't all that hard to do. Nowadays, with a great number of the > changes having been crafted to change dependencies to FreeBSD-only > tools, it's a real bear to port it. make(1) is actually pretty 'easy' to compile on, say, Linux, as I wrote above. The only bits that are missing on Linux are: * An errc() function. I added one in compat.c of my diffstat output above, and this accounts for most of the lines in the patches. * Our make(1) uses arc4random(). #ifdef HAVE_ARC4RANDOM and a few lines to call srandom() or srandomdev() and random() when it's unavailable are probably `ok' for this. * FreeBSD make uses getprogname(), but saving argv[0] and re-using that is trivial to add when HAVE_GETPROGNAME if undefined. * On FreeBSD/pc98 systems make tries to get the value of the "machdep.ispc98" by calling sysctlbyname("machdep.ispc98", ...). Since this part of the code is to be able to build make on pre-7.0 FreeBSD/pc98 systems, it may be ok to #ifdef HAVE_SYSCTLBYNAME and ignore this compatibility code on non-FreeBSD systems. This pretty much sums all the source code changes I had to make to build on Linux and Solaris. I'll see how much of the changes I can clean up and post online at `http://hg.hellug.gr/bmake/gker/'. It should be pretty easy, so please ping me in a couple of days if I haven't followed up with an "ACK, all done now". The 'porting' of share/mk/bsd.*.mk files may be a bit trickier, and it may even turn out to be much more difficult. I can certainly use all the help I can get there... - Giorgos