summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--circle.yml4
-rw-r--r--src/Bindings/CheckBindingsDependencies.lua108
2 files changed, 110 insertions, 2 deletions
diff --git a/circle.yml b/circle.yml
index 341c87a1d..f13d02ce8 100644
--- a/circle.yml
+++ b/circle.yml
@@ -8,5 +8,5 @@ dependencies:
test:
override:
- - cd src && find . -name \*.cpp -or -name \*.h > AllFiles.lst
- - cd src && lua CheckBasicStyle.lua
+ - cd src && find . -name \*.cpp -or -name \*.h > AllFiles.lst && lua CheckBasicStyle.lua
+ - cd src/Bindings && lua CheckBindingsDependencies.lua
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