File: pkgconfig.lua

package info (click to toggle)
0ad 0.27.0-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 171,928 kB
  • sloc: cpp: 194,011; javascript: 19,098; ansic: 15,066; python: 6,328; sh: 1,695; perl: 1,575; java: 533; xml: 415; php: 192; makefile: 99
file content (116 lines) | stat: -rw-r--r-- 3,552 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
local m = {}
m._VERSION = "1.2.0-dev"

m.additional_pc_path = nil
m.static_link_libs = false

local function os_capture(cmd)
	return io.popen(cmd, 'r'):read('*a'):gsub("\n", " ")
end

local function parse_pkg_config_includes(lib, alternative_cmd, alternative_flags)
	local result
	if not alternative_cmd then
		local pc_path = m.additional_pc_path and "PKG_CONFIG_PATH="..m.additional_pc_path or ""
		result = os_capture(pc_path.." pkg-config --cflags "..lib)
	else
		if not alternative_flags then
			result = os_capture(alternative_cmd.." --cflags")
		else
			result = os_capture(alternative_cmd.." "..alternative_flags)
		end
	end

	-- Small trick: delete the space after -include so that we can detect
	-- which files have to be force-included without difficulty.
	result = result:gsub("%-include +(%g+)", "-include%1")
	result = result:gsub("%-isystem +(%g+)", "-isystem%1")

	local dirs = {}
	local files = {}
	local options = {}
	for w in string.gmatch(result, "[^' ']+") do
		if string.sub(w,1,2) == "-I" then
			table.insert(dirs, string.sub(w,3))
		elseif string.sub(w,1,8) == "-isystem" then
			table.insert(dirs, string.sub(w,9))
		elseif string.sub(w,1,8) == "-include" then
			table.insert(files, string.sub(w,9))
		else
			table.insert(options, w)
		end
	end

	return dirs, files, options
end

function m.add_includes(lib, alternative_cmd, alternative_flags)
	local dirs, files, options = parse_pkg_config_includes(lib, alternative_cmd, alternative_flags)

	-- As of premake5-beta2, `sysincludedirs` has been deprecated in favour of
	-- `externalincludedirs`, and continuing to use it causes warnings to be emitted.
	-- We use `externalincludedirs` when available to prevent the warnings, falling back
	-- to `sysincludedirs` when not to prevent breakage of the `--with-system-premake5`
	-- build argument.
	if externalincludedirs then
		externalincludedirs(dirs)
	else
		sysincludedirs(dirs)
	end

	forceincludes(files)
	buildoptions(options)
end

function m.add_includes_after(lib, alternative_cmd, alternative_flags)
	-- Support for includedirsafter was added after the 5.0.0-beta2 release.
	-- Fall back if unavailable to support `--with-system-premake5`
	if includedirsafter then
		local dirs, files, options = parse_pkg_config_includes(lib, alternative_cmd, alternative_flags)

		includedirsafter(dirs)
		forceincludes(files)
		buildoptions(options)
	else
		m.add_includes(lib, alternative_cmd, alternative_flags)
	end
end

function m.add_links(lib, alternative_cmd, alternative_flags)
	local result
	if not alternative_cmd then
		local pc_path = m.additional_pc_path and "PKG_CONFIG_PATH="..m.additional_pc_path or ""
		local static = m.static_link_libs and " --static " or ""
		result = os_capture(pc_path.." pkg-config --libs "..static..lib)
	else
		if not alternative_flags then
			result = os_capture(alternative_cmd.." --libs")
		else
			result = os_capture(alternative_cmd.." "..alternative_flags)
		end
	end

	-- On OSX, wx-config outputs "-framework foo" instead of "-Wl,-framework,foo"
	-- which doesn't fare well with the splitting into libs, libdirs and options
	-- we perform afterwards.
	result = result:gsub("%-framework +(%g+)", "-Wl,-framework,%1")

	local libs = {}
	local dirs = {}
	local options = {}
	for w in string.gmatch(result, "[^' ']+") do
		if string.sub(w,1,2) == "-l" then
			table.insert(libs, string.sub(w,3))
		elseif string.sub(w,1,2) == "-L" then
			table.insert(dirs, string.sub(w,3))
		else
			table.insert(options, w)
		end
	end

	links(libs)
	libdirs(dirs)
	linkoptions(options)
end

return m