My votes on waf.  So I think I'll share my experiences with it.

Several years ago I wanted a cross platform solution to handling project builds. I had been using eclipse/CodeBlocks which worked OK for simple project but the lack of binary libraries for D and Windows combined made me desire something else.

When I first discovered waf, I recall it being explicitly stated the idea was to have a small binary that lives with the package. The purpose was that every project could include it and no matter how many Waf releases later it will still compile. That philosophy sort of goes against the idea of packaging it, as any project that uses it should contain it's own copy.

Over the years I found it does it's job quite well. I've been using it exclusively for larger D projects and I keep the binary as part of the repository.

Other than it being a python script, which attempts to be platform neutral by design. My favorite feature is the automatic dependency feature. Working with Windows, D in particular, means I have to build both the C/C++ library as well as the D glue code.

I find it simple enough, since waf is python, to replicate the build process of other software that I can compile the library and then use the uselib feature to have it used by my final executable. When dealing with external dependencies, it's even possible to store just the waf build script and download the library source separately. If you wanted to get fancy you could make waf download it instead.

I've even made it do something crazy like using D compiler specific to it's project for compiling the source. That was as trivial as doing this at the top of the file.

os.environ["PATH"] = "C:/GDC-Tango/mingw/bin"
os.environ["CPATH"] = "C:/GDC-Tango/mingw/include"


With that said, I do find the lack actual use documentation annoying. It took me about an hour to figure out how the new uselib system worked. But it seems to be improving. I tend to copy my own scripts and strip it down to the core commands when I need one.

I'll even include a sample wscript file. This is what I use when starting a new project with waf. This is essentially a Makefile and doesn't utilize any of the advanced api.

-- Dummy wscript --
#waf configure
#waf build

import os, sys

top = '.'
out = 'build'

src_files = [
    'src.d',
]

def options(opt):
    # build options go here
    pass

def configure(conf):
    #conf.check_tool('dmd')
    conf.check_tool('gdc')
    conf.check_tool('gcc')

    # Windows support
    if sys.platform == 'win32':
conf.env.DFLAGS_WIN32 = ['-v2', '-m32', '-fversion=EnableVararg']
        conf.env.LINKFLAGS_WIN32    = ['-v2', '-m32']
        conf.env.LIB_WIN32          = ['user32', 'gdi32']

    if sys.platform == 'linux2':
        conf.env.LIB_LINUX2 = ['dl', 'GL']

def build(bld):
# Search external dir for wscript or wscript_build
#    bld.add_subdirs('subdir')

    example = bld.new_task_gen(
        features        = 'd dprogram',
        source          = ['main.d' + src_files],
        target          = 'example',
        importpaths     = '.',
        # I don't think theirs an equivalent yet.
        #defines        = ['WINDOWS=1'], # Equivalent?
        dflags          = '-fversion=Static -g -v',
        libpaths        = '',
        libs            = '',
        use             = 'libsubdir derelict',
        uselib          = 'TANGO WIN32 LINUX2',
    )

Reply via email to