diff options
Diffstat (limited to 'src/Bindings/CheckBindingsDependencies.lua')
-rw-r--r-- | src/Bindings/CheckBindingsDependencies.lua | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/Bindings/CheckBindingsDependencies.lua b/src/Bindings/CheckBindingsDependencies.lua new file mode 100644 index 000000000..c0565ead8 --- /dev/null +++ b/src/Bindings/CheckBindingsDependencies.lua @@ -0,0 +1,108 @@ +-- CheckBindingsDependencies.lua + +-- This script checks whether all files listed in AllToLua.pkg are also in the dependencies for bindings regeneration. +-- This script is run as part of the CircleCI tests + + + + + +--- Filenames that should be ignored in the AllToLua.pkg file: +-- Dictionary of "filename" -> true for each ignored filename +local g_ShouldIgnorePkg = +{ + -- ["../IniFile.h"] = true, +} + +--- Filenames that should be ignored in the CMakeLists.txt file: +-- Dictionary of "filename" -> true for each ignored filename +local g_ShouldIgnoreCMake = +{ + ["tolua"] = true, + ["../Bindings/AllToLua.pkg"] = true, + ["../Bindings/BindingsProcessor.lua"] = true, +} + + + + + +--- Returns a sorted list of all files listed in AllToLua.pkg +-- The returned table has both an array part (list of files) and a dictionary part ("filename" -> true) +local function getAllToLuaPkgFiles() + local res = {} + for line in io.lines("AllToLua.pkg") do + line:gsub("$cfile \"(.+)\"", -- Parse each line with a $cfile directive + function (a_FileName) + if (g_ShouldIgnorePkg[a_FileName]) then + return + end + a_FileName = a_FileName:gsub("../Bindings/", "") -- Normalize the path + table.insert(res, a_FileName) + res[a_FileName] = true + end + ) + end + table.sort(res) + return res +end + + + + + +--- Returns a sorted list of all files listed as dependencies in CMakeLists.txt +-- The returned table has both an array part (list of files) and a dictionary part ("filename" -> true) +local function getCMakeListsFiles() + local f = assert(io.open("CMakeLists.txt", "r")) + local contents = f:read("*all") + f:close() + local res = {} + contents:gsub("set%s*(%b())", -- Process each CMake's "set" statement + function (a_SetStatement) + if not(a_SetStatement:find("%(BINDING_DEPENDENCIES")) then + return + end + -- This is the statement setting the dependencies, parse the files: + a_SetStatement:gsub("%s(%S+)%s", + function (a_FileName) + if (g_ShouldIgnoreCMake[a_FileName]) then + return + end + a_FileName = a_FileName:gsub("../Bindings/", "") -- Normalize the path + table.insert(res, a_FileName) + res[a_FileName] = true + end + ) + end + ) + table.sort(res) + return res +end + + + + + +-- Check each set of files against the other: +local pkgFiles = getAllToLuaPkgFiles() +local cmakeFiles = getCMakeListsFiles() +local numMissingFiles = 0 +for _, fnam in ipairs(pkgFiles) do + if not(cmakeFiles[fnam]) then + io.stderr:write("Bindings dependency file ", fnam, " is not listed in src/Bindings/CMakeLists.txt\n") + numMissingFiles = numMissingFiles + 1 + end +end +for _, fnam in ipairs(cmakeFiles) do + if not(pkgFiles[fnam]) then + io.stderr:write("Bindings dependency file ", fnam, " is not listed in src/Bindings/AllToLua.pkg\n") + numMissingFiles = numMissingFiles + 1 + end +end + +-- If any mismatch was found, exit with an error code: +if (numMissingFiles > 0) then + io.stderr:write("Bindings dependency mismatches found: ", numMissingFiles, "\n") + os.exit(1) +end |