xmake.lua 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package("sqrat")
  2. set_homepage("http://scrat.sourceforge.net/")
  3. set_description("Sqrat is a C++ library for Squirrel that facilitates exposing classes and other native functionality to Squirrel scripts.")
  4. set_license("zlib")
  5. add_urls("https://downloads.sourceforge.net/project/scrat/Sqrat/Sqrat%20$(version).tar.gz", {version = function (version)
  6. return version:major() .. "." .. version:minor() .. "/sqrat-" .. version
  7. end})
  8. add_versions("0.9.2", "b22ec2edc5cc5fba13280c6372e92a37fe31e74f0db924a41119f10c1130d725")
  9. add_configs("headeronly", {description = "Install headerfiles only.", default = false, type = "boolean"})
  10. add_deps("squirrel")
  11. add_includedirs("include", "include/sqrat")
  12. on_load(function (package)
  13. if package:config("headeronly") then
  14. package:set("kind", "library", {headeronly = true})
  15. end
  16. end)
  17. on_install("!wasm and !iphoneos", function (package)
  18. if not package:config("headeronly") then
  19. if not package:is_cross() then
  20. package:addenv("PATH", "bin")
  21. end
  22. -- Adapt existing code to squirrel 3.2 recent changes https://github.com/albertodemichelis/squirrel/blob/f77074bdd6152d230609146a3d424c6f49e3770f/sq/sq.c#L279
  23. io.replace("sq/sq.c",
  24. [[scfprintf(stdout,_SC("%s %s (%d bits)\n"),SQUIRREL_VERSION,SQUIRREL_COPYRIGHT,sizeof(SQInteger)*8);]],
  25. [[scfprintf(stdout,_SC("%s %s (%d bits)\n"),SQUIRREL_VERSION,SQUIRREL_COPYRIGHT,((int)(sizeof(SQInteger)*8)));]],
  26. {plain = true})
  27. io.replace("sq/sq.c",
  28. [[scsprintf(sq_getscratchpad(v,MAXINPUT),_SC("return (%s)"),&buffer[1]);]],
  29. [[scsprintf(sq_getscratchpad(v,MAXINPUT),(size_t)MAXINPUT,_SC("return (%s)"),&buffer[1]);]], {plain = true})
  30. end
  31. -- Adapt existing code to squirrel 3.2 dependency https://sourceforge.net/p/scrat/code/ci/6b75212d14fbf312c059e09cde3400035835c9dc/
  32. io.replace("include/sqmodule.h",
  33. "(*getclosureinfo)(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);",
  34. "(*getclosureinfo)(HSQUIRRELVM v,SQInteger idx,SQInteger *nparams,SQInteger *nfreevars);", {plain = true})
  35. io.replace("include/sqmodule.h",
  36. "(*getinstanceup)(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);",
  37. "(*getinstanceup)(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag, SQBool throwerror);", {plain = true})
  38. io.replace("include/sqrat/sqratFunction.h", "SQUnsignedInteger nparams;", "SQInteger nparams;", {plain = true})
  39. io.replace("include/sqrat/sqratFunction.h", "SQUnsignedInteger nfreevars;", "SQInteger nfreevars;", {plain = true})
  40. io.replace("include/sqrat/sqratClassType.h",
  41. [[if (SQ_FAILED(sq_getinstanceup(vm, idx, (SQUserPointer*)&instance, classType))) {]],
  42. [[if (SQ_FAILED(sq_getinstanceup(vm, idx, (SQUserPointer*)&instance, classType, SQTrue))) {]], {plain = true})
  43. io.replace("include/sqrat/sqratClassType.h",
  44. [[sq_getinstanceup(vm, idx, (SQUserPointer*)&instance, 0);]],
  45. [[sq_getinstanceup(vm, idx, (SQUserPointer*)&instance, 0, SQFalse);]], {plain = true})
  46. os.cp("include", package:installdir())
  47. if not package:config("headeronly") then
  48. io.writefile("xmake.lua", [[
  49. add_rules("mode.debug", "mode.release")
  50. add_requires("squirrel")
  51. set_languages("c11", "c++11")
  52. target("sqratthread")
  53. set_enabled(is_plat("windows"))
  54. set_kind("$(kind)")
  55. add_defines("SQRATTHREAD_EXPORTS")
  56. add_files("sqratthread/sqratThread.cpp")
  57. add_headerfiles("sqratthread/sqratThread.h")
  58. add_includedirs("include")
  59. add_packages("squirrel")
  60. if is_plat("windows") and is_kind("shared") then
  61. add_rules("utils.symbols.export_all", {export_classes = true})
  62. end
  63. target("sqratimport")
  64. set_kind("$(kind)")
  65. add_files("sqimport/sqratimport.cpp")
  66. add_headerfiles("include/sqmodule.h", "include/sqratimport.h")
  67. add_includedirs("include")
  68. add_packages("squirrel")
  69. if is_plat("windows") and is_kind("shared") then
  70. add_rules("utils.symbols.export_all", {export_classes = true})
  71. end
  72. target("sq")
  73. set_kind("binary")
  74. add_deps("sqratimport")
  75. add_includedirs("include")
  76. add_files("sq/sq.c")
  77. add_packages("squirrel")
  78. if is_plat("linux", "bsd") then
  79. add_syslinks("m", "dl")
  80. end
  81. ]])
  82. import("package.tools.xmake").install(package)
  83. end
  84. end)
  85. on_test(function (package)
  86. if not package:config("headeronly") and not package:is_cross() then
  87. os.vrun("sq -v")
  88. end
  89. assert(package:check_cxxsnippets({test = [[
  90. void test() {
  91. Sqrat::string str = Sqrat::string("sq");
  92. }
  93. ]]}, {configs = {languages = "c++11"}, includes = "sqrat.h"}))
  94. end)