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.
 
 
 

85 lines
4.5 KiB

-- Generate vtk autoinit header file. Substitution for cmake vtk_module_autoinit.
--
-- Usage:
--
-- add_rules("@vtk/autoinit") -- all modules are included by default
rule("autoinit")
on_config(function (target)
import("core.cache.memcache")
local properties = memcache.get("rule.vtk.autogen")
if properties then
-- add target definitions for autogen header
local autogen_dir = target:autogendir()
local autogen_header_dir = path.directory(path.directory(path.directory(path.directory(autogen_dir))))
local autogen_header = path.join(autogen_header_dir, "vtkModuleAutoInit_all.h")
for module, property in pairs(properties) do
if property.needs_autoinit and property.implementations then
target:add("defines", format("vtk%s_AUTOINIT_INCLUDE=\"%s\"", module, autogen_header:gsub("\\", "/")))
end
end
else
-- parse vtk cmake configuration files
local vtk_root = target:pkg("vtk"):installdir()
local vtk_version = target:pkg("vtk"):version()
local vtk_ver = format("vtk-%s.%s", vtk_version:major(), vtk_version:minor())
local vtk_dir = path.join(vtk_root, "lib", "cmake", vtk_ver)
local property_file = path.join(vtk_dir, "VTK-vtk-module-properties.cmake")
assert(os.isfile(property_file), "VTK cmake configuration files not found!")
local property_file_content = io.readfile(property_file):split('\n', {plain = true})
properties = {}
for _, line in ipairs(property_file_content) do
local module = line:match("set_property%(TARGET \"VTK::(.-)\".+%)")
if module then
if properties[module] == nil then
properties[module] = {needs_autoinit = false}
end
local needs_autoinit = line:find("set_property%(TARGET \"VTK::.-\" PROPERTY \"INTERFACE_vtk_module_needs_autoinit\" \"1\"%)")
if needs_autoinit then
properties[module].needs_autoinit = true
end
local implementable = line:find("set_property%(TARGET \"VTK::.-\" PROPERTY \"INTERFACE_vtk_module_implementable\" \"TRUE\"%)")
if implementable then
properties[module].implementable = true
end
local implements = line:match("set_property%(TARGET \"VTK::.-\" PROPERTY \"INTERFACE_vtk_module_implements\" \"VTK::(.-)\"%)")
if implements then
properties[module].implements = implements
end
end
end
for module, property in pairs(properties) do
local implement = property.implements
if implement then
if properties[implement] and properties[implement].needs_autoinit then
assert(properties[implement].implementable, format("VTK module %s is not implementable!", implement))
if properties[implement].implementations == nil then
properties[implement].implementations = {"vtk" .. module}
else
table.insert(properties[implement].implementations, "vtk" .. module)
end
end
end
end
-- generate autogen header
local autogen_dir = target:autogendir()
local autogen_header_dir = path.directory(path.directory(path.directory(path.directory(autogen_dir))))
local autogen_header = path.join(autogen_header_dir, "vtkModuleAutoInit_all.h")
local autogen_content = ""
for module, property in pairs(properties) do
if property.needs_autoinit and property.implementations then
local implementation_content = table.concat(property.implementations, ",")
autogen_content = autogen_content .. format("#define vtk%s_AUTOINIT %d(%s)\n", module, #property.implementations, implementation_content)
target:add("defines", format("vtk%s_AUTOINIT_INCLUDE=\"%s\"", module, autogen_header:gsub("\\", "/")))
end
end
if not memcache.get("rule.vtk.autogen") then
memcache.set("rule.vtk.autogen", properties)
io.writefile(autogen_header, autogen_content)
end
end
end)