diff options
| author | ruki <[email protected]> | 2018-09-26 22:42:02 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2018-09-26 10:12:15 +0800 |
| commit | 7acd4ba8d245606b606ab14cd04af3bd94170e2f (patch) | |
| tree | 7275f3c140cf713bbe3c2f7ce9c366fed54650e8 | |
| parent | 4c3e74057614dffacd4047c0bd2c107fe5820cdd (diff) | |
improve find_package
| -rw-r--r-- | xmake/core/sandbox/modules/import/lib/detect/find_package.lua | 90 |
1 files changed, 61 insertions, 29 deletions
diff --git a/xmake/core/sandbox/modules/import/lib/detect/find_package.lua b/xmake/core/sandbox/modules/import/lib/detect/find_package.lua index 39b08a78a..81f608885 100644 --- a/xmake/core/sandbox/modules/import/lib/detect/find_package.lua +++ b/xmake/core/sandbox/modules/import/lib/detect/find_package.lua @@ -147,45 +147,66 @@ function sandbox_lib_detect_find_package._find_from_prefixdirs(name, opt) local prefixfile = find_file(name .. "-*.txt", prefixdirs, {suffixes = ".info"}) -- get the include and link directories + local links = {} local linkdirs = {} local includedirs = {} + local prefixinfo = {} if prefixfile then + + -- get prefix root directory local prefixdir = path.directory(path.directory(prefixfile)) - table.insert(linkdirs, path.join(prefixdir, "lib")) - table.insert(includedirs, path.join(prefixdir, "include")) - else - for _, prefixdir in ipairs(prefixdirs) do - table.insert(linkdirs, path.join(prefixdir, "lib")) - table.insert(includedirs, path.join(prefixdir, "include")) - end - end - -- get links and linkdirs - local links = {} - local prefixlist = (prefixfile and io.load(prefixfile) or {}).installed - if prefixlist then - local found = false - for _, line in ipairs(prefixlist) do - line = line:trim() - if line:endswith(".lib") or line:endswith(".a") then - found = true - for _, prefixdir in ipairs(prefixdirs) do - table.insert(linkdirs, path.join(prefixdir, path.directory(line))) - end - table.insert(links, target.linkname(path.filename(line))) - end + -- add given include and link directories + prefixinfo = io.load(prefixfile) or {} + for _, includedir in ipairs(table.wrap(prefixinfo.includedirs)) do + table.insert(includedirs, path.join(prefixdir, includedir)) + end + for _, linkdir in ipairs(table.wrap(prefixinfo.linkdirs)) do + table.insert(linkdirs, path.join(prefixdir, linkdir)) end - if not found then - for _, line in ipairs(prefixlist) do + if prefixinfo.links then + table.join2(links, prefixinfo.links) + end + if prefixinfo.installed and (not prefixinfo.linkdirs or not prefixinfo.links) then + local found = false + for _, line in ipairs(prefixinfo.installed) do line = line:trim() - if line:endswith(".so") or line:endswith(".dylib") then + if line:endswith(".lib") or line:endswith(".a") then found = true - for _, prefixdir in ipairs(prefixdirs) do - table.insert(linkdirs, path.join(prefixdir, path.directory(line))) + if not prefixinfo.linkdirs then + for _, prefixdir in ipairs(prefixdirs) do + table.insert(linkdirs, path.join(prefixdir, path.directory(line))) + end + end + if not prefixinfo.links then + table.insert(links, target.linkname(path.filename(line))) end - table.insert(links, target.linkname(path.filename(line))) end end + if not found then + for _, line in ipairs(prefixinfo.installed) do + line = line:trim() + if line:endswith(".so") or line:endswith(".dylib") then + if not prefixinfo.linkdirs then + for _, prefixdir in ipairs(prefixdirs) do + table.insert(linkdirs, path.join(prefixdir, path.directory(line))) + end + end + if not prefixinfo.links then + table.insert(links, target.linkname(path.filename(line))) + end + end + end + end + end + + -- add root include and link directories + table.insert(linkdirs, path.join(prefixdir, "lib")) + table.insert(includedirs, path.join(prefixdir, "include")) + else + for _, prefixdir in ipairs(prefixdirs) do + table.insert(linkdirs, path.join(prefixdir, "lib")) + table.insert(includedirs, path.join(prefixdir, "include")) end end @@ -207,9 +228,20 @@ function sandbox_lib_detect_find_package._find_from_prefixdirs(name, opt) result.linkdirs = table.join(result.linkdirs or {}, libinfo.linkdir) end end + + -- save results if result and result.links then + + -- make unique directories result.links = table.unique(result.links) - result.includedirs = includedirs + result.includedirs = table.unique(includedirs) + + -- inherit the other prefix variables + for name, values in pairs(prefixinfo) do + if name ~= "links" and name ~= "linkdirs" and name ~= "includedirs" and name ~= "installed" then + result[name] = values + end + end end -- save version |
