From fa09986e54a6a8730c0003febd7bc6fc87783b96 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 5 Jan 2024 11:40:11 +0100 Subject: [PATCH] scripts: image_customization_lib: add include() function Add a simple way to include image customization Lua snippets. Can be used to split long files, to include the same options multiple times in different conditional branches, or even to pass values back to the including file using return. Relative paths are interpreted relative to the site root (where image-customization.lua is located). Relative includes would become confusing when subdirectories are involved (as they are still interpreted relative to the site root, and proper tracking of current directory for each include seems fairly complex for a very niche use case), so we simply reject this case for now; this way, we can implement this however we want in the future if deemed necessary, without a breaking change. --- docs/user/site.rst | 4 ++++ scripts/image_customization_lib.lua | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/docs/user/site.rst b/docs/user/site.rst index 7f8f544be6..fcd245e4f3 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -728,6 +728,10 @@ disable_factory() Disables factory image generation. Sysupgrade images are still generated and stored in the image output directory. +include(path) + Includes another image customization file. Relative paths are interpreted relative to the site + repository root. Values returned from the included file become the return value of ``include``. + Technically, the image customzation file is evaluated once for each device, allowing to make use of regular Lua *if* statements for device-specific configuration as can be seen in the example. diff --git a/scripts/image_customization_lib.lua b/scripts/image_customization_lib.lua index 1303714217..3a4677aca0 100644 --- a/scripts/image_customization_lib.lua +++ b/scripts/image_customization_lib.lua @@ -79,6 +79,18 @@ local function evaluate_device(env, dev) return dev.options.class == class end + function funcs.include(path) + if string.sub(path, 1, 1) ~= '/' then + assert( + string.find(path, '/') == nil, + 'incorrect use of include(): including files from subdirectories is unsupported') + path = env.GLUON_SITEDIR .. '/' .. path + end + local f = assert(loadfile(path)) + setfenv(f, funcs) + return f() + end + -- Evaluate the feature definition files setfenv(M.customization_file, funcs) M.customization_file()