*
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
|
||||
fibre_root = tup.getcwd()
|
||||
|
||||
-- Returns a table that contains the Fibre code files and the flags required to
|
||||
-- compile and link those files.
|
||||
--
|
||||
-- args: A dictionary containing the fibre options. Refer to the Compile Options
|
||||
-- in README.md for a list of available options. For example the option
|
||||
-- `FIBRE_ENABLE_SERVER` maps to the argument `args.enable_server`.
|
||||
-- In addition:
|
||||
-- args.pkgconf: Controls the use of the pkgconf or pkg-config utility that
|
||||
-- shall be used to locate build dependencies. Can be one of the following:
|
||||
-- - A string: Use the binary provided by the string. Fail if it doesn't
|
||||
-- exist.
|
||||
-- - true: Use "pkgconf" and fall back to "pkg-config" if "pkgconf"
|
||||
-- doesn't exist. Fail if both don't exist.
|
||||
-- - false: Don't use pkg-config. The user is responsible of determining
|
||||
-- the required compile and link flags.
|
||||
-- - nil: Try both "pkgconf" and "pkg-config". If both don't exist fall
|
||||
-- back to a hardcoded list of well-known settings.
|
||||
--
|
||||
-- Returns: A dictionary with the following items:
|
||||
-- code_files: A list of strings that name the C++ code files to be compiled.
|
||||
-- The names are relative to package.lua.
|
||||
-- include_dirs: A list of directories that must be added to the include path
|
||||
-- when compiling the code files. The paths are relative to
|
||||
-- package.lua.
|
||||
-- cflags: A list of flags that should be passed to the compiler/linker when
|
||||
-- compiling and linking the code files.
|
||||
-- ldflags: A list of linker flags that should be passed to the linker when
|
||||
-- linking the object files.
|
||||
function get_fibre_package(args)
|
||||
pkg = {
|
||||
root = fibre_root,
|
||||
code_files = {
|
||||
'fibre.cpp',
|
||||
'channel_discoverer.cpp',
|
||||
},
|
||||
include_dirs = {'include'},
|
||||
cflags = {},
|
||||
ldflags = {},
|
||||
}
|
||||
|
||||
-- Select a pkgconf function
|
||||
if args.pkgconf == true or args.pkgconf == nil then
|
||||
-- Autodetect pkgconf
|
||||
if test_pkgconf('pkgconf') then
|
||||
print("using pkgconf")
|
||||
pkgconf_file = 'pkgconf'
|
||||
pkgconf = real_pkgconf
|
||||
elseif test_pkgconf('pkg-config') then
|
||||
print("using pkg-config")
|
||||
pkgconf_file = 'pkg-config'
|
||||
pkgconf = real_pkgconf
|
||||
elseif args.pkgconf == nil then
|
||||
print("using hardcoded pkgconf")
|
||||
pkgconf = hardcoded_pkgconf
|
||||
else
|
||||
error("couldn't find pkgconf nor pkg-config")
|
||||
end
|
||||
|
||||
elseif args.pkgconf == false then
|
||||
print("not using pkgconf")
|
||||
pkgconf_file = nil
|
||||
pkgconf = null_pkgconf
|
||||
else
|
||||
print("using pkgconf: "..args.pkgconf)
|
||||
pkgconf_file = args.pkgconf
|
||||
pkgconf = real_pkgconf
|
||||
end
|
||||
|
||||
pkg.cflags += '-DFIBRE_ENABLE_SERVER='..(args.enable_server and '1' or '0')
|
||||
pkg.cflags += '-DFIBRE_ENABLE_CLIENT='..(args.enable_client and '1' or '0')
|
||||
pkg.cflags += '-DFIBRE_ENABLE_EVENT_LOOP='..(args.enable_event_loop and '1' or '0')
|
||||
pkg.cflags += '-DFIBRE_ALLOW_HEAP='..(args.allow_heap and '1' or '0')
|
||||
pkg.cflags += '-DFIBRE_MAX_LOG_VERBOSITY='..(args.max_log_verbosity or '5')
|
||||
pkg.cflags += '-DFIBRE_DEFAULT_LOG_VERBOSITY='..(args.default_log_verbosity or '2')
|
||||
pkg.cflags += '-DFIBRE_ENABLE_LIBUSB_BACKEND='..(args.enable_libusb_backend and '1' or '0')
|
||||
pkg.cflags += '-DFIBRE_ENABLE_TCP_SERVER_BACKEND='..(args.enable_tcp_server_backend and '1' or '0')
|
||||
pkg.cflags += '-DFIBRE_ENABLE_TCP_CLIENT_BACKEND='..(args.enable_tcp_client_backend and '1' or '0')
|
||||
|
||||
if args.enable_libusb_backend then
|
||||
pkg.code_files += 'platform_support/libusb_transport.cpp'
|
||||
pkgconf(pkg, "libusb-1.0")
|
||||
|
||||
-- TODO: only add pthread on linux and windows
|
||||
pkg.ldflags += '-lpthread'
|
||||
end
|
||||
if args.max_log_verbosity == nil or (args.max_log_verbosity > 0) then
|
||||
pkg.code_files += 'logging.cpp'
|
||||
end
|
||||
if args.enable_client then
|
||||
pkg.code_files += 'legacy_object_client.cpp'
|
||||
end
|
||||
if args.enable_client or args.enable_server then
|
||||
pkg.code_files += 'legacy_protocol.cpp'
|
||||
end
|
||||
if args.enable_event_loop then
|
||||
pkg.code_files += 'platform_support/epoll_event_loop.cpp'
|
||||
end
|
||||
if args.enable_tcp_client_backend or args.enable_tcp_server_backend then
|
||||
-- TODO: chose between windows and posix backend
|
||||
pkg.code_files += 'platform_support/posix_tcp_backend.cpp'
|
||||
pkg.code_files += 'platform_support/posix_socket.cpp'
|
||||
pkg.ldflags += '-lanl'
|
||||
end
|
||||
|
||||
return pkg
|
||||
end
|
||||
|
||||
-- Runs the specified shell command immediately (not as part of the dependency
|
||||
-- graph).
|
||||
-- Returns the values (return_code, stdout) where stdout has the trailing new
|
||||
-- line removed.
|
||||
function fibre_run_now(command)
|
||||
local handle
|
||||
handle = io.popen(command)
|
||||
local output = handle:read("*a")
|
||||
local rc = {handle:close()}
|
||||
return string.sub(output, 0, -2), rc[1]
|
||||
end
|
||||
|
||||
function test_pkgconf(name)
|
||||
local str, rc = fibre_run_now(name.." --version 2>&1 >/dev/null")
|
||||
return rc
|
||||
end
|
||||
|
||||
function real_pkgconf(pkg, lib)
|
||||
pkg.cflags += fibre_run_now(pkgconf_file..' '..lib..' --cflags')
|
||||
pkg.ldflags += fibre_run_now(pkgconf_file..' '..lib..' --libs')
|
||||
end
|
||||
|
||||
function null_pkgconf(pkg, lib)
|
||||
-- don't do anything
|
||||
end
|
||||
|
||||
function hardcoded_pkgconf(pkg, lib)
|
||||
libs = {
|
||||
['libusb-1.0'] = {cflags = {}, ldflags = {}},
|
||||
}
|
||||
tup.append_table(pkg.cflags, libs[lib].cflags)
|
||||
tup.append_table(pkg.ldflags, libs[lib].ldflags)
|
||||
end
|
||||
Reference in New Issue
Block a user