boltbuild 0.1.0

BoltBuild is a programmable build system.
Documentation
---@type Context
local context = ...
context:load_tool('internal/module_core')

BoltBison = {}

function BoltBison.find_bison()
    if not context.env.BISON then
        context:try('Looking for bison', function()
            local bison = context:find_program('bison')
            context.env.BISON = bison
            if bison then
                context.env.BISONFLAGS = { '-d' }
                return bison
            else
                error('bison not found')
            end
        end)
    end
end

context:command_driver('bison',
        'magenta',
        '${BISON} ${BISONFLAGS} ${SRC[0]} -o ${TGT[0]}',
        { 'c', 'cxx' })

BoltModule.register_extension('y,yy', function(generator, node, path)
    local out_node, directory = generator:make_build_node(node, path, 'src')
    local header
    if node:extension() == 'yy' then
        out_node = out_node:change_ext('cc')
        header = out_node:change_ext('hh')
    else
        out_node = out_node:change_ext('c')
        header = out_node:change_ext('h')
    end
    generator:declare_task('bison', { node }, { out_node, header })
    table.insert(generator.source, { directory, out_node })
end)