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
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)
|
|
|