diff options
| author | ruki <[email protected]> | 2024-01-25 22:58:23 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2024-01-25 12:09:59 +0800 |
| commit | 3781f4b6a26ce55b58b95fb704e5217afe231ce1 (patch) | |
| tree | 9fa27daa6671d5547561e6be2918890597656879 | |
| parent | eb17b64f82042e754000c4ae57a6e7184b19b8b0 (diff) | |
improve add files dynamiclly
| -rw-r--r-- | xmake/core/project/target.lua | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 6e0b4d06d..fedac0404 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -272,6 +272,43 @@ function _instance:_visibility(opt) return visibility end +-- update file rules +-- +-- if we add files in on_load() dynamically, we need to update file rules, +-- otherwise it will cause: unknown source file: ... +-- +function _instance:_update_filerules() + local rulenames = {} + local extensions = {} + for _, sourcefile in ipairs(table.wrap(self:get("files"))) do + local extension = path.extension((sourcefile:gsub("|.*$", ""))) + if not extensions[extension] then + local lang = language.load_ex(extension) + if lang and lang:rules() then + table.join2(rulenames, lang:rules()) + end + extensions[extension] = true + end + end + rulenames = table.unique(rulenames) + for _, rulename in ipairs(rulenames) do + local r = target._project() and target._project().rule(rulename) or rule.rule(rulename) + if r then + -- only add target rules + if r:kind() == "target" then + if not self:rule(rulename) then + self:rule_add(r) + for _, deprule in ipairs(r:orderdeps()) do + if not self:rule(deprule:name()) then + self:rule_add(deprule) + end + end + end + end + end + end +end + -- invalidate the previous cache function _instance:_invalidate(name) self._CACHEID = self._CACHEID + 1 @@ -282,6 +319,7 @@ function _instance:_invalidate(name) self._FILESCONFIG = nil self._OBJECTFILES = nil self._SOURCEBATCHES = nil + self:_update_filerules() elseif name == "deps" then self._DEPS = nil self._ORDERDEPS = nil |
