mirror of
https://github.com/odriverobotics/ODrive.git
synced 2026-02-07 07:51:49 +08:00
143 lines
5.4 KiB
Lua
143 lines
5.4 KiB
Lua
|
|
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 |