commit: 051963c7fee2c453d086c6792282f4c299bdf68c
parent 35ec1d214359c035a45c4c51c1072f819f421894
Author: Michael Forney <mforney@mforney.org>
Date: Wed, 29 Jan 2020 13:56:48 -0800
Add support for building multiple configurations
Now, you can build in separate directories per configuration:
mkdir foo
(cd foo && ../setup.lua)
samu -C foo
Diffstat:
29 files changed, 86 insertions(+), 72 deletions(-)
diff --git a/config.def.lua b/config.def.lua
@@ -1,4 +1,4 @@
-local sets = dofile 'sets.lua'
+local sets = dofile(basedir..'/sets.lua')
return {
-- build output directory
diff --git a/gen.lua b/gen.lua
@@ -1,7 +1,8 @@
set('ninja_required_version', '1.8')
-set('basedir', '.')
+set('basedir', basedir)
set('builddir', config.builddir)
+set('dir', '$basedir')
set('outdir', '$builddir')
set('target_toolchain', config.target.toolchain)
@@ -17,7 +18,7 @@ set('repo_flags', config.repo.flags)
set('repo_tag', config.repo.tag)
set('repo_branch', config.repo.branch)
-include 'rules.ninja'
+include '$basedir/rules.ninja'
toolchain 'target'
diff --git a/ninja.lua b/ninja.lua
@@ -140,7 +140,7 @@ end
function iterlines(file, raw)
table.insert(pkg.inputs.gen, '$dir/'..file)
- file = string.format('%s/%s', pkg.dir, file)
+ file = string.format('%s/%s/%s', basedir, pkg.dir, file)
if raw then
return io.lines(file)
end
@@ -153,7 +153,7 @@ end
function load(file)
table.insert(pkg.inputs.gen, '$dir/'..file)
- return dofile(string.format('%s/%s', pkg.dir, file))
+ return dofile(string.format('%s/%s/%s', basedir, pkg.dir, file))
end
--
@@ -169,7 +169,7 @@ end
function subninja(file)
if not file:hasprefix('$') then
- file = '$dir/'..file
+ file = '$gendir/'..file
end
io.write(string.format('subninja %s\n', file))
end
@@ -231,11 +231,11 @@ end
function toolchain(name)
set('cflags', '$'..name..'_cflags')
set('ldflags', '$'..name..'_ldflags')
- include('toolchain/$'..name..'_toolchain.ninja')
+ include('$basedir/toolchain/$'..name..'_toolchain.ninja')
end
function phony(name, inputs)
- build('phony', '$dir/'..name, inputs)
+ build('phony', '$gendir/'..name, inputs)
end
function cflags(flags)
@@ -253,7 +253,7 @@ function compile(rule, src, deps, args)
obj = '$outdir/'..obj
end
if not deps and pkg.deps then
- deps = '$dir/deps'
+ deps = '$gendir/deps'
end
if deps then
src = {src, '||', deps}
@@ -314,7 +314,7 @@ function link(out, files, args)
end
if next(deps) then
local rsp = out..'.rsp'
- build('awk', rsp, {deps, '|', 'scripts/rsp.awk'}, {expr='-f scripts/rsp.awk'})
+ build('awk', rsp, {deps, '|', '$basedir/scripts/rsp.awk'}, {expr='-f $basedir/scripts/rsp.awk'})
objs = {objs, '|', rsp}
args.ldlibs = '@'..rsp
end
@@ -379,9 +379,12 @@ function fetch(method)
if method == 'local' then
script = '$dir/fetch.sh'
else
- script = 'scripts/fetch-'..method..'.sh'
+ script = '$basedir/scripts/fetch-'..method..'.sh'
end
build('fetch'..method, '$dir/fetch', {'|', '$dir/ver', script})
+ if basedir ~= '.' then
+ build('phony', '$gendir/fetch', '$dir/fetch')
+ end
if next(pkg.inputs.fetch) then
build('phony', table.keys(pkg.inputs.fetch), '$dir/fetch')
end
@@ -424,7 +427,7 @@ function file(path, mode, src)
local out = '$builddir/root.hash/'..path
mode = tonumber(mode, 8)
local perm = string.format('10%04o %s', mode, path)
- build('githash', out, {src, '|', 'scripts/hash.sh', '||', '$builddir/root.stamp'}, {
+ build('githash', out, {src, '|', '$basedir/scripts/hash.sh', '||', '$builddir/root.stamp'}, {
args=perm,
})
table.insert(pkg.inputs.index, out)
@@ -446,7 +449,7 @@ function sym(path, target)
return
end
local out = '$builddir/root.hash/'..path
- build('githash', out, {'|', 'scripts/hash.sh', '||', '$builddir/root.stamp'}, {
+ build('githash', out, {'|', '$basedir/scripts/hash.sh', '||', '$builddir/root.stamp'}, {
args=string.format('120000 %s %s', path, target),
})
table.insert(pkg.inputs.index, out)
diff --git a/pkg/acme-client/gen.lua b/pkg/acme-client/gen.lua
@@ -1,10 +1,10 @@
-set('srcdir', 'pkg/openbsd/src/usr.sbin/acme-client')
+set('srcdir', '$basedir/pkg/openbsd/src/usr.sbin/acme-client')
cflags{
'-D _GNU_SOURCE', -- for memmem
- '-I pkg/openbsd/include',
+ '-I $basedir/pkg/openbsd/include',
'-I $builddir/pkg/libressl/include',
'-I $srcdir',
- '-idirafter pkg/openbsd/src/sys',
+ '-idirafter $basedir/pkg/openbsd/src/sys',
}
pkg.deps = {
diff --git a/pkg/curl/gen.lua b/pkg/curl/gen.lua
@@ -33,7 +33,7 @@ pkg.hdrs = copy('$outdir/include/curl', '$srcdir/include/curl', {
})
pkg.deps = {
'$outdir/curl_config.h',
- '$dir/headers',
+ '$gendir/headers',
'pkg/bearssl/headers',
'pkg/zlib/headers',
}
@@ -81,7 +81,7 @@ lib('libcurl.a', [[
]])
build('cc', '$outdir/tool_hugehelp.c.o', {
- '$dir/tool_hugehelp.c', '||', '$dir/deps', '$srcdir/src/tool_hugehelp.h',
+ '$dir/tool_hugehelp.c', '||', '$gendir/deps', '$srcdir/src/tool_hugehelp.h',
})
-- src/src/Makefile.inc:/^CURL_CFILES
diff --git a/pkg/e2fsprogs/gen.lua b/pkg/e2fsprogs/gen.lua
@@ -71,7 +71,7 @@ pkg.hdrs = {
}
pkg.deps = {
'$outdir/config.h',
- '$dir/headers',
+ '$gendir/headers',
'$outdir/internal/blkid/blkid_types.h',
'$outdir/internal/support/prof_err.h',
'$outdir/internal/crc32c_table.h',
diff --git a/pkg/elftoolchain/gen.lua b/pkg/elftoolchain/gen.lua
@@ -3,7 +3,7 @@ cflags{
'-I $dir',
'-I $srcdir/common',
'-I $srcdir/libelf',
- '-idirafter pkg/openbsd/src/sys',
+ '-idirafter $basedir/pkg/openbsd/src/sys',
}
pkg.hdrs = {
diff --git a/pkg/ffmpeg/gen.lua b/pkg/ffmpeg/gen.lua
@@ -30,7 +30,7 @@ pkg.hdrs = {
}
pkg.deps = {
'$outdir/config.asm',
- '$dir/headers',
+ '$gendir/headers',
'pkg/alsa-lib/headers',
'pkg/libtls-bearssl/headers',
'pkg/zlib/headers',
@@ -177,7 +177,7 @@ lib('libavfilter.a', {
'libavutil.a',
})
-cc('libavformat/protocols.c', {'$dir/deps', '$outdir/internal/libavformat/protocol_list.c'})
+cc('libavformat/protocols.c', {'$gendir/deps', '$outdir/internal/libavformat/protocol_list.c'})
lib('libavformat.a', {
expand{'libavformat/', {
'allformats.c',
@@ -352,7 +352,7 @@ local libs = {
'libswscale.a.d',
}
-cc('fftools/cmdutils.c', {'$dir/deps'})
+cc('fftools/cmdutils.c', {'$gendir/deps'})
exe('ffprobe', {paths[[fftools/(ffprobe.c cmdutils.c.o)]], libs})
file('bin/ffprobe', '755', '$outdir/ffprobe')
diff --git a/pkg/file/gen.lua b/pkg/file/gen.lua
@@ -23,7 +23,7 @@ build('sed', '$outdir/file.1', '$srcdir/doc/file.man', {
})
pkg.hdrs = {'$outdir/include/magic.h'}
-pkg.deps = {'$dir/headers', 'pkg/zlib/headers'}
+pkg.deps = {'$gendir/headers', 'pkg/zlib/headers'}
lib('libmagic.a', [[src/(
buffer.c magic.c apprentice.c softmagic.c ascmagic.c
diff --git a/pkg/fribidi/gen.lua b/pkg/fribidi/gen.lua
@@ -24,7 +24,7 @@ sub('tools.ninja', function()
exe('gen-'..t..'-tab', expand{'gen.tab/', {
'gen-'..t..'-tab.c',
'packtab.c.o',
- }}, {'$dir/headers'})
+ }}, {'$gendir/headers'})
end
end)
@@ -79,7 +79,7 @@ pkg.deps = {
'$outdir/mirroring.tab.i',
'$outdir/brackets.tab.i',
'$outdir/brackets-type.tab.i',
- '$dir/headers',
+ '$gendir/headers',
}
lib('libfribidi.a', [[
diff --git a/pkg/libcbor/gen.lua b/pkg/libcbor/gen.lua
@@ -36,7 +36,7 @@ pkg.hdrs = {
}),
'$outdir/include/cbor/configuration.h',
}
-pkg.deps = {'$dir/headers'}
+pkg.deps = {'$gendir/headers'}
lib('libcbor.a', [[
src/cbor.c
diff --git a/pkg/libevent/gen.lua b/pkg/libevent/gen.lua
@@ -2,7 +2,7 @@ cflags{
'-I $dir',
'-I $outdir/include',
'-I $srcdir/include',
- '-idirafter pkg/openbsd/src/sys',
+ '-idirafter $basedir/pkg/openbsd/src/sys',
}
build('sed', '$outdir/include/event2/event-config.h', {'$dir/config.h', '|', '$srcdir/make-event-config.sed'}, {
@@ -13,7 +13,7 @@ pkg.hdrs = {
'$outdir/include/event2/event-config.h',
}
pkg.deps = {
- '$dir/headers',
+ '$gendir/headers',
'pkg/openbsd/fetch',
}
diff --git a/pkg/libffi/gen.lua b/pkg/libffi/gen.lua
@@ -23,7 +23,7 @@ pkg.hdrs = {
lib('libffi.a', [[src/(
prep_cif.c types.c raw_api.c java_raw_api.c closures.c
x86/(ffi64.c unix64.S ffiw64.c win64.S)
-)]], {'$dir/headers'})
+)]], {'$gendir/headers'})
file('lib/libffi.a', '644', '$outdir/libffi.a')
fetch 'git'
diff --git a/pkg/libfido2/gen.lua b/pkg/libfido2/gen.lua
@@ -6,7 +6,7 @@ cflags{
'-I $builddir/pkg/libcbor/include',
'-I $builddir/pkg/libressl/include',
'-I $srcdir/src',
- '-I pkg/openbsd/include',
+ '-I $basedir/pkg/openbsd/include',
}
pkg.hdrs = copy('$outdir/include', '$srcdir/src', {
diff --git a/pkg/libjpeg-turbo/gen.lua b/pkg/libjpeg-turbo/gen.lua
@@ -9,7 +9,7 @@ build('cat', '$outdir/jconfigint.h', {
})
pkg.deps = {
- '$dir/headers',
+ '$gendir/headers',
'$outdir/jconfigint.h',
}
diff --git a/pkg/libnl/gen.lua b/pkg/libnl/gen.lua
@@ -53,8 +53,8 @@ lib('libnl-3.a', [[lib/(
addr.c attr.c cache.c cache_mngr.c cache_mngt.c data.c
error.c handlers.c msg.c nl.c object.c socket.c utils.c
version.c hash.c hashtable.c mpls.c
-)]], {'$dir/headers'})
+)]], {'$gendir/headers'})
-lib('libnl-genl-3.a', 'lib/genl/(ctrl.c family.c genl.c mngt.c)', {'$dir/headers'})
+lib('libnl-genl-3.a', 'lib/genl/(ctrl.c family.c genl.c mngt.c)', {'$gendir/headers'})
fetch 'git'
diff --git a/pkg/mupdf/gen.lua b/pkg/mupdf/gen.lua
@@ -71,7 +71,7 @@ exe('bin/mutool', [[
file('bin/mutool', '755', '$outdir/bin/mutool')
cc('platform/x11/wl_main.c', {
- '$dir/deps',
+ '$gendir/deps',
'pkg/libxkbcommon/fetch',
'pkg/pixman/headers',
'pkg/wayland/headers',
diff --git a/pkg/ncurses/gen.lua b/pkg/ncurses/gen.lua
@@ -12,8 +12,8 @@ cflags{'$common_cflags'}
sub('tools.ninja', function()
toolchain 'host'
cflags{'$common_cflags', '-D USE_BUILD_CC'}
- exe('make_keys', {'ncurses/tinfo/make_keys.c'}, {'$dir/headers', '$outdir/names.c'})
- exe('make_hash', {'ncurses/tinfo/make_hash.c'}, {'$dir/headers', '$outdir/hashsize.h'})
+ exe('make_keys', {'ncurses/tinfo/make_keys.c'}, {'$gendir/headers', '$outdir/names.c'})
+ exe('make_hash', {'ncurses/tinfo/make_hash.c'}, {'$gendir/headers', '$outdir/hashsize.h'})
end)
build('sed', '$outdir/curses.head', {'$srcdir/include/curses.h.in', '|', '$dir/subst.sed'}, {
@@ -93,7 +93,7 @@ pkg.hdrs = {
install=true,
}
pkg.deps = {
- '$dir/headers',
+ '$gendir/headers',
'$outdir/hashsize.h',
'$outdir/init_keytry.h',
'$outdir/ncurses_def.h',
diff --git a/pkg/netsurf/gen.lua b/pkg/netsurf/gen.lua
@@ -52,7 +52,7 @@ cflags{
pkg.deps = {
'$dir/libcss/fetch',
'$dir/libdom/fetch',
- '$dir/libdom/headers',
+ '$gendir/libdom/headers',
'$dir/libhubbub/fetch',
'$dir/libnsbmp/fetch',
'$dir/libnsgif/fetch',
diff --git a/pkg/nginx/gen.lua b/pkg/nginx/gen.lua
@@ -50,7 +50,7 @@ end
build('awk', '$outdir/ngx_modules.c', {'$dir/modules.txt', '|', '$dir/modules.awk', '$dir/sources.txt'}, {
expr='-f $dir/modules.awk -v sources=$dir/sources.txt'
})
-cc('$outdir/ngx_modules.c', {'$dir/deps', '$dir/fetch'})
+cc('$outdir/ngx_modules.c', {'$gendir/deps', '$dir/fetch'})
local sources = paths[[src/(
core/(
diff --git a/pkg/openntpd/gen.lua b/pkg/openntpd/gen.lua
@@ -3,7 +3,7 @@ cflags{
'-include $dir/config.h',
'-I $srcdir/src',
'-I $srcdir/include',
- '-I pkg/openbsd/include',
+ '-I $basedir/pkg/openbsd/include',
'-I $builddir/pkg/libtls-bearssl/include',
}
diff --git a/pkg/openssh/gen.lua b/pkg/openssh/gen.lua
@@ -9,7 +9,7 @@ cflags{
archflags[config.target.toolchain:match('[^-]*')] or '-D SANDBOX_RLIMIT=1',
'-I $dir',
'-I $srcdir',
- '-I pkg/openbsd/include',
+ '-I $basedir/pkg/openbsd/include',
'-I $builddir/pkg/libfido2/include',
'-I $builddir/pkg/libressl/include',
'-I $builddir/pkg/zlib/include',
diff --git a/pkg/pcre/gen.lua b/pkg/pcre/gen.lua
@@ -38,6 +38,6 @@ lib('libpcre.a', {
'pcre_version.c',
'pcre_xclass.c',
'$outdir/pcre_chartables.c',
-}, {'$dir/headers'})
+}, {'$gendir/headers'})
fetch 'curl'
diff --git a/pkg/pixman/gen.lua b/pkg/pixman/gen.lua
@@ -23,7 +23,7 @@ pkg.hdrs = {
'$outdir/include/pixman-version.h',
}
pkg.deps = {
- '$dir/headers',
+ '$gendir/headers',
'$outdir/config.h',
}
diff --git a/pkg/transmission/gen.lua b/pkg/transmission/gen.lua
@@ -6,7 +6,7 @@ sub('libminiupnp.ninja', function()
cflags{
'-D _GNU_SOURCE',
'-I $outdir/miniupnp',
- '-idirafter pkg/openbsd/src/sys',
+ '-idirafter $basedir/pkg/openbsd/src/sys',
}
build('sed', '$outdir/miniupnp/miniupnpcstrings.h', '$srcdir/third-party/miniupnp/miniupnpcstrings.h.in', {
@@ -43,7 +43,7 @@ cflags{
'-I $srcdir/third-party/libnatpmp',
'-I $basedir/pkg/libevent/src/include',
'-I $basedir/pkg/libutp/src',
- '-idirafter pkg/openbsd/src/sys',
+ '-idirafter $basedir/pkg/openbsd/src/sys',
'-include config.h',
}
diff --git a/pkg/wayland/gen.lua b/pkg/wayland/gen.lua
@@ -36,7 +36,7 @@ pkg.hdrs = {
'$outdir/include/wayland-version.h',
}
pkg.deps = {
- '$dir/headers',
+ '$gendir/headers',
'$outdir/include/wayland-version.h',
'pkg/libffi/headers',
}
diff --git a/probe/gen.lua b/probe/gen.lua
@@ -1,5 +1,5 @@
local function probe(var)
- build('probe', '$outdir/'..var, {'$dir/'..var, '|', 'scripts/probe.sh'}, {var=var})
+ build('probe', '$outdir/'..var, {'$dir/'..var, '|', '$basedir/scripts/probe.sh'}, {var=var})
end
probe('HAVE_IMMINTRIN_H')
@@ -10,7 +10,7 @@ probe('HAVE___BUILTIN_CTZL')
probe('HAVE___BUILTIN_POPCOUNT')
local function probesize(var)
- build('probesize', '$outdir/'..var, {'$dir/'..var, '|', 'scripts/probe-size.sh'}, {var=var})
+ build('probesize', '$outdir/'..var, {'$dir/'..var, '|', '$basedir/scripts/probe-size.sh'}, {var=var})
end
probesize('SIZEOF_LONG')
diff --git a/rules.ninja b/rules.ninja
@@ -1,5 +1,5 @@
rule gen
- command = lua5.2 setup.lua $dir
+ command = lua5.2 $basedir/setup.lua $gendir
generator = 1
# toolchain
@@ -52,10 +52,10 @@ rule muse
command = muse $museflags -o $out $in
rule probe
- command = sh ./scripts/probe.sh $var $cc $cflags $ldflags -o /dev/null -x c $in >$out
+ command = sh $basedir/scripts/probe.sh $var $cc $cflags $ldflags -o /dev/null -x c $in >$out
rule probesize
- command = sh ./scripts/probe-size.sh $var $cc $cflags -c -o /dev/null -x c $in >$out
+ command = sh $basedir/scripts/probe-size.sh $var $cc $cflags -c -o /dev/null -x c $in >$out
# misc tools
rule touch
@@ -102,16 +102,16 @@ rule waylandproto
command = wayland-scanner $type <$in >$out
rule githash
- command = sh ./scripts/hash.sh $repo $args $in >$out
+ command = sh $basedir/scripts/hash.sh $repo $args $in >$out
description = HASH $args
rule gittree
- command = sh ./scripts/tree.sh $repo $repo_tag $in $out
+ command = sh $basedir/scripts/tree.sh $repo $repo_tag $in $out
description = TREE $out
restat = 1
rule gitcommit
- command = sh ./scripts/commit.sh $repo $repo_branch $repo_tag $out
+ command = sh $basedir/scripts/commit.sh $repo $repo_branch $repo_tag $out
rule gitarchive
command = git -C $repo archive -o $$PWD/$out $repo_tag
@@ -120,22 +120,22 @@ rule gitinit
command = git init $repo_flags $repo && touch $out
rule fetchcurl
- command = sh ./scripts/fetch-curl.sh $dir && touch $out
- description = FETCH $dir
+ command = cd $basedir && sh $basedir/scripts/fetch-curl.sh $gendir && touch $out
+ description = FETCH $gendir
restat = 1
generator = 1
pool = console
rule fetchgit
- command = sh ./scripts/fetch-git.sh $dir && touch $out
- description = FETCH $dir
+ command = cd $basedir && sh $basedir/scripts/fetch-git.sh $gendir && touch $out
+ description = FETCH $gendir
restat = 1
generator = 1
pool = console
rule fetchlocal
- command = sh ./$dir/fetch.sh $dir && touch $out
- description = FETCH $dir
+ command = cd $basedir && sh $gendir/fetch.sh $gendir && touch $out
+ description = FETCH $gendir
restat = 1
generator = 1
pool = console
diff --git a/setup.lua b/setup.lua
@@ -1,18 +1,20 @@
#!/bin/lua
+basedir = arg[0]:match('(.*)/') or '.'
+
if not os.execute('test -f config.lua') then
- os.execute('cp config.def.lua config.lua')
+ os.execute('cp '..basedir..'/config.def.lua config.lua')
end
-dofile 'ninja.lua'
+dofile(basedir..'/ninja.lua')
config = dofile 'config.lua'
local recurse = not arg[1]
function subgen(dir)
- local file = '$dir/'..dir..'/local.ninja'
+ local file = '$gendir/'..dir..'/local.ninja'
subninja(file)
- table.insert(pkg.inputs.ninja, '$dir/'..dir..'/ninja')
+ table.insert(pkg.inputs.ninja, '$gendir/'..dir..'/ninja')
table.insert(pkg.inputs.index, '$outdir/'..dir..'/root.index')
table.insert(pkg.inputs.perms, '$outdir/'..dir..'/root.perms')
local cmd = string.format('test -f %s/%s/local.ninja', pkg.dir, dir)
@@ -35,29 +37,33 @@ function gen(dir)
perms={},
index={},
gen={
- 'setup.lua',
- 'ninja.lua',
+ '$basedir/ninja.lua',
+ '$basedir/sets.lua',
+ '$basedir/setup.lua',
'config.lua',
- 'sets.lua',
},
- ninja={'$dir/local.ninja'},
+ ninja={'$gendir/local.ninja'},
fetch={},
},
perms={},
}
+ if not os.execute('mkdir -p '..dir) then
+ error('failed to create '..dir)
+ end
local outdir = config.builddir..'/'..dir
if not os.execute('mkdir -p '..outdir) then
error('failed to create '..outdir)
end
io.output(dir..'/local.ninja.tmp')
- set('dir', dir)
+ set('gendir', dir)
if dir ~= '.' then
- set('outdir', '$builddir/$dir')
+ set('dir', '$basedir/$gendir')
+ set('outdir', '$builddir/$gendir')
set('srcdir', '$dir/src')
end
load('gen.lua')
- build('gen', '$dir/local.ninja', {'|', pkg.inputs.gen})
+ build('gen', '$gendir/local.ninja', {'|', pkg.inputs.gen})
phony('ninja', pkg.inputs.ninja)
if pkg.hdrs then
@@ -97,8 +103,12 @@ function gen(dir)
else
build('empty', '$outdir/root.index')
end
+ build('phony', '$dir/root', pkg.inputs.root)
io.close()
os.rename(dir..'/local.ninja.tmp', dir..'/local.ninja')
+ if dir == '.' then
+ os.execute('ln -sf local.ninja build.ninja')
+ end
end
gen(arg[1] or '.')