FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.

» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > ArchLinux > ArchLinux Pacman Development

LinkBack Thread Tools
Old 06-30-2008, 07:38 PM
Sebastian Nowicki
Default Alternative to autotools: waf?

I have been looking for a nice build system, for personal, for quite
some time now. I saw waf at one point and thought it might be a good
system, but I never paid much attention to it. Recently I again
started looking into it and I decided to use pacman to test out how
good it is. In comparison to autotools, the language (python) is a lot
simpler and easier to understand, although it still took a while to
understand waf. The size of the configuration script is significantly
smaller (see statistics below). The waf website also claims that it is
faster than autotools, I believe it is, but I did not actually
benchmark anything. So far I've managed to get libalpm to compile
(shared library only), and pacman shouldn't be too hard since most of
the stuff is already there. The script is far from being finished, I
simply wanted to see how difficult it was to get something compiled,
while linking against external libraries. I just wanted to see if
anyone was interested in actually using waf as the build system for
pacman. If not, I'm not sure that I'll be bothering with compiling
pacman, since I only really need libalpm.

Not sure if all these files are created by people, but even
configure.ac alone is larger;

$ wc -l configure.ac Makefile.am config.* acinclude.m4
404 configure.ac
29 Makefile.am
1526 config.guess
614 config.rpath
1658 config.sub
4952 acinclude.m4
9183 total

$ wc -l wscript
143 wscript

Note: The build script has only been tested on Mac OS X, and thus I
don't know if it links properly against libdownload.

From wscript:

VERSION = '3.1.4'
APPNAME = 'pacman'
LIB_VERSION = '2.3.1'
LIB_NAME = 'libalpm'

srcdir = '.'
blddir = 'build'

def set_options(opt):
# TODO: Optparse on Mac OSX Leopard seems outdated, this doesn't
work there

# opt.set_defaults(
# root_dir='/',
# pkg_ext='.pkg.tar.gz',
# src_ext='.src.tar.gz',
# db_ext='.db.tar.gz',
# use_internal_download=True,
# want_doc=False,
# want_doxygen=False,
# want_asciidoc=False,
# want_debug=False,
# want_gitver=False,
# pacman_static=True
# )

opt.add_option('--with-root-dir', dest='root_dir',
help='set the location of pacman's root operating directory [/]',

opt.add_option('--with-pkg-ext', dest='pkg_ext',
help='set the file extension used by packages [pkg.tar.gz]',

opt.add_option('--with-src-ext', dest='src_ext',
help='set the file extension used by source packages
[src.tar.gz]', default='src.tar.gz')

opt.add_option('--with-db-ext', dest='db_ext',
help='set the file extension used by the database [db.tar.gz]',

# opt.add_option('--disable-internal-download', type='store_false',
# dest='use_internal_download',
# help='do not build with libdownload/libfetch support')
# opt.add_option('--disable-doc', type='store_false',
# dest='want_doc',
# help='do not generate documentation')
# opt.add_option('--enable-doxygen', dest='want_doxygen',

# help='build your own API docs via Doxygen')
# opt.add_option('--enable-asciidoc', dest='want_asciidoc',

# help='build your own manpages with Asciidoc')
# opt.add_option('--enable-debug', dest='want_debug',

# help='enable debugging support')

def configure(conf):
import Params

def conf_check_function(name, mandatory=1, headers=[],
header_code=', define='):

functest = conf.create_function_enumerator()
functest.mandatory = mandatory
functest.function = name
if headers:
functest.headers = headers
if not define:
define='HAVE_' + name.upper()
if header_code:
functest.header_code = header_code
functest.define = define

conf.check_tool('compiler_cc checks')

headers = [

for header in headers:
headerconf = conf.create_header_configurator()
headerconf.name = header
headerconf.mandatory = 1
headerconf.message = header + ' is required.'

conf_check_function('geteuid', 1, ['unistd.h'])
conf_check_function('realpath', 1, ['stdlib.h'])
conf_check_function('regcomp', 1, ['regex.h'])
conf_check_function('strcasecmp', 1, ['string.h'])
#conf_check_function('strndup', 1, ['string.h'],
header_code='#define _GNU_SOURCE') #TODO: FIX

conf_check_function('strrchr', 1, ['string.h'])
conf_check_function('strsep', 1, ['string.h'])
#conf_check_function('strverscmp', 1, ['string.h'],
header_code='#define _GNU_SOURCE')

conf_check_function('swprintf', 1, ['stdio.h', 'wchar.h'])
conf_check_function('wcwidth', 1, ['wchar.h'])
conf_check_function('uname', 1, ['sys/utsname.h'])
conf_check_function('archive_read_data', 1, ['archive.h'],
conf_check_function('downloadParseURL', 0, ['download.h'],
conf_check_function('fetchParseURL', 0, ['sys/param.h', 'stdio.h',
'fetch.h'], define='HAVE_LIBFETCH')
if conf.env['HAVE_LIBDOWNLOAD'] != 1 and conf.env['HAVE_LIBFETCH'] !
= 1:

#TODO: Print error
#fatal('libdownload or libfetch are needed to compile with
internal download support')


conf.env['LIB_ARCHIVE'] = 'archive'
conf.env['LIB_DOWNLOAD'] = 'download'
conf.env['LIB_FETCH'] = 'fetch'

conf.define('PACKAGE', APPNAME)
conf.define('ROOTDIR', Params.g_options.root_dir)
conf.define('DBEXT', Params.g_options.db_ext)
conf.define('PKGEXT', Params.g_options.pkg_ext)
conf.define('DBPATH', '/usr/lib/pacman/')
conf.define('LOGFILE', '/usr/log/pacman.log')
conf.define('CACHEDIR', '/var/cache/pacman/pkg/')
conf.define('CONFFILE', '/etc/pacman.conf') #TODO: make path
conf.define('RETSIGTYPE', 'int') #TODO: Fix? (AC_TYPE_SIGNAL

#conf.define('HAVE_CONFIG_H', 1) # autotools compatibility


def build(build):
import Constants
env = build.env()
libalpm = build.create_obj('cc', 'shlib')
libalpm.name = LIB_NAME
libalpm.target = 'alpm' # waf prepends 'lib' (why?)
libalpm.uselib = 'ARCHIVE'
if env['HAVE_LIBDOWNLOAD'] != Constants.UNDEFINED:
libalpm.uselib += ' DOWNLOAD'
elif env['HAVE_LIBFETCH'] != Constants.UNDEFINED:
libalpm.uselib += ' FETCH'
libalpm.find_sources_in_dirs('lib/libalpm', exts=['.c'])

# pacman = build.create_obj('cc', 'program')
# pacman.name = 'pacman'
# pacman.target = 'pacman'
# pacman.uselib = 'libalpm'
# pacman.find_sources_in_dirs('src/pacman', exts=['.c'])
pacman-dev mailing list

Thread Tools

All times are GMT. The time now is 10:20 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org