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