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.
86 lines
4.5 KiB
86 lines
4.5 KiB
2 years ago
|
-- 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)
|