package An official xmake package repository https://xrepo.xmake.io/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

90 lines
3.0 KiB

import("lib.detect.find_path")
import("lib.detect.find_library")
import("lib.detect.find_program")
import("lib.detect.find_programver")
function _find_binary(package, opt)
local result = package:find_tool("python3", opt)
if not result then
result = package:find_tool("python", opt)
end
if result then
-- check if pip, setuptools and wheel are installed
local ok = try { function()
os.vrunv(result.program, { "-c", "import pip" })
os.vrunv(result.program, { "-c", "import setuptools" })
os.vrunv(result.program, { "-c", "import wheel" })
return true
end }
if not ok then
return false
end
end
end
function _find_library(package, opt)
-- init search options
opt = opt or {}
opt.paths = opt.paths or {}
table.insert(opt.paths, "$(env PATH)")
table.insert(opt.paths, "$(env CONDA_PREFIX)")
-- find python
local program = find_program("python3", opt)
if not program then
program = find_program("python", opt)
end
local version = nil
if program then
opt.command = function()
local outs, errs = os.iorunv(program, { "--version" })
return ((outs or "") .. (errs or "")):trim()
end
version = find_programver(program, opt)
end
if not program or not version then
return false
end
-- find library and header
local exepath = path.directory(program)
local link = nil
local libpath = nil
local includepath = nil
if package:is_plat("windows") then
link = format("python" .. table.concat(table.slice(version:split("%."), 1, 2), ""))
local out = try { function () return os.iorunv(program, { "-c", "import sys; print(sys.base_prefix, end='')" }) end }
libpath = find_library(link, { exepath, out }, { suffixes = { "libs" } })
linkdirs = {}
includepath = find_path("Python.h", { exepath, out }, { suffixes = { "include" } })
else
local pyver = table.concat(table.slice(version:split("%."), 1, 2), ".")
link = format("python" .. pyver)
local out = try { function () return os.iorunv(program, { "-c", "import sys; print(sys.base_prefix, end='')" }) end }
libpath = find_library(link, { path.directory(exepath), out }, { suffixes = { "lib", "lib64", "lib/x86_64-linux-gnu" } })
includepath = find_path("Python.h", { path.directory(exepath), out }, { suffixes = { "include/python" .. pyver } })
end
if libpath and includepath then
local result = {
version = version,
includedirs = includepath
}
if not package:config("headeronly") then
result.links = libpath.link
result.linkdirs = libpath.linkdir
end
return result
end
end
function main(package, opt)
if opt.system then
if package:is_binary() then
return _find_binary(package, opt)
else
return _find_library(package, opt)
end
end
end