Explorar el Código

Test sqrat (#6667)

* Test sqrat

* fixup

* Add syslinks, build sqratthread only for Windows OS.

* Try to follow patch for 3.2 squirrel

* Fixup

* os.cp("include", package:installdir())

* Add headeronly option

* Treat as lib by default
Saikari hace 4 meses
padre
commit
049079d989
Se han modificado 1 ficheros con 112 adiciones y 0 borrados
  1. 112 0
      packages/s/sqrat/xmake.lua

+ 112 - 0
packages/s/sqrat/xmake.lua

@@ -0,0 +1,112 @@
+package("sqrat")
+    set_homepage("http://scrat.sourceforge.net/")
+    set_description("Sqrat is a C++ library for Squirrel that facilitates exposing classes and other native functionality to Squirrel scripts.")
+    set_license("zlib")
+
+    add_urls("https://downloads.sourceforge.net/project/scrat/Sqrat/Sqrat%20$(version).tar.gz", {version = function (version)
+        return version:major() .. "." .. version:minor() .. "/sqrat-" .. version
+    end})
+
+    add_versions("0.9.2", "b22ec2edc5cc5fba13280c6372e92a37fe31e74f0db924a41119f10c1130d725")
+
+    add_configs("headeronly", {description = "Install headerfiles only.", default = false, type = "boolean"})
+
+    add_deps("squirrel")
+
+    add_includedirs("include", "include/sqrat")
+
+    on_load(function (package)
+        if package:config("headeronly") then
+            package:set("kind", "library", {headeronly = true})
+        end
+    end)
+
+    on_install("!wasm and !iphoneos", function (package)
+        if not package:config("headeronly") then
+            if not package:is_cross() then
+                package:addenv("PATH", "bin")
+            end
+
+            -- Adapt existing code to squirrel 3.2 recent changes https://github.com/albertodemichelis/squirrel/blob/f77074bdd6152d230609146a3d424c6f49e3770f/sq/sq.c#L279
+            io.replace("sq/sq.c",
+                [[scfprintf(stdout,_SC("%s %s (%d bits)\n"),SQUIRREL_VERSION,SQUIRREL_COPYRIGHT,sizeof(SQInteger)*8);]],
+                [[scfprintf(stdout,_SC("%s %s (%d bits)\n"),SQUIRREL_VERSION,SQUIRREL_COPYRIGHT,((int)(sizeof(SQInteger)*8)));]],
+            {plain = true})
+            io.replace("sq/sq.c",
+                [[scsprintf(sq_getscratchpad(v,MAXINPUT),_SC("return (%s)"),&buffer[1]);]], 
+                [[scsprintf(sq_getscratchpad(v,MAXINPUT),(size_t)MAXINPUT,_SC("return (%s)"),&buffer[1]);]], {plain = true})
+        end
+
+        -- Adapt existing code to squirrel 3.2 dependency https://sourceforge.net/p/scrat/code/ci/6b75212d14fbf312c059e09cde3400035835c9dc/
+        io.replace("include/sqmodule.h",
+            "(*getclosureinfo)(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);",
+            "(*getclosureinfo)(HSQUIRRELVM v,SQInteger idx,SQInteger *nparams,SQInteger *nfreevars);", {plain = true})
+        io.replace("include/sqmodule.h",
+            "(*getinstanceup)(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);",
+            "(*getinstanceup)(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag, SQBool throwerror);", {plain = true})
+
+        io.replace("include/sqrat/sqratFunction.h", "SQUnsignedInteger nparams;", "SQInteger nparams;", {plain = true})
+        io.replace("include/sqrat/sqratFunction.h", "SQUnsignedInteger nfreevars;", "SQInteger nfreevars;", {plain = true})
+
+        io.replace("include/sqrat/sqratClassType.h",
+                        [[if (SQ_FAILED(sq_getinstanceup(vm, idx, (SQUserPointer*)&instance, classType))) {]],
+                        [[if (SQ_FAILED(sq_getinstanceup(vm, idx, (SQUserPointer*)&instance, classType, SQTrue))) {]], {plain = true})
+        io.replace("include/sqrat/sqratClassType.h",
+                        [[sq_getinstanceup(vm, idx, (SQUserPointer*)&instance, 0);]],
+                        [[sq_getinstanceup(vm, idx, (SQUserPointer*)&instance, 0, SQFalse);]], {plain = true})
+
+        os.cp("include", package:installdir())
+
+        if not package:config("headeronly") then
+            io.writefile("xmake.lua", [[
+                add_rules("mode.debug", "mode.release")
+                add_requires("squirrel")
+                set_languages("c11", "c++11")
+
+                target("sqratthread")
+                    set_enabled(is_plat("windows"))
+                    set_kind("$(kind)")
+                    add_defines("SQRATTHREAD_EXPORTS")
+                    add_files("sqratthread/sqratThread.cpp")
+                    add_headerfiles("sqratthread/sqratThread.h")
+                    add_includedirs("include")
+                    add_packages("squirrel")
+                    if is_plat("windows") and is_kind("shared") then
+                        add_rules("utils.symbols.export_all", {export_classes = true})
+                    end
+
+                target("sqratimport")
+                    set_kind("$(kind)")
+                    add_files("sqimport/sqratimport.cpp")
+                    add_headerfiles("include/sqmodule.h", "include/sqratimport.h")
+                    add_includedirs("include")
+                    add_packages("squirrel")
+                    if is_plat("windows") and is_kind("shared") then
+                        add_rules("utils.symbols.export_all", {export_classes = true})
+                    end
+
+                target("sq")
+                    set_kind("binary")
+                    add_deps("sqratimport")
+                    add_includedirs("include")
+                    add_files("sq/sq.c")
+                    add_packages("squirrel")
+                    if is_plat("linux", "bsd") then
+                        add_syslinks("m", "dl")
+                    end
+            ]])
+            import("package.tools.xmake").install(package)
+        end
+    end)
+
+    on_test(function (package)
+        if not package:config("headeronly") and not package:is_cross() then
+            os.vrun("sq -v")
+        end
+
+        assert(package:check_cxxsnippets({test = [[
+            void test() {
+                Sqrat::string str = Sqrat::string("sq");
+            }
+        ]]}, {configs = {languages = "c++11"}, includes = "sqrat.h"}))
+    end)