+ --enable-clock_gettime use clock_gettime() for timing
+ --enable-threads use threads for concurrency
+ --enable-hotloading watch assets for automatic reloading
+
+ --with-gtk use the gtk2 toolkit (overrides --with-qt4)
+ --with-qt4 use the qt4 gui toolkit
+]])
+end
+
+
+--
+-- Setup a temporary file to collect error messages.
+--
+
+error_log = "config.log"
+os.remove(error_log)
+
+
+--
+-- Define some useful functions.
+--
+
+-- Return true if a file exists, false otherwise.
+function file_exists(file)
+ return os.execute("test -f "..file) == 0
+end
+
+-- Print an error message and exit with an error.
+function die(...)
+ for _,value in ipairs(arg) do
+ print("fatal: "..tostring(value))
+ end
+ if file_exists(error_log) then
+ print()
+ print("Look through the file `config.log' for more information:\n")
+ os.execute("tail "..error_log)
+ end
+ os.exit(1)
+end
+
+-- Execute a command and return its output or nil if the command failed to
+-- run.
+function backtick_run(command)
+ local fd = io.popen(command.." 2>>"..error_log)
+ if fd then
+ local stdout = fd:read("*l")
+ fd:close()
+ return stdout
+ end
+ return nil
+end
+
+-- Try to execute a command and return true if the command finished
+-- successfully (with an exit code of zero).
+function try_run(command)
+ return os.execute(command.." >/dev/null 2>>"..error_log) == 0
+end
+
+-- Remove the whitespace surrounding a string.
+function trim(str)
+ str = str:gsub("^%s+", "")
+ return str:gsub("%s+$", "")
+end
+
+-- Trim the string and convert all sequences of whitespace to a single
+-- space.
+function reduce_whitespace(str)
+ str = str:gsub("%s+", " ")
+ return trim(str)
+end
+
+-- Get the CFLAGS from pkg-config for the passed libraries.
+function pkg_config_cflags(libs)
+ local env = "PKG_CONFIG_PATH="..libdir.."/pkgconfig:$PKG_CONFIG_PATH"
+ local cmd = env.." pkg-config"
+ return backtick_run(cmd.." --cflags "..libs)
+end
+
+-- Get the LDFLAGS from pkg-config for the passed libraries.
+function pkg_config_ldflags(libs)
+ local env = "PKG_CONFIG_PATH="..libdir.."/pkgconfig:$PKG_CONFIG_PATH"
+ local cmd = env.." pkg-config"
+ return (" "..backtick_run(cmd.." --libs "..libs)):gsub("%s%-l%S*", "")
+end
+
+-- Get the LIBS flags from pkg-config for the passed libraries.
+function pkg_config_libs(libs)
+ local env = "PKG_CONFIG_PATH="..libdir.."/pkgconfig:$PKG_CONFIG_PATH"
+ local cmd = env.." pkg-config"
+ return backtick_run(cmd.." --libs-only-l "..libs)
+end
+
+-- Add a flag to the CFLAGS and CXXFLAGS variables.
+function add_cflag(flag)
+ if CFLAGS == "" then
+ CFLAGS = flag
+ else
+ CFLAGS = string.format("%s %s", CFLAGS, flag)
+ end
+ if CXXFLAGS == "" then
+ CXXFLAGS = flag
+ else
+ CXXFLAGS = string.format("%s %s", CXXFLAGS, flag)
+ end
+end
+
+-- Replace a flag in the CFLAGS and CXXFLAGS variables.
+function set_cflag(flag)
+ local cflag_set, cxxflag_set = false, false
+ CFLAGS = CFLAGS:gsub("%"..flag:sub(1, 2).."%S+", function()
+ cflag_set = true
+ return flag
+ end)
+ CXXFLAGS = CXXFLAGS:gsub("%"..flag:sub(1, 2).."%S+", function()
+ cxxflag_set = true
+ return flag
+ end)
+ if not cflag_set or not cxxflag_set then add_cflag(flag) end
+end
+
+-- Look for a command from a list that can complete successfully (with exit
+-- code zero) given some arguments. Returns nil if none were successful.
+function find_command(commands, args)
+ if not args then args = "" end
+ for _,command in ipairs(commands) do
+ if try_run(command.." "..args) then return command end
+ end
+ return nil
+end
+
+
+--
+-- Perform a quick sanity check.
+--
+
+if not file_exists("configure") or not file_exists("Makefile") then
+ -- This script doesn't support out-of-tree builds.
+ die("You must `cd' to the project root where the Makefile is.")
+end
+
+
+--
+-- Parse the command-line options.
+--
+
+-- This script supports many of the options provided by autoconf-generated
+-- scripts. In particular, all the directory-related options are
+-- supported, including --prefix, --exec-prefix, and all the --dirDIR
+-- options for configuring installation paths. If passed, the option
+-- parsing routine below will place these options in the global namespace
+-- (i.e. prefix, eprefix, bindir, datadir, etc).
+--
+-- Feature and package options are also supported. The value of any option
+-- of the form --enable-OPT= and --with-OPT= can be obtained with the
+-- functions get_feature and get_package, respectively. Like
+-- autoconf-generated scripts, passing --disable-OPT or --without-OPT is
+-- equivalent to passing --enable-OPT=no and --without-OPT=no,
+-- respectively. Values that are either yes or no are interpreted as
+-- booleans. Any other values are interpreted as strings.
+--
+-- Definitions of the form KEY=VALUE are also supported. If passed, the
+-- option parsing routine below will place these options in the global
+-- namespace.
+--
+-- Finally, the options -h, --help, and --host are also supported, the
+-- former two calling the show_help function and the latter setting the
+-- host global variable.