From 0d35db9d367a152b90f589ffd601c3c7bc949a76 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:20:29 +0300 Subject: [PATCH 01/17] add sm-ext-common submodule --- .gitmodules | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..27725e2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "sm-ext-common"] + path = sm-ext-common + url = https://github.com/srcdslab/sm-ext-common \ No newline at end of file From 4fecf3f8ccfa6b9b388d35e7bb993060460e9069 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:21:28 +0300 Subject: [PATCH 02/17] modify sm-ext-common --- .gitmodules | 2 +- sm-ext-common | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 160000 sm-ext-common diff --git a/.gitmodules b/.gitmodules index 27725e2..b4a791b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sm-ext-common"] path = sm-ext-common - url = https://github.com/srcdslab/sm-ext-common \ No newline at end of file + url = https://github.com/srcdslab/sm-ext-common diff --git a/sm-ext-common b/sm-ext-common new file mode 160000 index 0000000..2adde8c --- /dev/null +++ b/sm-ext-common @@ -0,0 +1 @@ +Subproject commit 2adde8cc6fdb3e32beee27349af1beb1769a5872 From 161f0a44ec6782d8860ce909721bd61c5d139dc6 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:31:00 +0300 Subject: [PATCH 03/17] new build system --- .github/workflows/ci.yml | 165 ++--- AMBuildScript | 662 ------------------ AMBuilder | 59 -- bin/smjansson.ext.dll | Bin 109568 -> 0 bytes bin/smjansson.ext.so | Bin 108525 -> 0 bytes src/AMBuilder | 69 ++ config.h => src/config.h | 0 extension.cpp => src/extension.cpp | 0 extension.h => src/extension.h | 0 {jansson => src/jansson}/CHANGES | 0 {jansson => src/jansson}/CMakeLists.txt | 0 {jansson => src/jansson}/LICENSE | 0 {jansson => src/jansson}/Makefile.am | 0 {jansson => src/jansson}/Makefile.in | 0 {jansson => src/jansson}/README.rst | 0 {jansson => src/jansson}/aclocal.m4 | 0 .../cmake/CheckFunctionKeywords.cmake | 0 .../jansson}/cmake/FindSphinx.cmake | 0 {jansson => src/jansson}/cmake/config.h.cmake | 0 .../jansson}/cmake/jansson_config.h.cmake | 0 {jansson => src/jansson}/config.guess | 0 {jansson => src/jansson}/config.h.in | 0 {jansson => src/jansson}/config.sub | 0 {jansson => src/jansson}/configure | 0 {jansson => src/jansson}/configure.ac | 0 {jansson => src/jansson}/depcomp | 0 {jansson => src/jansson}/doc/Makefile.am | 0 {jansson => src/jansson}/doc/Makefile.in | 0 {jansson => src/jansson}/doc/README | 0 {jansson => src/jansson}/doc/apiref.rst | 0 {jansson => src/jansson}/doc/changes.rst | 0 {jansson => src/jansson}/doc/conf.py | 0 {jansson => src/jansson}/doc/conformance.rst | 0 .../jansson}/doc/ext/refcounting.py | 0 .../jansson}/doc/gettingstarted.rst | 0 {jansson => src/jansson}/doc/github_commits.c | 0 {jansson => src/jansson}/doc/index.rst | 0 {jansson => src/jansson}/doc/portability.rst | 0 {jansson => src/jansson}/doc/tutorial.rst | 0 {jansson => src/jansson}/doc/upgrading.rst | 0 {jansson => src/jansson}/install-sh | 0 {jansson => src/jansson}/jansson.pc.in | 0 {jansson => src/jansson}/ltmain.sh | 0 {jansson => src/jansson}/missing | 0 {jansson => src/jansson}/src/Makefile.am | 0 {jansson => src/jansson}/src/Makefile.in | 0 {jansson => src/jansson}/src/dump.c | 0 {jansson => src/jansson}/src/error.c | 0 {jansson => src/jansson}/src/hashtable.c | 0 {jansson => src/jansson}/src/hashtable.h | 0 {jansson => src/jansson}/src/hashtable_seed.c | 0 {jansson => src/jansson}/src/jansson.def | 0 {jansson => src/jansson}/src/jansson.h | 0 {jansson => src/jansson}/src/jansson_config.h | 0 .../jansson}/src/jansson_config.h.in | 0 .../jansson}/src/jansson_private.h | 0 {jansson => src/jansson}/src/load.c | 0 {jansson => src/jansson}/src/lookup3.h | 0 {jansson => src/jansson}/src/memory.c | 0 {jansson => src/jansson}/src/pack_unpack.c | 0 {jansson => src/jansson}/src/strbuffer.c | 0 {jansson => src/jansson}/src/strbuffer.h | 0 {jansson => src/jansson}/src/strconv.c | 0 {jansson => src/jansson}/src/utf.c | 0 {jansson => src/jansson}/src/utf.h | 0 {jansson => src/jansson}/src/value.c | 0 {jansson => src/jansson}/test/Makefile.am | 0 {jansson => src/jansson}/test/Makefile.in | 0 {jansson => src/jansson}/test/bin/Makefile.am | 0 {jansson => src/jansson}/test/bin/Makefile.in | 0 .../jansson}/test/bin/json_process.c | 0 {jansson => src/jansson}/test/run-suites | 0 .../jansson}/test/scripts/run-tests.sh | 0 .../jansson}/test/scripts/valgrind.sh | 0 .../jansson}/test/suites/Makefile.am | 0 .../jansson}/test/suites/Makefile.in | 0 .../jansson}/test/suites/api/Makefile.am | 0 .../jansson}/test/suites/api/Makefile.in | 0 .../jansson}/test/suites/api/check-exports | 0 {jansson => src/jansson}/test/suites/api/run | 0 .../jansson}/test/suites/api/test_array.c | 0 .../jansson}/test/suites/api/test_copy.c | 0 .../jansson}/test/suites/api/test_dump.c | 0 .../test/suites/api/test_dump_callback.c | 0 .../jansson}/test/suites/api/test_equal.c | 0 .../jansson}/test/suites/api/test_load.c | 0 .../test/suites/api/test_load_callback.c | 0 .../jansson}/test/suites/api/test_loadb.c | 0 .../test/suites/api/test_memory_funcs.c | 0 .../jansson}/test/suites/api/test_number.c | 0 .../jansson}/test/suites/api/test_object.c | 0 .../jansson}/test/suites/api/test_pack.c | 0 .../jansson}/test/suites/api/test_simple.c | 0 .../jansson}/test/suites/api/test_unpack.c | 0 .../jansson}/test/suites/api/util.h | 0 .../encoded-surrogate-half/error | 0 .../encoded-surrogate-half/input | 0 .../invalid-utf-8-after-backslash/error | 0 .../invalid-utf-8-after-backslash/input | 0 .../invalid-utf-8-in-array/error | 0 .../invalid-utf-8-in-array/input | 0 .../invalid-utf-8-in-bigger-int/error | 0 .../invalid-utf-8-in-bigger-int/input | 0 .../invalid-utf-8-in-escape/error | 0 .../invalid-utf-8-in-escape/input | 0 .../invalid-utf-8-in-exponent/error | 0 .../invalid-utf-8-in-exponent/input | 0 .../invalid-utf-8-in-identifier/error | 0 .../invalid-utf-8-in-identifier/input | 0 .../invalid-utf-8-in-int/error | 0 .../invalid-utf-8-in-int/input | 0 .../invalid-utf-8-in-real-after-e/error | 0 .../invalid-utf-8-in-real-after-e/input | 0 .../invalid-utf-8-in-string/error | 0 .../invalid-utf-8-in-string/input | 0 .../invalid-unicode/lone-invalid-utf-8/error | 0 .../invalid-unicode/lone-invalid-utf-8/input | 0 .../lone-utf-8-continuation-byte/error | 0 .../lone-utf-8-continuation-byte/input | 0 .../not-in-unicode-range/error | 0 .../not-in-unicode-range/input | 0 .../overlong-3-byte-encoding/error | 0 .../overlong-3-byte-encoding/input | 0 .../overlong-4-byte-encoding/error | 0 .../overlong-4-byte-encoding/input | 0 .../overlong-ascii-encoding/error | 0 .../overlong-ascii-encoding/input | 0 .../invalid-unicode/restricted-utf-8/error | 0 .../invalid-unicode/restricted-utf-8/input | 0 .../jansson}/test/suites/invalid-unicode/run | 0 .../invalid-unicode/truncated-utf-8/error | 0 .../invalid-unicode/truncated-utf-8/input | 0 .../test/suites/invalid/apostrophe/error | 0 .../test/suites/invalid/apostrophe/input | 0 .../invalid/ascii-unicode-identifier/error | 0 .../invalid/ascii-unicode-identifier/input | 0 .../test/suites/invalid/brace-comma/error | 0 .../test/suites/invalid/brace-comma/input | 0 .../test/suites/invalid/bracket-comma/error | 0 .../test/suites/invalid/bracket-comma/input | 0 .../invalid/bracket-one-comma/error.normal | 0 .../invalid/bracket-one-comma/error.strip | 0 .../suites/invalid/bracket-one-comma/input | 0 .../jansson}/test/suites/invalid/empty/error | 0 .../jansson}/test/suites/invalid/empty/input | 0 .../invalid/escaped-null-byte-in-string/error | 0 .../invalid/escaped-null-byte-in-string/input | 0 .../suites/invalid/extra-comma-in-array/error | 0 .../suites/invalid/extra-comma-in-array/input | 0 .../extra-comma-in-multiline-array/error | 0 .../extra-comma-in-multiline-array/input | 0 .../invalid/garbage-after-newline/error | 0 .../invalid/garbage-after-newline/input | 0 .../suites/invalid/garbage-at-the-end/error | 0 .../suites/invalid/garbage-at-the-end/input | 0 .../invalid/integer-starting-with-zero/error | 0 .../invalid/integer-starting-with-zero/input | 0 .../test/suites/invalid/invalid-escape/error | 0 .../test/suites/invalid/invalid-escape/input | 0 .../suites/invalid/invalid-identifier/error | 0 .../suites/invalid/invalid-identifier/input | 0 .../invalid/invalid-negative-integer/error | 0 .../invalid/invalid-negative-integer/input | 0 .../invalid/invalid-negative-real/error | 0 .../invalid/invalid-negative-real/input | 0 .../invalid/invalid-second-surrogate/error | 0 .../invalid/invalid-second-surrogate/input | 0 .../invalid/lone-open-brace/error.normal | 0 .../invalid/lone-open-brace/error.strip | 0 .../test/suites/invalid/lone-open-brace/input | 0 .../invalid/lone-open-bracket/error.normal | 0 .../invalid/lone-open-bracket/error.strip | 0 .../suites/invalid/lone-open-bracket/input | 0 .../invalid/lone-second-surrogate/error | 0 .../invalid/lone-second-surrogate/input | 0 .../invalid/minus-sign-without-number/error | 0 .../invalid/minus-sign-without-number/input | 0 .../negative-integer-starting-with-zero/error | 0 .../negative-integer-starting-with-zero/input | 0 .../suites/invalid/null-byte-in-string/error | 0 .../suites/invalid/null-byte-in-string/input | Bin .../invalid/null-byte-in-string/nostrip | 0 .../invalid/null-byte-outside-string/error | 0 .../invalid/null-byte-outside-string/input | Bin .../invalid/null-byte-outside-string/nostrip | 0 .../jansson}/test/suites/invalid/null/error | 0 .../jansson}/test/suites/invalid/null/input | 0 .../suites/invalid/object-apostrophes/error | 0 .../suites/invalid/object-apostrophes/input | 0 .../invalid/object-garbage-at-end/error | 0 .../invalid/object-garbage-at-end/input | 0 .../object-in-unterminated-array/error.normal | 0 .../object-in-unterminated-array/error.strip | 0 .../object-in-unterminated-array/input | 0 .../invalid/object-no-colon/error.normal | 0 .../invalid/object-no-colon/error.strip | 0 .../test/suites/invalid/object-no-colon/input | 0 .../invalid/object-no-value/error.normal | 0 .../invalid/object-no-value/error.strip | 0 .../test/suites/invalid/object-no-value/input | 0 .../object-unterminated-value/error.normal | 0 .../object-unterminated-value/error.strip | 0 .../invalid/object-unterminated-value/input | 0 .../suites/invalid/real-garbage-after-e/error | 0 .../suites/invalid/real-garbage-after-e/input | 0 .../invalid/real-negative-overflow/error | 0 .../invalid/real-negative-overflow/input | 0 .../invalid/real-positive-overflow/error | 0 .../invalid/real-positive-overflow/input | 0 .../suites/invalid/real-truncated-at-e/error | 0 .../suites/invalid/real-truncated-at-e/input | 0 .../invalid/real-truncated-at-point/error | 0 .../invalid/real-truncated-at-point/input | 0 .../jansson}/test/suites/invalid/run | 0 .../invalid/tab-character-in-string/error | 0 .../invalid/tab-character-in-string/input | 0 .../invalid/too-big-negative-integer/error | 0 .../invalid/too-big-negative-integer/input | 0 .../invalid/too-big-positive-integer/error | 0 .../invalid/too-big-positive-integer/input | 0 .../invalid/truncated-unicode-surrogate/error | 0 .../invalid/truncated-unicode-surrogate/input | 0 .../suites/invalid/unicode-identifier/error | 0 .../suites/invalid/unicode-identifier/input | 0 .../error.normal | 0 .../unterminated-array-and-object/error.strip | 0 .../unterminated-array-and-object/input | 0 .../invalid/unterminated-array/error.normal | 0 .../invalid/unterminated-array/error.strip | 0 .../suites/invalid/unterminated-array/input | 0 .../unterminated-empty-key/error.normal | 0 .../unterminated-empty-key/error.strip | 0 .../invalid/unterminated-empty-key/input | 0 .../invalid/unterminated-key/error.normal | 0 .../invalid/unterminated-key/error.strip | 0 .../suites/invalid/unterminated-key/input | 0 .../unterminated-object-and-array/error | 0 .../unterminated-object-and-array/input | 0 .../invalid/unterminated-string/error.normal | 0 .../invalid/unterminated-string/error.strip | 0 .../suites/invalid/unterminated-string/input | 0 .../test/suites/valid/complex-array/env | 0 .../test/suites/valid/complex-array/input | 0 .../test/suites/valid/complex-array/output | 0 .../test/suites/valid/empty-array/input | 0 .../test/suites/valid/empty-array/output | 0 .../suites/valid/empty-object-in-array/input | 0 .../suites/valid/empty-object-in-array/output | 0 .../test/suites/valid/empty-object/input | 0 .../test/suites/valid/empty-object/output | 0 .../test/suites/valid/empty-string/input | 0 .../test/suites/valid/empty-string/output | 0 .../valid/escaped-utf-control-char/input | 0 .../valid/escaped-utf-control-char/output | 0 .../jansson}/test/suites/valid/false/input | 0 .../jansson}/test/suites/valid/false/output | 0 .../test/suites/valid/negative-int/input | 0 .../test/suites/valid/negative-int/output | 0 .../test/suites/valid/negative-one/input | 0 .../test/suites/valid/negative-one/output | 0 .../test/suites/valid/negative-zero/input | 0 .../test/suites/valid/negative-zero/output | 0 .../jansson}/test/suites/valid/null/input | 0 .../jansson}/test/suites/valid/null/output | 0 .../test/suites/valid/one-byte-utf-8/input | 0 .../test/suites/valid/one-byte-utf-8/output | 0 .../real-capital-e-negative-exponent/input | 0 .../real-capital-e-negative-exponent/output | 0 .../real-capital-e-positive-exponent/input | 0 .../real-capital-e-positive-exponent/output | 0 .../test/suites/valid/real-capital-e/input | 0 .../test/suites/valid/real-capital-e/output | 0 .../test/suites/valid/real-exponent/input | 0 .../test/suites/valid/real-exponent/output | 0 .../suites/valid/real-fraction-exponent/input | 0 .../valid/real-fraction-exponent/output | 0 .../suites/valid/real-negative-exponent/input | 0 .../valid/real-negative-exponent/output | 0 .../suites/valid/real-positive-exponent/input | 0 .../valid/real-positive-exponent/output | 0 .../test/suites/valid/real-underflow/input | 0 .../test/suites/valid/real-underflow/output | 0 .../jansson}/test/suites/valid/run | 0 .../test/suites/valid/short-string/input | 0 .../test/suites/valid/short-string/output | 0 .../suites/valid/simple-ascii-string/input | 0 .../suites/valid/simple-ascii-string/output | 0 .../test/suites/valid/simple-int-0/input | 0 .../test/suites/valid/simple-int-0/output | 0 .../test/suites/valid/simple-int-1/input | 0 .../test/suites/valid/simple-int-1/output | 0 .../test/suites/valid/simple-int-123/input | 0 .../test/suites/valid/simple-int-123/output | 0 .../test/suites/valid/simple-object/input | 0 .../test/suites/valid/simple-object/output | 0 .../test/suites/valid/simple-real/input | 0 .../test/suites/valid/simple-real/output | 0 .../test/suites/valid/string-escapes/input | 0 .../test/suites/valid/string-escapes/output | 0 .../test/suites/valid/three-byte-utf-8/input | 0 .../test/suites/valid/three-byte-utf-8/output | 0 .../jansson}/test/suites/valid/true/input | 0 .../jansson}/test/suites/valid/true/output | 0 .../test/suites/valid/two-byte-utf-8/input | 0 .../test/suites/valid/two-byte-utf-8/output | 0 .../test/suites/valid/utf-8-string/input | 0 .../test/suites/valid/utf-8-string/output | 0 .../utf-surrogate-four-byte-encoding/input | 0 .../utf-surrogate-four-byte-encoding/output | 0 .../jansson}/win32/jansson_config.h | 0 .../jansson}/win32/vs2010/jansson.sln | 0 .../jansson}/win32/vs2010/jansson.vcxproj | 0 .../win32/vs2010/jansson.vcxproj.filters | 0 .../win32/vs2010/jansson.vcxproj.user | 0 {sdk => src}/smsdk_config.h | 0 {sdk => src}/smsdk_ext.cpp | 0 {sdk => src}/smsdk_ext.h | 0 version.rc => src/version.rc | 206 +++--- 318 files changed, 237 insertions(+), 924 deletions(-) delete mode 100644 AMBuildScript delete mode 100644 AMBuilder delete mode 100644 bin/smjansson.ext.dll delete mode 100644 bin/smjansson.ext.so create mode 100644 src/AMBuilder rename config.h => src/config.h (100%) rename extension.cpp => src/extension.cpp (100%) rename extension.h => src/extension.h (100%) rename {jansson => src/jansson}/CHANGES (100%) rename {jansson => src/jansson}/CMakeLists.txt (100%) rename {jansson => src/jansson}/LICENSE (100%) rename {jansson => src/jansson}/Makefile.am (100%) rename {jansson => src/jansson}/Makefile.in (100%) rename {jansson => src/jansson}/README.rst (100%) rename {jansson => src/jansson}/aclocal.m4 (100%) rename {jansson => src/jansson}/cmake/CheckFunctionKeywords.cmake (100%) rename {jansson => src/jansson}/cmake/FindSphinx.cmake (100%) rename {jansson => src/jansson}/cmake/config.h.cmake (100%) rename {jansson => src/jansson}/cmake/jansson_config.h.cmake (100%) rename {jansson => src/jansson}/config.guess (100%) rename {jansson => src/jansson}/config.h.in (100%) rename {jansson => src/jansson}/config.sub (100%) rename {jansson => src/jansson}/configure (100%) rename {jansson => src/jansson}/configure.ac (100%) rename {jansson => src/jansson}/depcomp (100%) rename {jansson => src/jansson}/doc/Makefile.am (100%) rename {jansson => src/jansson}/doc/Makefile.in (100%) rename {jansson => src/jansson}/doc/README (100%) rename {jansson => src/jansson}/doc/apiref.rst (100%) rename {jansson => src/jansson}/doc/changes.rst (100%) rename {jansson => src/jansson}/doc/conf.py (100%) rename {jansson => src/jansson}/doc/conformance.rst (100%) rename {jansson => src/jansson}/doc/ext/refcounting.py (100%) rename {jansson => src/jansson}/doc/gettingstarted.rst (100%) rename {jansson => src/jansson}/doc/github_commits.c (100%) rename {jansson => src/jansson}/doc/index.rst (100%) rename {jansson => src/jansson}/doc/portability.rst (100%) rename {jansson => src/jansson}/doc/tutorial.rst (100%) rename {jansson => src/jansson}/doc/upgrading.rst (100%) rename {jansson => src/jansson}/install-sh (100%) rename {jansson => src/jansson}/jansson.pc.in (100%) rename {jansson => src/jansson}/ltmain.sh (100%) rename {jansson => src/jansson}/missing (100%) rename {jansson => src/jansson}/src/Makefile.am (100%) rename {jansson => src/jansson}/src/Makefile.in (100%) rename {jansson => src/jansson}/src/dump.c (100%) rename {jansson => src/jansson}/src/error.c (100%) rename {jansson => src/jansson}/src/hashtable.c (100%) rename {jansson => src/jansson}/src/hashtable.h (100%) rename {jansson => src/jansson}/src/hashtable_seed.c (100%) rename {jansson => src/jansson}/src/jansson.def (100%) rename {jansson => src/jansson}/src/jansson.h (100%) rename {jansson => src/jansson}/src/jansson_config.h (100%) rename {jansson => src/jansson}/src/jansson_config.h.in (100%) rename {jansson => src/jansson}/src/jansson_private.h (100%) rename {jansson => src/jansson}/src/load.c (100%) rename {jansson => src/jansson}/src/lookup3.h (100%) rename {jansson => src/jansson}/src/memory.c (100%) rename {jansson => src/jansson}/src/pack_unpack.c (100%) rename {jansson => src/jansson}/src/strbuffer.c (100%) rename {jansson => src/jansson}/src/strbuffer.h (100%) rename {jansson => src/jansson}/src/strconv.c (100%) rename {jansson => src/jansson}/src/utf.c (100%) rename {jansson => src/jansson}/src/utf.h (100%) rename {jansson => src/jansson}/src/value.c (100%) rename {jansson => src/jansson}/test/Makefile.am (100%) rename {jansson => src/jansson}/test/Makefile.in (100%) rename {jansson => src/jansson}/test/bin/Makefile.am (100%) rename {jansson => src/jansson}/test/bin/Makefile.in (100%) rename {jansson => src/jansson}/test/bin/json_process.c (100%) rename {jansson => src/jansson}/test/run-suites (100%) rename {jansson => src/jansson}/test/scripts/run-tests.sh (100%) rename {jansson => src/jansson}/test/scripts/valgrind.sh (100%) rename {jansson => src/jansson}/test/suites/Makefile.am (100%) rename {jansson => src/jansson}/test/suites/Makefile.in (100%) rename {jansson => src/jansson}/test/suites/api/Makefile.am (100%) rename {jansson => src/jansson}/test/suites/api/Makefile.in (100%) rename {jansson => src/jansson}/test/suites/api/check-exports (100%) rename {jansson => src/jansson}/test/suites/api/run (100%) rename {jansson => src/jansson}/test/suites/api/test_array.c (100%) rename {jansson => src/jansson}/test/suites/api/test_copy.c (100%) rename {jansson => src/jansson}/test/suites/api/test_dump.c (100%) rename {jansson => src/jansson}/test/suites/api/test_dump_callback.c (100%) rename {jansson => src/jansson}/test/suites/api/test_equal.c (100%) rename {jansson => src/jansson}/test/suites/api/test_load.c (100%) rename {jansson => src/jansson}/test/suites/api/test_load_callback.c (100%) rename {jansson => src/jansson}/test/suites/api/test_loadb.c (100%) rename {jansson => src/jansson}/test/suites/api/test_memory_funcs.c (100%) rename {jansson => src/jansson}/test/suites/api/test_number.c (100%) rename {jansson => src/jansson}/test/suites/api/test_object.c (100%) rename {jansson => src/jansson}/test/suites/api/test_pack.c (100%) rename {jansson => src/jansson}/test/suites/api/test_simple.c (100%) rename {jansson => src/jansson}/test/suites/api/test_unpack.c (100%) rename {jansson => src/jansson}/test/suites/api/util.h (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/encoded-surrogate-half/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/encoded-surrogate-half/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-after-backslash/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-after-backslash/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-array/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-array/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-bigger-int/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-bigger-int/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-escape/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-escape/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-exponent/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-exponent/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-identifier/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-identifier/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-int/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-int/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-real-after-e/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-real-after-e/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-string/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/invalid-utf-8-in-string/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/lone-invalid-utf-8/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/lone-invalid-utf-8/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/lone-utf-8-continuation-byte/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/lone-utf-8-continuation-byte/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/not-in-unicode-range/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/not-in-unicode-range/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/overlong-3-byte-encoding/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/overlong-3-byte-encoding/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/overlong-4-byte-encoding/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/overlong-4-byte-encoding/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/overlong-ascii-encoding/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/overlong-ascii-encoding/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/restricted-utf-8/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/restricted-utf-8/input (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/run (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/truncated-utf-8/error (100%) rename {jansson => src/jansson}/test/suites/invalid-unicode/truncated-utf-8/input (100%) rename {jansson => src/jansson}/test/suites/invalid/apostrophe/error (100%) rename {jansson => src/jansson}/test/suites/invalid/apostrophe/input (100%) rename {jansson => src/jansson}/test/suites/invalid/ascii-unicode-identifier/error (100%) rename {jansson => src/jansson}/test/suites/invalid/ascii-unicode-identifier/input (100%) rename {jansson => src/jansson}/test/suites/invalid/brace-comma/error (100%) rename {jansson => src/jansson}/test/suites/invalid/brace-comma/input (100%) rename {jansson => src/jansson}/test/suites/invalid/bracket-comma/error (100%) rename {jansson => src/jansson}/test/suites/invalid/bracket-comma/input (100%) rename {jansson => src/jansson}/test/suites/invalid/bracket-one-comma/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/bracket-one-comma/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/bracket-one-comma/input (100%) rename {jansson => src/jansson}/test/suites/invalid/empty/error (100%) rename {jansson => src/jansson}/test/suites/invalid/empty/input (100%) rename {jansson => src/jansson}/test/suites/invalid/escaped-null-byte-in-string/error (100%) rename {jansson => src/jansson}/test/suites/invalid/escaped-null-byte-in-string/input (100%) rename {jansson => src/jansson}/test/suites/invalid/extra-comma-in-array/error (100%) rename {jansson => src/jansson}/test/suites/invalid/extra-comma-in-array/input (100%) rename {jansson => src/jansson}/test/suites/invalid/extra-comma-in-multiline-array/error (100%) rename {jansson => src/jansson}/test/suites/invalid/extra-comma-in-multiline-array/input (100%) rename {jansson => src/jansson}/test/suites/invalid/garbage-after-newline/error (100%) rename {jansson => src/jansson}/test/suites/invalid/garbage-after-newline/input (100%) rename {jansson => src/jansson}/test/suites/invalid/garbage-at-the-end/error (100%) rename {jansson => src/jansson}/test/suites/invalid/garbage-at-the-end/input (100%) rename {jansson => src/jansson}/test/suites/invalid/integer-starting-with-zero/error (100%) rename {jansson => src/jansson}/test/suites/invalid/integer-starting-with-zero/input (100%) rename {jansson => src/jansson}/test/suites/invalid/invalid-escape/error (100%) rename {jansson => src/jansson}/test/suites/invalid/invalid-escape/input (100%) rename {jansson => src/jansson}/test/suites/invalid/invalid-identifier/error (100%) rename {jansson => src/jansson}/test/suites/invalid/invalid-identifier/input (100%) rename {jansson => src/jansson}/test/suites/invalid/invalid-negative-integer/error (100%) rename {jansson => src/jansson}/test/suites/invalid/invalid-negative-integer/input (100%) rename {jansson => src/jansson}/test/suites/invalid/invalid-negative-real/error (100%) rename {jansson => src/jansson}/test/suites/invalid/invalid-negative-real/input (100%) rename {jansson => src/jansson}/test/suites/invalid/invalid-second-surrogate/error (100%) rename {jansson => src/jansson}/test/suites/invalid/invalid-second-surrogate/input (100%) rename {jansson => src/jansson}/test/suites/invalid/lone-open-brace/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/lone-open-brace/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/lone-open-brace/input (100%) rename {jansson => src/jansson}/test/suites/invalid/lone-open-bracket/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/lone-open-bracket/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/lone-open-bracket/input (100%) rename {jansson => src/jansson}/test/suites/invalid/lone-second-surrogate/error (100%) rename {jansson => src/jansson}/test/suites/invalid/lone-second-surrogate/input (100%) rename {jansson => src/jansson}/test/suites/invalid/minus-sign-without-number/error (100%) rename {jansson => src/jansson}/test/suites/invalid/minus-sign-without-number/input (100%) rename {jansson => src/jansson}/test/suites/invalid/negative-integer-starting-with-zero/error (100%) rename {jansson => src/jansson}/test/suites/invalid/negative-integer-starting-with-zero/input (100%) rename {jansson => src/jansson}/test/suites/invalid/null-byte-in-string/error (100%) rename {jansson => src/jansson}/test/suites/invalid/null-byte-in-string/input (100%) rename {jansson => src/jansson}/test/suites/invalid/null-byte-in-string/nostrip (100%) rename {jansson => src/jansson}/test/suites/invalid/null-byte-outside-string/error (100%) rename {jansson => src/jansson}/test/suites/invalid/null-byte-outside-string/input (100%) rename {jansson => src/jansson}/test/suites/invalid/null-byte-outside-string/nostrip (100%) rename {jansson => src/jansson}/test/suites/invalid/null/error (100%) rename {jansson => src/jansson}/test/suites/invalid/null/input (100%) rename {jansson => src/jansson}/test/suites/invalid/object-apostrophes/error (100%) rename {jansson => src/jansson}/test/suites/invalid/object-apostrophes/input (100%) rename {jansson => src/jansson}/test/suites/invalid/object-garbage-at-end/error (100%) rename {jansson => src/jansson}/test/suites/invalid/object-garbage-at-end/input (100%) rename {jansson => src/jansson}/test/suites/invalid/object-in-unterminated-array/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/object-in-unterminated-array/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/object-in-unterminated-array/input (100%) rename {jansson => src/jansson}/test/suites/invalid/object-no-colon/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/object-no-colon/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/object-no-colon/input (100%) rename {jansson => src/jansson}/test/suites/invalid/object-no-value/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/object-no-value/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/object-no-value/input (100%) rename {jansson => src/jansson}/test/suites/invalid/object-unterminated-value/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/object-unterminated-value/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/object-unterminated-value/input (100%) rename {jansson => src/jansson}/test/suites/invalid/real-garbage-after-e/error (100%) rename {jansson => src/jansson}/test/suites/invalid/real-garbage-after-e/input (100%) rename {jansson => src/jansson}/test/suites/invalid/real-negative-overflow/error (100%) rename {jansson => src/jansson}/test/suites/invalid/real-negative-overflow/input (100%) rename {jansson => src/jansson}/test/suites/invalid/real-positive-overflow/error (100%) rename {jansson => src/jansson}/test/suites/invalid/real-positive-overflow/input (100%) rename {jansson => src/jansson}/test/suites/invalid/real-truncated-at-e/error (100%) rename {jansson => src/jansson}/test/suites/invalid/real-truncated-at-e/input (100%) rename {jansson => src/jansson}/test/suites/invalid/real-truncated-at-point/error (100%) rename {jansson => src/jansson}/test/suites/invalid/real-truncated-at-point/input (100%) rename {jansson => src/jansson}/test/suites/invalid/run (100%) rename {jansson => src/jansson}/test/suites/invalid/tab-character-in-string/error (100%) rename {jansson => src/jansson}/test/suites/invalid/tab-character-in-string/input (100%) rename {jansson => src/jansson}/test/suites/invalid/too-big-negative-integer/error (100%) rename {jansson => src/jansson}/test/suites/invalid/too-big-negative-integer/input (100%) rename {jansson => src/jansson}/test/suites/invalid/too-big-positive-integer/error (100%) rename {jansson => src/jansson}/test/suites/invalid/too-big-positive-integer/input (100%) rename {jansson => src/jansson}/test/suites/invalid/truncated-unicode-surrogate/error (100%) rename {jansson => src/jansson}/test/suites/invalid/truncated-unicode-surrogate/input (100%) rename {jansson => src/jansson}/test/suites/invalid/unicode-identifier/error (100%) rename {jansson => src/jansson}/test/suites/invalid/unicode-identifier/input (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-array-and-object/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-array-and-object/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-array-and-object/input (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-array/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-array/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-array/input (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-empty-key/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-empty-key/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-empty-key/input (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-key/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-key/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-key/input (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-object-and-array/error (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-object-and-array/input (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-string/error.normal (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-string/error.strip (100%) rename {jansson => src/jansson}/test/suites/invalid/unterminated-string/input (100%) rename {jansson => src/jansson}/test/suites/valid/complex-array/env (100%) rename {jansson => src/jansson}/test/suites/valid/complex-array/input (100%) rename {jansson => src/jansson}/test/suites/valid/complex-array/output (100%) rename {jansson => src/jansson}/test/suites/valid/empty-array/input (100%) rename {jansson => src/jansson}/test/suites/valid/empty-array/output (100%) rename {jansson => src/jansson}/test/suites/valid/empty-object-in-array/input (100%) rename {jansson => src/jansson}/test/suites/valid/empty-object-in-array/output (100%) rename {jansson => src/jansson}/test/suites/valid/empty-object/input (100%) rename {jansson => src/jansson}/test/suites/valid/empty-object/output (100%) rename {jansson => src/jansson}/test/suites/valid/empty-string/input (100%) rename {jansson => src/jansson}/test/suites/valid/empty-string/output (100%) rename {jansson => src/jansson}/test/suites/valid/escaped-utf-control-char/input (100%) rename {jansson => src/jansson}/test/suites/valid/escaped-utf-control-char/output (100%) rename {jansson => src/jansson}/test/suites/valid/false/input (100%) rename {jansson => src/jansson}/test/suites/valid/false/output (100%) rename {jansson => src/jansson}/test/suites/valid/negative-int/input (100%) rename {jansson => src/jansson}/test/suites/valid/negative-int/output (100%) rename {jansson => src/jansson}/test/suites/valid/negative-one/input (100%) rename {jansson => src/jansson}/test/suites/valid/negative-one/output (100%) rename {jansson => src/jansson}/test/suites/valid/negative-zero/input (100%) rename {jansson => src/jansson}/test/suites/valid/negative-zero/output (100%) rename {jansson => src/jansson}/test/suites/valid/null/input (100%) rename {jansson => src/jansson}/test/suites/valid/null/output (100%) rename {jansson => src/jansson}/test/suites/valid/one-byte-utf-8/input (100%) rename {jansson => src/jansson}/test/suites/valid/one-byte-utf-8/output (100%) rename {jansson => src/jansson}/test/suites/valid/real-capital-e-negative-exponent/input (100%) rename {jansson => src/jansson}/test/suites/valid/real-capital-e-negative-exponent/output (100%) rename {jansson => src/jansson}/test/suites/valid/real-capital-e-positive-exponent/input (100%) rename {jansson => src/jansson}/test/suites/valid/real-capital-e-positive-exponent/output (100%) rename {jansson => src/jansson}/test/suites/valid/real-capital-e/input (100%) rename {jansson => src/jansson}/test/suites/valid/real-capital-e/output (100%) rename {jansson => src/jansson}/test/suites/valid/real-exponent/input (100%) rename {jansson => src/jansson}/test/suites/valid/real-exponent/output (100%) rename {jansson => src/jansson}/test/suites/valid/real-fraction-exponent/input (100%) rename {jansson => src/jansson}/test/suites/valid/real-fraction-exponent/output (100%) rename {jansson => src/jansson}/test/suites/valid/real-negative-exponent/input (100%) rename {jansson => src/jansson}/test/suites/valid/real-negative-exponent/output (100%) rename {jansson => src/jansson}/test/suites/valid/real-positive-exponent/input (100%) rename {jansson => src/jansson}/test/suites/valid/real-positive-exponent/output (100%) rename {jansson => src/jansson}/test/suites/valid/real-underflow/input (100%) rename {jansson => src/jansson}/test/suites/valid/real-underflow/output (100%) rename {jansson => src/jansson}/test/suites/valid/run (100%) rename {jansson => src/jansson}/test/suites/valid/short-string/input (100%) rename {jansson => src/jansson}/test/suites/valid/short-string/output (100%) rename {jansson => src/jansson}/test/suites/valid/simple-ascii-string/input (100%) rename {jansson => src/jansson}/test/suites/valid/simple-ascii-string/output (100%) rename {jansson => src/jansson}/test/suites/valid/simple-int-0/input (100%) rename {jansson => src/jansson}/test/suites/valid/simple-int-0/output (100%) rename {jansson => src/jansson}/test/suites/valid/simple-int-1/input (100%) rename {jansson => src/jansson}/test/suites/valid/simple-int-1/output (100%) rename {jansson => src/jansson}/test/suites/valid/simple-int-123/input (100%) rename {jansson => src/jansson}/test/suites/valid/simple-int-123/output (100%) rename {jansson => src/jansson}/test/suites/valid/simple-object/input (100%) rename {jansson => src/jansson}/test/suites/valid/simple-object/output (100%) rename {jansson => src/jansson}/test/suites/valid/simple-real/input (100%) rename {jansson => src/jansson}/test/suites/valid/simple-real/output (100%) rename {jansson => src/jansson}/test/suites/valid/string-escapes/input (100%) rename {jansson => src/jansson}/test/suites/valid/string-escapes/output (100%) rename {jansson => src/jansson}/test/suites/valid/three-byte-utf-8/input (100%) rename {jansson => src/jansson}/test/suites/valid/three-byte-utf-8/output (100%) rename {jansson => src/jansson}/test/suites/valid/true/input (100%) rename {jansson => src/jansson}/test/suites/valid/true/output (100%) rename {jansson => src/jansson}/test/suites/valid/two-byte-utf-8/input (100%) rename {jansson => src/jansson}/test/suites/valid/two-byte-utf-8/output (100%) rename {jansson => src/jansson}/test/suites/valid/utf-8-string/input (100%) rename {jansson => src/jansson}/test/suites/valid/utf-8-string/output (100%) rename {jansson => src/jansson}/test/suites/valid/utf-surrogate-four-byte-encoding/input (100%) rename {jansson => src/jansson}/test/suites/valid/utf-surrogate-four-byte-encoding/output (100%) rename {jansson => src/jansson}/win32/jansson_config.h (100%) rename {jansson => src/jansson}/win32/vs2010/jansson.sln (100%) rename {jansson => src/jansson}/win32/vs2010/jansson.vcxproj (100%) rename {jansson => src/jansson}/win32/vs2010/jansson.vcxproj.filters (100%) rename {jansson => src/jansson}/win32/vs2010/jansson.vcxproj.user (100%) rename {sdk => src}/smsdk_config.h (100%) rename {sdk => src}/smsdk_ext.cpp (100%) rename {sdk => src}/smsdk_ext.h (100%) rename version.rc => src/version.rc (95%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f85251a..60a7aee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,116 +1,81 @@ -name: CI - -on: [push, pull_request, workflow_dispatch] +name: Build AlliedModders Extension + +on: + push: + branches: + - master + - main + tags: + - "*" + pull_request: + branches: + - master + - main jobs: - build: - name: Build - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-20.04] - sourcemod-version: [1.11-dev] - include: - - os: ubuntu-20.04 - target-archs: x86,x86_64 - sdks: sdk2013 - + build-libuv-linux: + runs-on: ubuntu-24.04 + env: + CC: "clang-14" + CXX: "clang++-14" steps: - - name: Install Linux packages - if: runner.os == 'Linux' - run: | - sudo apt update - sudo apt install -yq --no-install-recommends g++-multilib libjansson-dev - - - name: Set up Python - uses: actions/setup-python@v2 - - - name: Checkout - uses: actions/checkout@v2 + - name: Checkout repository with submodules + uses: actions/checkout@v4 with: - path: extension - - - name: Checkout SourceMod - uses: actions/checkout@v2 - with: - repository: alliedmodders/sourcemod - ref: ${{ matrix.sourcemod-version }} - path: sourcemod submodules: recursive - - name: Checkout AMBuild - uses: actions/checkout@v2 - with: - repository: alliedmodders/ambuild - path: ambuild - - - name: Checkout sm-ext-common - uses: actions/checkout@v2 - with: - repository: srcdslab/sm-ext-common - path: sourcemod/extensions/sm-ext-common - - - name: Install sourcemod dependencies + - name: Install Linux dependencies run: | - bash sourcemod/tools/checkout-deps.sh -m -s ${{ matrix.sdks }} - - - name: Install AMBuild - uses: BSFishy/pip-action@v1 - with: - packages: ./ambuild - - - name: Build - working-directory: extension - shell: bash - env: - BREAKPAD_SYMBOL_SERVER: ${{ secrets.BREAKPAD_SYMBOL_SERVER }} + sudo dpkg --add-architecture i386 + sudo apt-get update + sudo apt-get install -y --no-install-recommends \ + gcc-multilib g++-multilib libstdc++6 lib32stdc++6 \ + libc6-dev libc6-dev-i386 linux-libc-dev \ + linux-libc-dev:i386 lib32z1-dev ${{ env.CC }} + + - name: Build and install libuv (Linux x86) + working-directory: libuv run: | - mkdir build && cd build - python ../configure.py --enable-optimize --targets=${{ matrix.target-archs }} --sdks=${{ matrix.sdks }} - ambuild + bash autogen.sh + ./configure --prefix="$(pwd)/dist" --build=i686-pc-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" --disable-shared --enable-static + make -j8 + make install - - name: Upload artifact - uses: actions/upload-artifact@v2 + - name: Upload libuv Linux Artifact + uses: actions/upload-artifact@v4 with: - name: ${{ runner.os }} - path: extension/build/package - - - release: - name: Release - if: startsWith(github.ref, 'refs/tags/') - needs: build - runs-on: ubuntu-latest + name: libuv-linux + path: libuv/dist + retention-days: 1 + build-libuv-windows: + runs-on: windows-2022 steps: - - name: Download artifacts - uses: actions/download-artifact@v2 + - name: Checkout repository with submodules + uses: actions/checkout@v4 + with: + submodules: recursive - - name: Package + - name: Build and install libuv (Windows x86) + shell: cmd + working-directory: libuv run: | - version=`echo $GITHUB_REF | sed "s/refs\/tags\///"` - ls -Rall - if [ -d "./Linux/" ]; then - cd ./Linux/ - tar -czf ../${{ github.event.repository.name }}-${version}-linux.tar.gz -T <(\ls -1) - cd - - fi - if [ -d "./macOS/" ]; then - cd ./macOS/ - tar -czf ../${{ github.event.repository.name }}-${version}-mac.tar.gz -T <(\ls -1) - cd - - fi - if [ -d "./Windows/" ]; then - cd ./Windows/ - tar -czf ../${{ github.event.repository.name }}-${version}-windows.tar.gz -T <(\ls -1) - cd - - fi + mkdir build + cd build + cmake .. -A Win32 -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$:Debug>" -DCMAKE_INSTALL_PREFIX=..\dist + cmake --build . --config Release --target install - - name: Release - uses: svenstaro/upload-release-action@v2 + - name: Upload libuv Windows Artifact + uses: actions/upload-artifact@v4 with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: '*.tar.gz' - tag: ${{ github.ref }} - file_glob: true + name: libuv-windows + path: libuv/dist + retention-days: 1 + + build-release-extension: + uses: srcdslab/ci-workflows/.github/workflows/shared_build_release_am_extension.yml@v1 + needs: [build-libuv-linux, build-libuv-windows] + with: + sdks: "sdk2013" + artifact-path: "libuv/dist" + submodules: "recursive" diff --git a/AMBuildScript b/AMBuildScript deleted file mode 100644 index 4ae866e..0000000 --- a/AMBuildScript +++ /dev/null @@ -1,662 +0,0 @@ -# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: -import os, sys -import traceback - -class SDK(object): - def __init__(self, sdk, ext, aDef, name, platform, dir): - self.folder = 'hl2sdk-' + dir - self.envvar = sdk - self.ext = ext - self.code = aDef - self.define = name - self.platform = platform - self.name = dir - self.path = None # Actual path - self.platformSpec = platform - - # By default, nothing supports x64. - if type(platform) is list: - self.platformSpec = {p: ['x86'] for p in platform} - else: - self.platformSpec = platform - - def shouldBuild(self, targets): - for cxx in targets: - if cxx.target.platform in self.platformSpec: - if cxx.target.arch in self.platformSpec[cxx.target.platform]: - return True - return False - -WinOnly = ['windows'] -WinLinux = ['windows', 'linux'] -WinLinuxMac = ['windows', 'linux', 'mac'] - -PossibleSDKs = { - 'sdk2013': SDK('HL2SDK2013', '2.sdk2013', '9', 'SDK2013', WinLinuxMac, 'sdk2013'), -} - -def ResolveEnvPath(env, folder): - if env in os.environ: - path = os.environ[env] - if os.path.isdir(path): - return path - return None - - head = os.getcwd() - oldhead = None - while head != None and head != oldhead: - path = os.path.join(head, folder) - if os.path.isdir(path): - return path - oldhead = head - head, tail = os.path.split(head) - - return None - -def Normalize(path): - return os.path.abspath(os.path.normpath(path)) - -def SetArchFlags(compiler): - if compiler.behavior == 'gcc': - if compiler.target.arch == 'x86_64': - compiler.cflags += ['-fPIC'] - elif compiler.like('msvc'): - if compiler.target.arch == 'x86_64': - compiler.defines += ['WIN64'] - -class ExtensionConfig(object): - def __init__(self): - self.sdks = {} - self.binaries = [] - self.spvm = [] - self.extensions = [] - self.generated_headers = None - self.sm_root = None - self.mms_root = None - self.mysql_root = {} - self.spcomp = None - self.spcomp_bins = None - self.smx_files = {} - self.versionlib = None - self.all_targets = [] - self.target_archs = set() - self.jansson_root = None - - - if builder.options.targets: - target_archs = builder.options.targets.split(',') - else: - target_archs = ['x86'] - if builder.backend != 'amb2': - target_archs.append('x86_64') - - for arch in target_archs: - try: - cxx = builder.DetectCxx(target_arch = arch) - self.target_archs.add(cxx.target.arch) - except Exception as e: - # Error if archs were manually overridden. - if builder.options.targets: - raise - print('Skipping target {}: {}'.format(arch, e)) - continue - self.all_targets.append(cxx) - - if not self.all_targets: - raise Exception('No suitable C/C++ compiler was found.') - - @property - def tag(self): - if builder.options.debug == '1': - return 'Debug' - return 'Release' - - def detectProductVersion(self): - builder.AddConfigureFile('product.version') - - # For OS X dylib versioning - import re - with open(os.path.join(builder.sourcePath, 'product.version'), 'r') as fp: - productContents = fp.read() - m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents) - if m == None: - self.productVersion = '1.0.0' - else: - major, minor, release = m.groups() - self.productVersion = '{0}.{1}.{2}'.format(major, minor, release) - - def detectSDKs(self): - sdk_list = builder.options.sdks.split(',') - use_none = sdk_list[0] == 'none' - use_all = sdk_list[0] == 'all' - use_present = sdk_list[0] == 'present' - - for sdk_name in PossibleSDKs: - sdk = PossibleSDKs[sdk_name] - if sdk.shouldBuild(self.all_targets): - if builder.options.hl2sdk_root: - sdk_path = os.path.join(builder.options.hl2sdk_root, sdk.folder) - else: - sdk_path = ResolveEnvPath(sdk.envvar, sdk.folder) - if sdk_path is None or not os.path.isdir(sdk_path): - if use_all or sdk_name in sdk_list: - raise Exception('Could not find a valid path for {0}'.format(sdk.envvar)) - continue - if use_all or use_present or sdk_name in sdk_list: - sdk.path = Normalize(sdk_path) - self.sdks[sdk_name] = sdk - - if len(self.sdks) < 1 and len(sdk_list) and not use_none: - raise Exception('No applicable SDKs were found, nothing to do') - - if builder.options.sm_path: - self.sm_root = builder.options.sm_path - else: - self.sm_root = ResolveEnvPath('SOURCEMOD18', 'sourcemod-1.10') - if not self.sm_root: - self.sm_root = ResolveEnvPath('SOURCEMOD', 'sourcemod-source') - if not self.sm_root: - self.sm_root = ResolveEnvPath('SOURCEMOD_DEV', 'sourcemod-central') - if not self.sm_root: - self.sm_root = ResolveEnvPath('SOURCEMOD', 'sourcemod') - - if not self.sm_root or not os.path.isdir(self.sm_root): - raise Exception('Could not find a source copy of Sourcemod') - self.sm_root = Normalize(self.sm_root) - - if builder.options.mms_path: - self.mms_root = builder.options.mms_path - else: - self.mms_root = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10') - if not self.mms_root: - self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'metamod-source') - if not self.mms_root: - self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central') - if not self.mms_root: - self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'metamod') - - if not self.mms_root or not os.path.isdir(self.mms_root): - raise Exception('Could not find a source copy of Metamod:Source') - self.mms_root = Normalize(self.mms_root) - - if builder.options.jansson_path: - self.jansson_root = builder.options.jansson_path - else: - self.jansson_root = ResolveEnvPath('JANSSONSOURCE26', 'jansson-2.6') - if not self.jansson_root: - self.jansson_root = ResolveEnvPath('JANSSONSOURCE_DEV', 'jansson-source') - if not self.jansson_root: - self.jansson_root = ResolveEnvPath('JANSSONSOURCE_DEV', 'jansson-central') - if not self.jansson_root: - self.jansson_root = ResolveEnvPath('JANSSONSOURCE_DEV', 'jansson') - - if not self.jansson_root or not os.path.isdir(self.jansson_root): - raise Exception('Could not find a source copy of jansson') - self.jansson_root = Normalize(self.jansson_root) - - def configure(self): - if not set(self.target_archs).issubset(['x86', 'x86_64']): - raise Exception('Unknown target architecture: {0}'.format(self.target_archs)) - - for cxx in self.all_targets: - self.configure_cxx(cxx) - - def configure_cxx(self, cxx): - if cxx.family == 'msvc': - if cxx.version < 1900: - raise Exception('Only MSVC 2015 and later are supported, c++14 support is required.') - if cxx.family == 'gcc': - if cxx.version < 'gcc-4.9': - raise Exception('Only GCC versions 4.9 or greater are supported, c++14 support is required.') - if cxx.family == 'clang': - if cxx.version < 'clang-3.4': - raise Exception('Only clang versions 3.4 or greater are supported, c++14 support is required.') - - if cxx.like('gcc'): - self.configure_gcc(cxx) - elif cxx.family == 'msvc': - self.configure_msvc(cxx) - - # Optimizaiton - if builder.options.opt == '1': - cxx.defines += ['NDEBUG'] - - # Debugging - if builder.options.debug == '1': - cxx.defines += ['DEBUG', '_DEBUG'] - - # Platform-specifics - if cxx.target.platform == 'linux': - self.configure_linux(cxx) - elif cxx.target.platform == 'mac': - self.configure_mac(cxx) - elif cxx.target.platform == 'windows': - self.configure_windows(cxx) - - # Finish up. - cxx.includes += [ - os.path.join(self.sm_root, 'public'), - ] - - def configure_gcc(self, cxx): - cxx.defines += [ - 'stricmp=strcasecmp', - '_stricmp=strcasecmp', - '_snprintf=snprintf', - '_vsnprintf=vsnprintf', - 'HAVE_STDINT_H', - 'GNUC', - ] - cxx.cflags += [ - '-pipe', - '-fno-strict-aliasing', - '-Wall', - #'-Werror', - '-Wno-unused', - '-Wno-switch', - '-Wno-array-bounds', - '-msse', - '-fvisibility=hidden', - ] - - if cxx.version == 'apple-clang-6.0' or cxx.version == 'clang-3.4': - cxx.cxxflags += ['-std=c++1y'] - else: - cxx.cxxflags += ['-std=c++14'] - - cxx.cxxflags += [ - '-fno-threadsafe-statics', - '-Wno-non-virtual-dtor', - '-Wno-overloaded-virtual', - '-fvisibility-inlines-hidden', - ] - - have_gcc = cxx.family == 'gcc' - have_clang = cxx.family == 'clang' - if cxx.version >= 'clang-3.9' or cxx.version == 'clang-3.4' or cxx.version > 'apple-clang-6.0': - cxx.cxxflags += ['-Wno-expansion-to-defined'] - if cxx.version == 'clang-3.9' or cxx.version == 'apple-clang-8.0': - cxx.cflags += ['-Wno-varargs'] - if cxx.version >= 'clang-3.4' or cxx.version >= 'apple-clang-7.0': - cxx.cxxflags += ['-Wno-inconsistent-missing-override'] - if cxx.version >= 'clang-2.9' or cxx.version >= 'apple-clang-3.0': - cxx.cxxflags += ['-Wno-null-dereference'] - if have_clang or (cxx.version >= 'gcc-4.6'): - cxx.cflags += ['-Wno-narrowing'] - if have_clang or (cxx.version >= 'gcc-4.7'): - cxx.cxxflags += ['-Wno-delete-non-virtual-dtor'] - if cxx.version >= 'gcc-4.8': - cxx.cflags += ['-Wno-unused-result'] - if cxx.version >= 'gcc-9.0': - cxx.cxxflags += ['-Wno-class-memaccess', '-Wno-packed-not-aligned'] - if have_clang: - cxx.cxxflags += ['-Wno-implicit-exception-spec-mismatch'] - if cxx.version >= 'apple-clang-5.1' or cxx.version >= 'clang-3.4': - cxx.cxxflags += ['-Wno-deprecated-register'] - else: - cxx.cxxflags += ['-Wno-deprecated'] - cxx.cflags += ['-Wno-sometimes-uninitialized'] - - # Work around SDK warnings. - if cxx.version >= 'clang-10.0': - cxx.cflags += [ - '-Wno-implicit-int-float-conversion', - '-Wno-tautological-overlap-compare', - ] - - if have_gcc: - cxx.cflags += ['-mfpmath=sse'] - cxx.cflags += ['-Wno-maybe-uninitialized'] - - if builder.options.opt == '1': - cxx.cflags += [ - '-O3', - '-fexperimental-new-pass-manager', - '-mllvm', - '-inline-threshold=1000', - '-mllvm', - '-vectorize-loops', - '-ftree-vectorize', - ] - - # Don't omit the frame pointer. - cxx.cflags += ['-fno-omit-frame-pointer'] - - def configure_msvc(self, cxx): - if builder.options.debug == '1': - cxx.cflags += ['/MTd'] - cxx.linkflags += ['/NODEFAULTLIB:libcmt'] - else: - cxx.cflags += ['/MT'] - cxx.defines += [ - '_CRT_SECURE_NO_DEPRECATE', - '_CRT_SECURE_NO_WARNINGS', - '_CRT_NONSTDC_NO_DEPRECATE', - '_ITERATOR_DEBUG_LEVEL=0', - ] - cxx.cflags += [ - '/W3', - ] - cxx.cxxflags += [ - '/EHsc', - '/GR-', - '/TP', - ] - cxx.linkflags += [ - 'kernel32.lib', - 'user32.lib', - 'gdi32.lib', - 'winspool.lib', - 'comdlg32.lib', - 'advapi32.lib', - 'shell32.lib', - 'ole32.lib', - 'oleaut32.lib', - 'uuid.lib', - 'odbc32.lib', - 'odbccp32.lib', - ] - - if builder.options.opt == '1': - cxx.cflags += ['/Ox', '/Zo'] - cxx.linkflags += ['/OPT:ICF', '/OPT:REF'] - - if builder.options.debug == '1': - cxx.cflags += ['/Od', '/RTC1'] - - # This needs to be after our optimization flags which could otherwise disable it. - # Don't omit the frame pointer. - cxx.cflags += ['/Oy-'] - - def configure_linux(self, cxx): - cxx.defines += ['_LINUX', 'POSIX', '_FILE_OFFSET_BITS=64'] - cxx.linkflags += ['-lm'] - if cxx.family == 'gcc': - cxx.linkflags += ['-static-libgcc'] - elif cxx.family == 'clang': - cxx.linkflags += ['-lgcc_eh'] - cxx.linkflags += ['-static-libstdc++'] - - def configure_mac(self, cxx): - cxx.defines += ['OSX', '_OSX', 'POSIX', 'KE_ABSOLUTELY_NO_STL'] - cxx.cflags += ['-mmacosx-version-min=10.7'] - cxx.linkflags += [ - '-mmacosx-version-min=10.7', - '-stdlib=libc++', - '-lc++', - ] - cxx.cxxflags += ['-stdlib=libc++'] - - def configure_windows(self, cxx): - cxx.defines += ['WIN32', '_WINDOWS'] - - def add_libamtl(self): - # Add libamtl. - self.libamtl = {} - for cxx in self.all_targets: - def get_configure_fn(cxx): - return lambda builder, name: self.StaticLibrary(builder, cxx, name) - extra_vars = {'Configure': get_configure_fn(cxx)} - libamtl = builder.Build('public/amtl/amtl/AMBuilder', extra_vars) - self.libamtl[cxx.target.arch] = libamtl.binary - - def AddVersioning(self, binary): - if binary.compiler.target.platform == 'windows': - binary.sources += ['version.rc'] - binary.compiler.rcdefines += [ - 'BINARY_NAME="{0}"'.format(binary.outputFile), - 'RC_COMPILE', - ] - elif binary.compiler.target.platform == 'mac': - if binary.type == 'library': - binary.compiler.postlink += [ - '-compatibility_version', '1.0.0', - '-current_version', self.productVersion - ] - return binary - - def LibraryBuilder(self, compiler, name): - binary = compiler.Library(name) - self.AddVersioning(binary) - if binary.compiler.like('msvc'): - binary.compiler.linkflags += ['/SUBSYSTEM:WINDOWS'] - return binary - - def ProgramBuilder(self, compiler, name): - binary = compiler.Program(name) - self.AddVersioning(binary) - if '-static-libgcc' in binary.compiler.linkflags: - binary.compiler.linkflags.remove('-static-libgcc') - if '-lgcc_eh' in binary.compiler.linkflags: - binary.compiler.linkflags.remove('-lgcc_eh') - if binary.compiler.like('gcc'): - binary.compiler.linkflags += ['-lstdc++', '-lpthread'] - if binary.compiler.like('msvc'): - binary.compiler.linkflags += ['/SUBSYSTEM:CONSOLE'] - return binary - - def StaticLibraryBuilder(self, compiler, name): - return compiler.StaticLibrary(name) - - def Library(self, context, compiler, name): - compiler = compiler.clone() - SetArchFlags(compiler) - return self.LibraryBuilder(compiler, name) - - def Program(self, context, compiler, name): - compiler = compiler.clone() - SetArchFlags(compiler) - return self.ProgramBuilder(compiler, name) - - def StaticLibrary(self, context, compiler, name): - compiler = compiler.clone() - SetArchFlags(compiler) - return self.StaticLibraryBuilder(compiler, name) - - def ConfigureForExtension(self, context, compiler): - compiler.cxxincludes += [ - os.path.join(context.currentSourcePath), - os.path.join(context.currentSourcePath, 'sdk'), - os.path.join(self.sm_root, 'public'), - os.path.join(self.sm_root, 'public', 'extensions'), - os.path.join(self.sm_root, 'sourcepawn', 'include'), - os.path.join(self.sm_root, 'public', 'amtl', 'amtl'), - os.path.join(self.sm_root, 'public', 'amtl'), - os.path.join(self.sm_root, 'extensions', 'sm-ext-common', 'include'), - ] - compiler.includes += [ - os.path.join(self.jansson_root, 'src'), - ] - return compiler - - def ExtLibrary(self, context, compiler, name): - binary = self.Library(context, compiler, name) - SetArchFlags(compiler) - self.ConfigureForExtension(context, binary.compiler) - return binary - - def ConfigureForHL2(self, context, binary, sdk): - compiler = binary.compiler - SetArchFlags(compiler) - - compiler.cxxincludes += [ - os.path.join(self.mms_root, 'core'), - os.path.join(self.mms_root, 'core', 'sourcehook'), - ] - - defines = ['SE_' + PossibleSDKs[i].define + '=' + PossibleSDKs[i].code for i in PossibleSDKs] - compiler.defines += defines - - paths = [ - ['public'], - ['public', 'engine'], - ['public', 'mathlib'], - ['public', 'vstdlib'], - ['public', 'tier0'], - ['public', 'tier1'] - ] - if sdk.name == 'episode1' or sdk.name == 'darkm': - paths.append(['public', 'dlls']) - paths.append(['game_shared']) - else: - paths.append(['public', 'game', 'server']) - paths.append(['public', 'toolframework']) - paths.append(['game', 'shared']) - paths.append(['common']) - - compiler.defines += ['SOURCE_ENGINE=' + sdk.code] - - if sdk.name in ['sdk2013', 'bms'] and compiler.like('gcc'): - # The 2013 SDK already has these in public/tier0/basetypes.h - compiler.defines.remove('stricmp=strcasecmp') - compiler.defines.remove('_stricmp=strcasecmp') - compiler.defines.remove('_snprintf=snprintf') - compiler.defines.remove('_vsnprintf=vsnprintf') - - if compiler.like('msvc'): - compiler.defines += ['COMPILER_MSVC'] - if compiler.target.arch == 'x86': - compiler.defines += ['COMPILER_MSVC32'] - elif compiler.target.arch == 'x86_64': - compiler.defines += ['COMPILER_MSVC64'] - compiler.linkflags += ['legacy_stdio_definitions.lib'] - else: - compiler.defines += ['COMPILER_GCC'] - - if compiler.target.arch == 'x86_64': - compiler.defines += ['X64BITS', 'PLATFORM_64BITS'] - - # For everything after Swarm, this needs to be defined for entity networking - # to work properly with sendprop value changes. - if sdk.name in ['blade', 'insurgency', 'doi', 'csgo']: - compiler.defines += ['NETWORK_VARS_ENABLED'] - - if sdk.name in ['css', 'hl2dm', 'dods', 'sdk2013', 'bms', 'tf2', 'l4d', 'nucleardawn', 'l4d2']: - if compiler.target.platform in ['linux', 'mac']: - compiler.defines += ['NO_HOOK_MALLOC', 'NO_MALLOC_OVERRIDE'] - - if compiler.target.platform == 'linux': - if sdk.name in ['csgo', 'blade']: - compiler.linkflags.remove('-static-libstdc++') - compiler.defines += ['_GLIBCXX_USE_CXX11_ABI=0'] - - for path in paths: - compiler.cxxincludes += [os.path.join(sdk.path, *path)] - - if compiler.target.platform == 'linux': - if sdk.name == 'episode1': - lib_folder = os.path.join(sdk.path, 'linux_sdk') - elif sdk.name in ['sdk2013', 'bms']: - lib_folder = os.path.join(sdk.path, 'lib', 'public', 'linux32') - elif compiler.target.arch == 'x86_64': - lib_folder = os.path.join(sdk.path, 'lib', 'linux64') - else: - lib_folder = os.path.join(sdk.path, 'lib', 'linux') - elif compiler.target.platform == 'mac': - if sdk.name in ['sdk2013', 'bms']: - lib_folder = os.path.join(sdk.path, 'lib', 'public', 'osx32') - elif compiler.target.arch == 'x86_64': - lib_folder = os.path.join(sdk.path, 'lib', 'osx64') - else: - lib_folder = os.path.join(sdk.path, 'lib', 'mac') - - if compiler.target.platform in ['linux', 'mac']: - if sdk.name in ['sdk2013', 'bms'] or compiler.target.arch == 'x86_64': - compiler.postlink += [ - os.path.join(lib_folder, 'tier1.a'), - os.path.join(lib_folder, 'mathlib.a') - ] - else: - compiler.postlink += [ - os.path.join(lib_folder, 'tier1_i486.a'), - os.path.join(lib_folder, 'mathlib_i486.a') - ] - - if sdk.name in ['blade', 'insurgency', 'doi', 'csgo']: - if compiler.target.arch == 'x86_64': - compiler.postlink += [os.path.join(lib_folder, 'interfaces.a')] - else: - compiler.postlink += [os.path.join(lib_folder, 'interfaces_i486.a')] - - dynamic_libs = [] - if compiler.target.platform == 'linux': - if sdk.name in ['css', 'hl2dm', 'dods', 'tf2', 'sdk2013', 'bms', 'nucleardawn', 'l4d2', 'insurgency', 'doi']: - dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so'] - elif compiler.target.arch == 'x86_64' and sdk.name in ['csgo', 'blade']: - dynamic_libs = ['libtier0_client.so', 'libvstdlib_client.so'] - elif sdk.name in ['l4d', 'blade', 'insurgency', 'doi', 'csgo']: - dynamic_libs = ['libtier0.so', 'libvstdlib.so'] - else: - dynamic_libs = ['tier0_i486.so', 'vstdlib_i486.so'] - elif compiler.target.platform == 'mac': - compiler.linkflags.append('-liconv') - dynamic_libs = ['libtier0.dylib', 'libvstdlib.dylib'] - elif compiler.target.platform == 'windows': - libs = ['tier0', 'tier1', 'vstdlib', 'mathlib'] - if sdk.name in ['swarm', 'blade', 'insurgency', 'doi', 'csgo']: - libs.append('interfaces') - for lib in libs: - if compiler.target.arch == 'x86': - lib_path = os.path.join(sdk.path, 'lib', 'public', lib) + '.lib' - elif compiler.target.arch == 'x86_64': - lib_path = os.path.join(sdk.path, 'lib', 'public', 'win64', lib) + '.lib' - compiler.linkflags.append(lib_path) - - for library in dynamic_libs: - source_path = os.path.join(lib_folder, library) - output_path = os.path.join(binary.localFolder, library) - - # Ensure the output path exists. - context.AddFolder(binary.localFolder) - output = context.AddSymlink(source_path, output_path) - - compiler.weaklinkdeps += [output] - compiler.linkflags[0:0] = [library] - - return binary - - def HL2Library(self, context, compiler, name, sdk): - binary = self.Library(context, compiler, name) - self.ConfigureForExtension(context, binary.compiler) - return self.ConfigureForHL2(context, binary, sdk) - - def HL2Project(self, context, compiler, name): - project = context.LibraryProject(name) - self.ConfigureForExtension(context, compiler) - return project - - def HL2Config(self, project, context, compiler, name, sdk): - binary = project.Configure(compiler, name, - '{0} - {1} {2}'.format(self.tag, sdk.name, compiler.target.arch)) - self.AddVersioning(binary) - return self.ConfigureForHL2(context, binary, sdk) - - def HL2ExtConfig(self, project, context, compiler, name, sdk): - binary = project.Configure(compiler, name, - '{0} - {1} {2}'.format(self.tag, sdk.name, compiler.target.arch)) - self.AddVersioning(binary) - self.ConfigureForHL2(context, binary, sdk) - self.ConfigureForExtension(context, binary.compiler) - return binary - -if getattr(builder, 'target', None) is not None: - sys.stderr.write("Your output folder was configured for AMBuild 2.1, and SourceMod is now\n") - sys.stderr.write("configured to use AMBuild 2.2. Please remove your output folder and\n") - sys.stderr.write("reconfigure to continue.\n") - os._exit(1) - -SM = ExtensionConfig() -SM.detectSDKs() -SM.configure() - -# This will clone the list and each cxx object as we recurse, preventing child -# scripts from messing up global state. -builder.targets = builder.CloneableList(SM.all_targets) - -if builder.backend == 'amb2': - BuildScripts = [ - 'AMBuilder', - 'PackageScript', - ] - -builder.Build(BuildScripts, { 'SM': SM}) diff --git a/AMBuilder b/AMBuilder deleted file mode 100644 index 87b6d8b..0000000 --- a/AMBuilder +++ /dev/null @@ -1,59 +0,0 @@ -# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: -import os - -projectName = 'smjansson' - -for cxx in builder.targets: - for sdk_name in SM.sdks: - sdk = SM.sdks[sdk_name] - - if not cxx.target.arch in sdk.platformSpec[cxx.target.platform]: - continue - - sdk.ext = "." + sdk.ext - if "sdk2013" in sdk.ext: - sdk.ext = "" - - binary = SM.HL2Library(builder, cxx, projectName + ".ext" + sdk.ext, sdk) - - binary.compiler.defines += [ - 'HAVE_STRING_H', - 'SOURCEMOD_BUILD' - ] - - if cxx.target.platform == 'linux': - cxx.postlink += ['-lpthread', '-lrt'] - elif cxx.target.platform == 'mac': - cxx.cflags += ['-Wno-deprecated-declarations'] - cxx.postlink += ['-framework', 'CoreServices'] - - if cxx.family == 'gcc' or cxx.family == 'clang': - cxx.cxxflags += ['-fno-rtti'] - elif cxx.family == 'msvc': - cxx.cxxflags += ['/GR-'] - - binary.sources += [ - 'extension.cpp', - os.path.join(SM.jansson_root, 'src', 'dump.c'), - os.path.join(SM.jansson_root, 'src', 'error.c'), - os.path.join(SM.jansson_root, 'src', 'hashtable.c'), - os.path.join(SM.jansson_root, 'src', 'hashtable_seed.c'), - os.path.join(SM.jansson_root, 'src', 'load.c'), - os.path.join(SM.jansson_root, 'src', 'memory.c'), - os.path.join(SM.jansson_root, 'src', 'pack_unpack.c'), - os.path.join(SM.jansson_root, 'src', 'strbuffer.c'), - os.path.join(SM.jansson_root, 'src', 'strconv.c'), - os.path.join(SM.jansson_root, 'src', 'utf.c'), - os.path.join(SM.jansson_root, 'src', 'value.c'), - #os.path.join(SM.sm_root, 'extensions', 'sm-ext-common', 'mathstubs.c'), - os.path.join(SM.sm_root, 'public', 'smsdk_ext.cpp'), - os.path.join(SM.sm_root, 'public', 'asm', 'asm.c'), - os.path.join(SM.sm_root, 'public', 'libudis86', 'decode.c'), - os.path.join(SM.sm_root, 'public', 'libudis86', 'itab.c'), - os.path.join(SM.sm_root, 'public', 'libudis86', 'syn-att.c'), - os.path.join(SM.sm_root, 'public', 'libudis86', 'syn-intel.c'), - os.path.join(SM.sm_root, 'public', 'libudis86', 'syn.c'), - os.path.join(SM.sm_root, 'public', 'libudis86', 'udis86.c'), - ] - - SM.extensions += [builder.Add(binary)] diff --git a/bin/smjansson.ext.dll b/bin/smjansson.ext.dll deleted file mode 100644 index 73276ef4c4f25e17013e07cefa4262fefa8e60ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109568 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 G!2bb1J_OVN diff --git a/bin/smjansson.ext.so b/bin/smjansson.ext.so deleted file mode 100644 index 4138e65df9e18a7878b01fc0c468525b03799615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108525 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 diff --git a/src/AMBuilder b/src/AMBuilder new file mode 100644 index 0000000..7394d2e --- /dev/null +++ b/src/AMBuilder @@ -0,0 +1,69 @@ +# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: +import os + +projectName = 'smjansson' + +project = builder.LibraryProject(projectName) + +# Extension source files, embedded Jansson source, and SourceMod SDK sources +project.sources += [ + os.path.join(Extension.ext_root, 'extension.cpp'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'dump.c'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'error.c'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'hashtable.c'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'hashtable_seed.c'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'load.c'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'memory.c'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'pack_unpack.c'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'strbuffer.c'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'strconv.c'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'utf.c'), + os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'value.c'), + os.path.join(Extension.sm_root, 'public', 'smsdk_ext.cpp'), + os.path.join(Extension.sm_root, 'public', 'asm', 'asm.c'), + os.path.join(Extension.sm_root, 'public', 'libudis86', 'decode.c'), + os.path.join(Extension.sm_root, 'public', 'libudis86', 'itab.c'), + os.path.join(Extension.sm_root, 'public', 'libudis86', 'syn-att.c'), + os.path.join(Extension.sm_root, 'public', 'libudis86', 'syn-intel.c'), + os.path.join(Extension.sm_root, 'public', 'libudis86', 'syn.c'), + os.path.join(Extension.sm_root, 'public', 'libudis86', 'udis86.c'), +] + +# Include header directories +jansson_inc = os.path.join(Extension.ext_root, 'src', 'jansson', 'src') + +for sdk_name in Extension.sdks: + sdk = Extension.sdks[sdk_name] + if sdk['name'] in ['mock']: + continue + + for cxx in builder.targets: + if not cxx.target.arch in sdk['platforms'][cxx.target.platform]: + continue + + binary = Extension.HL2ExtConfig( + project, builder, cxx, projectName + '.ext', sdk + ) + + # Include Jansson headers + binary.compiler.cxxincludes += [jansson_inc] + + # Defines required for Jansson and SourceMod SDK + binary.compiler.defines += [ + 'HAVE_STRING_H', + 'SOURCEMOD_BUILD', + ] + + # Platform-specific compiler/linker flags + if cxx.target.platform == 'linux': + binary.compiler.postlink += ['-lpthread', '-lrt'] + elif cxx.target.platform == 'mac': + binary.compiler.cflags += ['-Wno-deprecated-declarations'] + binary.compiler.postlink += ['-framework', 'CoreServices'] + + if cxx.family == 'gcc' or cxx.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif cxx.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] + +Extension.extensions += builder.Add(project) diff --git a/config.h b/src/config.h similarity index 100% rename from config.h rename to src/config.h diff --git a/extension.cpp b/src/extension.cpp similarity index 100% rename from extension.cpp rename to src/extension.cpp diff --git a/extension.h b/src/extension.h similarity index 100% rename from extension.h rename to src/extension.h diff --git a/jansson/CHANGES b/src/jansson/CHANGES similarity index 100% rename from jansson/CHANGES rename to src/jansson/CHANGES diff --git a/jansson/CMakeLists.txt b/src/jansson/CMakeLists.txt similarity index 100% rename from jansson/CMakeLists.txt rename to src/jansson/CMakeLists.txt diff --git a/jansson/LICENSE b/src/jansson/LICENSE similarity index 100% rename from jansson/LICENSE rename to src/jansson/LICENSE diff --git a/jansson/Makefile.am b/src/jansson/Makefile.am similarity index 100% rename from jansson/Makefile.am rename to src/jansson/Makefile.am diff --git a/jansson/Makefile.in b/src/jansson/Makefile.in similarity index 100% rename from jansson/Makefile.in rename to src/jansson/Makefile.in diff --git a/jansson/README.rst b/src/jansson/README.rst similarity index 100% rename from jansson/README.rst rename to src/jansson/README.rst diff --git a/jansson/aclocal.m4 b/src/jansson/aclocal.m4 similarity index 100% rename from jansson/aclocal.m4 rename to src/jansson/aclocal.m4 diff --git a/jansson/cmake/CheckFunctionKeywords.cmake b/src/jansson/cmake/CheckFunctionKeywords.cmake similarity index 100% rename from jansson/cmake/CheckFunctionKeywords.cmake rename to src/jansson/cmake/CheckFunctionKeywords.cmake diff --git a/jansson/cmake/FindSphinx.cmake b/src/jansson/cmake/FindSphinx.cmake similarity index 100% rename from jansson/cmake/FindSphinx.cmake rename to src/jansson/cmake/FindSphinx.cmake diff --git a/jansson/cmake/config.h.cmake b/src/jansson/cmake/config.h.cmake similarity index 100% rename from jansson/cmake/config.h.cmake rename to src/jansson/cmake/config.h.cmake diff --git a/jansson/cmake/jansson_config.h.cmake b/src/jansson/cmake/jansson_config.h.cmake similarity index 100% rename from jansson/cmake/jansson_config.h.cmake rename to src/jansson/cmake/jansson_config.h.cmake diff --git a/jansson/config.guess b/src/jansson/config.guess similarity index 100% rename from jansson/config.guess rename to src/jansson/config.guess diff --git a/jansson/config.h.in b/src/jansson/config.h.in similarity index 100% rename from jansson/config.h.in rename to src/jansson/config.h.in diff --git a/jansson/config.sub b/src/jansson/config.sub similarity index 100% rename from jansson/config.sub rename to src/jansson/config.sub diff --git a/jansson/configure b/src/jansson/configure similarity index 100% rename from jansson/configure rename to src/jansson/configure diff --git a/jansson/configure.ac b/src/jansson/configure.ac similarity index 100% rename from jansson/configure.ac rename to src/jansson/configure.ac diff --git a/jansson/depcomp b/src/jansson/depcomp similarity index 100% rename from jansson/depcomp rename to src/jansson/depcomp diff --git a/jansson/doc/Makefile.am b/src/jansson/doc/Makefile.am similarity index 100% rename from jansson/doc/Makefile.am rename to src/jansson/doc/Makefile.am diff --git a/jansson/doc/Makefile.in b/src/jansson/doc/Makefile.in similarity index 100% rename from jansson/doc/Makefile.in rename to src/jansson/doc/Makefile.in diff --git a/jansson/doc/README b/src/jansson/doc/README similarity index 100% rename from jansson/doc/README rename to src/jansson/doc/README diff --git a/jansson/doc/apiref.rst b/src/jansson/doc/apiref.rst similarity index 100% rename from jansson/doc/apiref.rst rename to src/jansson/doc/apiref.rst diff --git a/jansson/doc/changes.rst b/src/jansson/doc/changes.rst similarity index 100% rename from jansson/doc/changes.rst rename to src/jansson/doc/changes.rst diff --git a/jansson/doc/conf.py b/src/jansson/doc/conf.py similarity index 100% rename from jansson/doc/conf.py rename to src/jansson/doc/conf.py diff --git a/jansson/doc/conformance.rst b/src/jansson/doc/conformance.rst similarity index 100% rename from jansson/doc/conformance.rst rename to src/jansson/doc/conformance.rst diff --git a/jansson/doc/ext/refcounting.py b/src/jansson/doc/ext/refcounting.py similarity index 100% rename from jansson/doc/ext/refcounting.py rename to src/jansson/doc/ext/refcounting.py diff --git a/jansson/doc/gettingstarted.rst b/src/jansson/doc/gettingstarted.rst similarity index 100% rename from jansson/doc/gettingstarted.rst rename to src/jansson/doc/gettingstarted.rst diff --git a/jansson/doc/github_commits.c b/src/jansson/doc/github_commits.c similarity index 100% rename from jansson/doc/github_commits.c rename to src/jansson/doc/github_commits.c diff --git a/jansson/doc/index.rst b/src/jansson/doc/index.rst similarity index 100% rename from jansson/doc/index.rst rename to src/jansson/doc/index.rst diff --git a/jansson/doc/portability.rst b/src/jansson/doc/portability.rst similarity index 100% rename from jansson/doc/portability.rst rename to src/jansson/doc/portability.rst diff --git a/jansson/doc/tutorial.rst b/src/jansson/doc/tutorial.rst similarity index 100% rename from jansson/doc/tutorial.rst rename to src/jansson/doc/tutorial.rst diff --git a/jansson/doc/upgrading.rst b/src/jansson/doc/upgrading.rst similarity index 100% rename from jansson/doc/upgrading.rst rename to src/jansson/doc/upgrading.rst diff --git a/jansson/install-sh b/src/jansson/install-sh similarity index 100% rename from jansson/install-sh rename to src/jansson/install-sh diff --git a/jansson/jansson.pc.in b/src/jansson/jansson.pc.in similarity index 100% rename from jansson/jansson.pc.in rename to src/jansson/jansson.pc.in diff --git a/jansson/ltmain.sh b/src/jansson/ltmain.sh similarity index 100% rename from jansson/ltmain.sh rename to src/jansson/ltmain.sh diff --git a/jansson/missing b/src/jansson/missing similarity index 100% rename from jansson/missing rename to src/jansson/missing diff --git a/jansson/src/Makefile.am b/src/jansson/src/Makefile.am similarity index 100% rename from jansson/src/Makefile.am rename to src/jansson/src/Makefile.am diff --git a/jansson/src/Makefile.in b/src/jansson/src/Makefile.in similarity index 100% rename from jansson/src/Makefile.in rename to src/jansson/src/Makefile.in diff --git a/jansson/src/dump.c b/src/jansson/src/dump.c similarity index 100% rename from jansson/src/dump.c rename to src/jansson/src/dump.c diff --git a/jansson/src/error.c b/src/jansson/src/error.c similarity index 100% rename from jansson/src/error.c rename to src/jansson/src/error.c diff --git a/jansson/src/hashtable.c b/src/jansson/src/hashtable.c similarity index 100% rename from jansson/src/hashtable.c rename to src/jansson/src/hashtable.c diff --git a/jansson/src/hashtable.h b/src/jansson/src/hashtable.h similarity index 100% rename from jansson/src/hashtable.h rename to src/jansson/src/hashtable.h diff --git a/jansson/src/hashtable_seed.c b/src/jansson/src/hashtable_seed.c similarity index 100% rename from jansson/src/hashtable_seed.c rename to src/jansson/src/hashtable_seed.c diff --git a/jansson/src/jansson.def b/src/jansson/src/jansson.def similarity index 100% rename from jansson/src/jansson.def rename to src/jansson/src/jansson.def diff --git a/jansson/src/jansson.h b/src/jansson/src/jansson.h similarity index 100% rename from jansson/src/jansson.h rename to src/jansson/src/jansson.h diff --git a/jansson/src/jansson_config.h b/src/jansson/src/jansson_config.h similarity index 100% rename from jansson/src/jansson_config.h rename to src/jansson/src/jansson_config.h diff --git a/jansson/src/jansson_config.h.in b/src/jansson/src/jansson_config.h.in similarity index 100% rename from jansson/src/jansson_config.h.in rename to src/jansson/src/jansson_config.h.in diff --git a/jansson/src/jansson_private.h b/src/jansson/src/jansson_private.h similarity index 100% rename from jansson/src/jansson_private.h rename to src/jansson/src/jansson_private.h diff --git a/jansson/src/load.c b/src/jansson/src/load.c similarity index 100% rename from jansson/src/load.c rename to src/jansson/src/load.c diff --git a/jansson/src/lookup3.h b/src/jansson/src/lookup3.h similarity index 100% rename from jansson/src/lookup3.h rename to src/jansson/src/lookup3.h diff --git a/jansson/src/memory.c b/src/jansson/src/memory.c similarity index 100% rename from jansson/src/memory.c rename to src/jansson/src/memory.c diff --git a/jansson/src/pack_unpack.c b/src/jansson/src/pack_unpack.c similarity index 100% rename from jansson/src/pack_unpack.c rename to src/jansson/src/pack_unpack.c diff --git a/jansson/src/strbuffer.c b/src/jansson/src/strbuffer.c similarity index 100% rename from jansson/src/strbuffer.c rename to src/jansson/src/strbuffer.c diff --git a/jansson/src/strbuffer.h b/src/jansson/src/strbuffer.h similarity index 100% rename from jansson/src/strbuffer.h rename to src/jansson/src/strbuffer.h diff --git a/jansson/src/strconv.c b/src/jansson/src/strconv.c similarity index 100% rename from jansson/src/strconv.c rename to src/jansson/src/strconv.c diff --git a/jansson/src/utf.c b/src/jansson/src/utf.c similarity index 100% rename from jansson/src/utf.c rename to src/jansson/src/utf.c diff --git a/jansson/src/utf.h b/src/jansson/src/utf.h similarity index 100% rename from jansson/src/utf.h rename to src/jansson/src/utf.h diff --git a/jansson/src/value.c b/src/jansson/src/value.c similarity index 100% rename from jansson/src/value.c rename to src/jansson/src/value.c diff --git a/jansson/test/Makefile.am b/src/jansson/test/Makefile.am similarity index 100% rename from jansson/test/Makefile.am rename to src/jansson/test/Makefile.am diff --git a/jansson/test/Makefile.in b/src/jansson/test/Makefile.in similarity index 100% rename from jansson/test/Makefile.in rename to src/jansson/test/Makefile.in diff --git a/jansson/test/bin/Makefile.am b/src/jansson/test/bin/Makefile.am similarity index 100% rename from jansson/test/bin/Makefile.am rename to src/jansson/test/bin/Makefile.am diff --git a/jansson/test/bin/Makefile.in b/src/jansson/test/bin/Makefile.in similarity index 100% rename from jansson/test/bin/Makefile.in rename to src/jansson/test/bin/Makefile.in diff --git a/jansson/test/bin/json_process.c b/src/jansson/test/bin/json_process.c similarity index 100% rename from jansson/test/bin/json_process.c rename to src/jansson/test/bin/json_process.c diff --git a/jansson/test/run-suites b/src/jansson/test/run-suites similarity index 100% rename from jansson/test/run-suites rename to src/jansson/test/run-suites diff --git a/jansson/test/scripts/run-tests.sh b/src/jansson/test/scripts/run-tests.sh similarity index 100% rename from jansson/test/scripts/run-tests.sh rename to src/jansson/test/scripts/run-tests.sh diff --git a/jansson/test/scripts/valgrind.sh b/src/jansson/test/scripts/valgrind.sh similarity index 100% rename from jansson/test/scripts/valgrind.sh rename to src/jansson/test/scripts/valgrind.sh diff --git a/jansson/test/suites/Makefile.am b/src/jansson/test/suites/Makefile.am similarity index 100% rename from jansson/test/suites/Makefile.am rename to src/jansson/test/suites/Makefile.am diff --git a/jansson/test/suites/Makefile.in b/src/jansson/test/suites/Makefile.in similarity index 100% rename from jansson/test/suites/Makefile.in rename to src/jansson/test/suites/Makefile.in diff --git a/jansson/test/suites/api/Makefile.am b/src/jansson/test/suites/api/Makefile.am similarity index 100% rename from jansson/test/suites/api/Makefile.am rename to src/jansson/test/suites/api/Makefile.am diff --git a/jansson/test/suites/api/Makefile.in b/src/jansson/test/suites/api/Makefile.in similarity index 100% rename from jansson/test/suites/api/Makefile.in rename to src/jansson/test/suites/api/Makefile.in diff --git a/jansson/test/suites/api/check-exports b/src/jansson/test/suites/api/check-exports similarity index 100% rename from jansson/test/suites/api/check-exports rename to src/jansson/test/suites/api/check-exports diff --git a/jansson/test/suites/api/run b/src/jansson/test/suites/api/run similarity index 100% rename from jansson/test/suites/api/run rename to src/jansson/test/suites/api/run diff --git a/jansson/test/suites/api/test_array.c b/src/jansson/test/suites/api/test_array.c similarity index 100% rename from jansson/test/suites/api/test_array.c rename to src/jansson/test/suites/api/test_array.c diff --git a/jansson/test/suites/api/test_copy.c b/src/jansson/test/suites/api/test_copy.c similarity index 100% rename from jansson/test/suites/api/test_copy.c rename to src/jansson/test/suites/api/test_copy.c diff --git a/jansson/test/suites/api/test_dump.c b/src/jansson/test/suites/api/test_dump.c similarity index 100% rename from jansson/test/suites/api/test_dump.c rename to src/jansson/test/suites/api/test_dump.c diff --git a/jansson/test/suites/api/test_dump_callback.c b/src/jansson/test/suites/api/test_dump_callback.c similarity index 100% rename from jansson/test/suites/api/test_dump_callback.c rename to src/jansson/test/suites/api/test_dump_callback.c diff --git a/jansson/test/suites/api/test_equal.c b/src/jansson/test/suites/api/test_equal.c similarity index 100% rename from jansson/test/suites/api/test_equal.c rename to src/jansson/test/suites/api/test_equal.c diff --git a/jansson/test/suites/api/test_load.c b/src/jansson/test/suites/api/test_load.c similarity index 100% rename from jansson/test/suites/api/test_load.c rename to src/jansson/test/suites/api/test_load.c diff --git a/jansson/test/suites/api/test_load_callback.c b/src/jansson/test/suites/api/test_load_callback.c similarity index 100% rename from jansson/test/suites/api/test_load_callback.c rename to src/jansson/test/suites/api/test_load_callback.c diff --git a/jansson/test/suites/api/test_loadb.c b/src/jansson/test/suites/api/test_loadb.c similarity index 100% rename from jansson/test/suites/api/test_loadb.c rename to src/jansson/test/suites/api/test_loadb.c diff --git a/jansson/test/suites/api/test_memory_funcs.c b/src/jansson/test/suites/api/test_memory_funcs.c similarity index 100% rename from jansson/test/suites/api/test_memory_funcs.c rename to src/jansson/test/suites/api/test_memory_funcs.c diff --git a/jansson/test/suites/api/test_number.c b/src/jansson/test/suites/api/test_number.c similarity index 100% rename from jansson/test/suites/api/test_number.c rename to src/jansson/test/suites/api/test_number.c diff --git a/jansson/test/suites/api/test_object.c b/src/jansson/test/suites/api/test_object.c similarity index 100% rename from jansson/test/suites/api/test_object.c rename to src/jansson/test/suites/api/test_object.c diff --git a/jansson/test/suites/api/test_pack.c b/src/jansson/test/suites/api/test_pack.c similarity index 100% rename from jansson/test/suites/api/test_pack.c rename to src/jansson/test/suites/api/test_pack.c diff --git a/jansson/test/suites/api/test_simple.c b/src/jansson/test/suites/api/test_simple.c similarity index 100% rename from jansson/test/suites/api/test_simple.c rename to src/jansson/test/suites/api/test_simple.c diff --git a/jansson/test/suites/api/test_unpack.c b/src/jansson/test/suites/api/test_unpack.c similarity index 100% rename from jansson/test/suites/api/test_unpack.c rename to src/jansson/test/suites/api/test_unpack.c diff --git a/jansson/test/suites/api/util.h b/src/jansson/test/suites/api/util.h similarity index 100% rename from jansson/test/suites/api/util.h rename to src/jansson/test/suites/api/util.h diff --git a/jansson/test/suites/invalid-unicode/encoded-surrogate-half/error b/src/jansson/test/suites/invalid-unicode/encoded-surrogate-half/error similarity index 100% rename from jansson/test/suites/invalid-unicode/encoded-surrogate-half/error rename to src/jansson/test/suites/invalid-unicode/encoded-surrogate-half/error diff --git a/jansson/test/suites/invalid-unicode/encoded-surrogate-half/input b/src/jansson/test/suites/invalid-unicode/encoded-surrogate-half/input similarity index 100% rename from jansson/test/suites/invalid-unicode/encoded-surrogate-half/input rename to src/jansson/test/suites/invalid-unicode/encoded-surrogate-half/input diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-after-backslash/error b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-after-backslash/error similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-after-backslash/error rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-after-backslash/error diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-after-backslash/input b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-after-backslash/input similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-after-backslash/input rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-after-backslash/input diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-array/error b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-array/error similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-array/error rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-array/error diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-array/input b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-array/input similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-array/input rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-array/input diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-bigger-int/error b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-bigger-int/error similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-bigger-int/error rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-bigger-int/error diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-bigger-int/input b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-bigger-int/input similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-bigger-int/input rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-bigger-int/input diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-escape/error b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-escape/error similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-escape/error rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-escape/error diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-escape/input b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-escape/input similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-escape/input rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-escape/input diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-exponent/error b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-exponent/error similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-exponent/error rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-exponent/error diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-exponent/input b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-exponent/input similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-exponent/input rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-exponent/input diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-identifier/error b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-identifier/error similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-identifier/error rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-identifier/error diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-identifier/input b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-identifier/input similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-identifier/input rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-identifier/input diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-int/error b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-int/error similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-int/error rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-int/error diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-int/input b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-int/input similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-int/input rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-int/input diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-real-after-e/error b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-real-after-e/error similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-real-after-e/error rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-real-after-e/error diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-real-after-e/input b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-real-after-e/input similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-real-after-e/input rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-real-after-e/input diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-string/error b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-string/error similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-string/error rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-string/error diff --git a/jansson/test/suites/invalid-unicode/invalid-utf-8-in-string/input b/src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-string/input similarity index 100% rename from jansson/test/suites/invalid-unicode/invalid-utf-8-in-string/input rename to src/jansson/test/suites/invalid-unicode/invalid-utf-8-in-string/input diff --git a/jansson/test/suites/invalid-unicode/lone-invalid-utf-8/error b/src/jansson/test/suites/invalid-unicode/lone-invalid-utf-8/error similarity index 100% rename from jansson/test/suites/invalid-unicode/lone-invalid-utf-8/error rename to src/jansson/test/suites/invalid-unicode/lone-invalid-utf-8/error diff --git a/jansson/test/suites/invalid-unicode/lone-invalid-utf-8/input b/src/jansson/test/suites/invalid-unicode/lone-invalid-utf-8/input similarity index 100% rename from jansson/test/suites/invalid-unicode/lone-invalid-utf-8/input rename to src/jansson/test/suites/invalid-unicode/lone-invalid-utf-8/input diff --git a/jansson/test/suites/invalid-unicode/lone-utf-8-continuation-byte/error b/src/jansson/test/suites/invalid-unicode/lone-utf-8-continuation-byte/error similarity index 100% rename from jansson/test/suites/invalid-unicode/lone-utf-8-continuation-byte/error rename to src/jansson/test/suites/invalid-unicode/lone-utf-8-continuation-byte/error diff --git a/jansson/test/suites/invalid-unicode/lone-utf-8-continuation-byte/input b/src/jansson/test/suites/invalid-unicode/lone-utf-8-continuation-byte/input similarity index 100% rename from jansson/test/suites/invalid-unicode/lone-utf-8-continuation-byte/input rename to src/jansson/test/suites/invalid-unicode/lone-utf-8-continuation-byte/input diff --git a/jansson/test/suites/invalid-unicode/not-in-unicode-range/error b/src/jansson/test/suites/invalid-unicode/not-in-unicode-range/error similarity index 100% rename from jansson/test/suites/invalid-unicode/not-in-unicode-range/error rename to src/jansson/test/suites/invalid-unicode/not-in-unicode-range/error diff --git a/jansson/test/suites/invalid-unicode/not-in-unicode-range/input b/src/jansson/test/suites/invalid-unicode/not-in-unicode-range/input similarity index 100% rename from jansson/test/suites/invalid-unicode/not-in-unicode-range/input rename to src/jansson/test/suites/invalid-unicode/not-in-unicode-range/input diff --git a/jansson/test/suites/invalid-unicode/overlong-3-byte-encoding/error b/src/jansson/test/suites/invalid-unicode/overlong-3-byte-encoding/error similarity index 100% rename from jansson/test/suites/invalid-unicode/overlong-3-byte-encoding/error rename to src/jansson/test/suites/invalid-unicode/overlong-3-byte-encoding/error diff --git a/jansson/test/suites/invalid-unicode/overlong-3-byte-encoding/input b/src/jansson/test/suites/invalid-unicode/overlong-3-byte-encoding/input similarity index 100% rename from jansson/test/suites/invalid-unicode/overlong-3-byte-encoding/input rename to src/jansson/test/suites/invalid-unicode/overlong-3-byte-encoding/input diff --git a/jansson/test/suites/invalid-unicode/overlong-4-byte-encoding/error b/src/jansson/test/suites/invalid-unicode/overlong-4-byte-encoding/error similarity index 100% rename from jansson/test/suites/invalid-unicode/overlong-4-byte-encoding/error rename to src/jansson/test/suites/invalid-unicode/overlong-4-byte-encoding/error diff --git a/jansson/test/suites/invalid-unicode/overlong-4-byte-encoding/input b/src/jansson/test/suites/invalid-unicode/overlong-4-byte-encoding/input similarity index 100% rename from jansson/test/suites/invalid-unicode/overlong-4-byte-encoding/input rename to src/jansson/test/suites/invalid-unicode/overlong-4-byte-encoding/input diff --git a/jansson/test/suites/invalid-unicode/overlong-ascii-encoding/error b/src/jansson/test/suites/invalid-unicode/overlong-ascii-encoding/error similarity index 100% rename from jansson/test/suites/invalid-unicode/overlong-ascii-encoding/error rename to src/jansson/test/suites/invalid-unicode/overlong-ascii-encoding/error diff --git a/jansson/test/suites/invalid-unicode/overlong-ascii-encoding/input b/src/jansson/test/suites/invalid-unicode/overlong-ascii-encoding/input similarity index 100% rename from jansson/test/suites/invalid-unicode/overlong-ascii-encoding/input rename to src/jansson/test/suites/invalid-unicode/overlong-ascii-encoding/input diff --git a/jansson/test/suites/invalid-unicode/restricted-utf-8/error b/src/jansson/test/suites/invalid-unicode/restricted-utf-8/error similarity index 100% rename from jansson/test/suites/invalid-unicode/restricted-utf-8/error rename to src/jansson/test/suites/invalid-unicode/restricted-utf-8/error diff --git a/jansson/test/suites/invalid-unicode/restricted-utf-8/input b/src/jansson/test/suites/invalid-unicode/restricted-utf-8/input similarity index 100% rename from jansson/test/suites/invalid-unicode/restricted-utf-8/input rename to src/jansson/test/suites/invalid-unicode/restricted-utf-8/input diff --git a/jansson/test/suites/invalid-unicode/run b/src/jansson/test/suites/invalid-unicode/run similarity index 100% rename from jansson/test/suites/invalid-unicode/run rename to src/jansson/test/suites/invalid-unicode/run diff --git a/jansson/test/suites/invalid-unicode/truncated-utf-8/error b/src/jansson/test/suites/invalid-unicode/truncated-utf-8/error similarity index 100% rename from jansson/test/suites/invalid-unicode/truncated-utf-8/error rename to src/jansson/test/suites/invalid-unicode/truncated-utf-8/error diff --git a/jansson/test/suites/invalid-unicode/truncated-utf-8/input b/src/jansson/test/suites/invalid-unicode/truncated-utf-8/input similarity index 100% rename from jansson/test/suites/invalid-unicode/truncated-utf-8/input rename to src/jansson/test/suites/invalid-unicode/truncated-utf-8/input diff --git a/jansson/test/suites/invalid/apostrophe/error b/src/jansson/test/suites/invalid/apostrophe/error similarity index 100% rename from jansson/test/suites/invalid/apostrophe/error rename to src/jansson/test/suites/invalid/apostrophe/error diff --git a/jansson/test/suites/invalid/apostrophe/input b/src/jansson/test/suites/invalid/apostrophe/input similarity index 100% rename from jansson/test/suites/invalid/apostrophe/input rename to src/jansson/test/suites/invalid/apostrophe/input diff --git a/jansson/test/suites/invalid/ascii-unicode-identifier/error b/src/jansson/test/suites/invalid/ascii-unicode-identifier/error similarity index 100% rename from jansson/test/suites/invalid/ascii-unicode-identifier/error rename to src/jansson/test/suites/invalid/ascii-unicode-identifier/error diff --git a/jansson/test/suites/invalid/ascii-unicode-identifier/input b/src/jansson/test/suites/invalid/ascii-unicode-identifier/input similarity index 100% rename from jansson/test/suites/invalid/ascii-unicode-identifier/input rename to src/jansson/test/suites/invalid/ascii-unicode-identifier/input diff --git a/jansson/test/suites/invalid/brace-comma/error b/src/jansson/test/suites/invalid/brace-comma/error similarity index 100% rename from jansson/test/suites/invalid/brace-comma/error rename to src/jansson/test/suites/invalid/brace-comma/error diff --git a/jansson/test/suites/invalid/brace-comma/input b/src/jansson/test/suites/invalid/brace-comma/input similarity index 100% rename from jansson/test/suites/invalid/brace-comma/input rename to src/jansson/test/suites/invalid/brace-comma/input diff --git a/jansson/test/suites/invalid/bracket-comma/error b/src/jansson/test/suites/invalid/bracket-comma/error similarity index 100% rename from jansson/test/suites/invalid/bracket-comma/error rename to src/jansson/test/suites/invalid/bracket-comma/error diff --git a/jansson/test/suites/invalid/bracket-comma/input b/src/jansson/test/suites/invalid/bracket-comma/input similarity index 100% rename from jansson/test/suites/invalid/bracket-comma/input rename to src/jansson/test/suites/invalid/bracket-comma/input diff --git a/jansson/test/suites/invalid/bracket-one-comma/error.normal b/src/jansson/test/suites/invalid/bracket-one-comma/error.normal similarity index 100% rename from jansson/test/suites/invalid/bracket-one-comma/error.normal rename to src/jansson/test/suites/invalid/bracket-one-comma/error.normal diff --git a/jansson/test/suites/invalid/bracket-one-comma/error.strip b/src/jansson/test/suites/invalid/bracket-one-comma/error.strip similarity index 100% rename from jansson/test/suites/invalid/bracket-one-comma/error.strip rename to src/jansson/test/suites/invalid/bracket-one-comma/error.strip diff --git a/jansson/test/suites/invalid/bracket-one-comma/input b/src/jansson/test/suites/invalid/bracket-one-comma/input similarity index 100% rename from jansson/test/suites/invalid/bracket-one-comma/input rename to src/jansson/test/suites/invalid/bracket-one-comma/input diff --git a/jansson/test/suites/invalid/empty/error b/src/jansson/test/suites/invalid/empty/error similarity index 100% rename from jansson/test/suites/invalid/empty/error rename to src/jansson/test/suites/invalid/empty/error diff --git a/jansson/test/suites/invalid/empty/input b/src/jansson/test/suites/invalid/empty/input similarity index 100% rename from jansson/test/suites/invalid/empty/input rename to src/jansson/test/suites/invalid/empty/input diff --git a/jansson/test/suites/invalid/escaped-null-byte-in-string/error b/src/jansson/test/suites/invalid/escaped-null-byte-in-string/error similarity index 100% rename from jansson/test/suites/invalid/escaped-null-byte-in-string/error rename to src/jansson/test/suites/invalid/escaped-null-byte-in-string/error diff --git a/jansson/test/suites/invalid/escaped-null-byte-in-string/input b/src/jansson/test/suites/invalid/escaped-null-byte-in-string/input similarity index 100% rename from jansson/test/suites/invalid/escaped-null-byte-in-string/input rename to src/jansson/test/suites/invalid/escaped-null-byte-in-string/input diff --git a/jansson/test/suites/invalid/extra-comma-in-array/error b/src/jansson/test/suites/invalid/extra-comma-in-array/error similarity index 100% rename from jansson/test/suites/invalid/extra-comma-in-array/error rename to src/jansson/test/suites/invalid/extra-comma-in-array/error diff --git a/jansson/test/suites/invalid/extra-comma-in-array/input b/src/jansson/test/suites/invalid/extra-comma-in-array/input similarity index 100% rename from jansson/test/suites/invalid/extra-comma-in-array/input rename to src/jansson/test/suites/invalid/extra-comma-in-array/input diff --git a/jansson/test/suites/invalid/extra-comma-in-multiline-array/error b/src/jansson/test/suites/invalid/extra-comma-in-multiline-array/error similarity index 100% rename from jansson/test/suites/invalid/extra-comma-in-multiline-array/error rename to src/jansson/test/suites/invalid/extra-comma-in-multiline-array/error diff --git a/jansson/test/suites/invalid/extra-comma-in-multiline-array/input b/src/jansson/test/suites/invalid/extra-comma-in-multiline-array/input similarity index 100% rename from jansson/test/suites/invalid/extra-comma-in-multiline-array/input rename to src/jansson/test/suites/invalid/extra-comma-in-multiline-array/input diff --git a/jansson/test/suites/invalid/garbage-after-newline/error b/src/jansson/test/suites/invalid/garbage-after-newline/error similarity index 100% rename from jansson/test/suites/invalid/garbage-after-newline/error rename to src/jansson/test/suites/invalid/garbage-after-newline/error diff --git a/jansson/test/suites/invalid/garbage-after-newline/input b/src/jansson/test/suites/invalid/garbage-after-newline/input similarity index 100% rename from jansson/test/suites/invalid/garbage-after-newline/input rename to src/jansson/test/suites/invalid/garbage-after-newline/input diff --git a/jansson/test/suites/invalid/garbage-at-the-end/error b/src/jansson/test/suites/invalid/garbage-at-the-end/error similarity index 100% rename from jansson/test/suites/invalid/garbage-at-the-end/error rename to src/jansson/test/suites/invalid/garbage-at-the-end/error diff --git a/jansson/test/suites/invalid/garbage-at-the-end/input b/src/jansson/test/suites/invalid/garbage-at-the-end/input similarity index 100% rename from jansson/test/suites/invalid/garbage-at-the-end/input rename to src/jansson/test/suites/invalid/garbage-at-the-end/input diff --git a/jansson/test/suites/invalid/integer-starting-with-zero/error b/src/jansson/test/suites/invalid/integer-starting-with-zero/error similarity index 100% rename from jansson/test/suites/invalid/integer-starting-with-zero/error rename to src/jansson/test/suites/invalid/integer-starting-with-zero/error diff --git a/jansson/test/suites/invalid/integer-starting-with-zero/input b/src/jansson/test/suites/invalid/integer-starting-with-zero/input similarity index 100% rename from jansson/test/suites/invalid/integer-starting-with-zero/input rename to src/jansson/test/suites/invalid/integer-starting-with-zero/input diff --git a/jansson/test/suites/invalid/invalid-escape/error b/src/jansson/test/suites/invalid/invalid-escape/error similarity index 100% rename from jansson/test/suites/invalid/invalid-escape/error rename to src/jansson/test/suites/invalid/invalid-escape/error diff --git a/jansson/test/suites/invalid/invalid-escape/input b/src/jansson/test/suites/invalid/invalid-escape/input similarity index 100% rename from jansson/test/suites/invalid/invalid-escape/input rename to src/jansson/test/suites/invalid/invalid-escape/input diff --git a/jansson/test/suites/invalid/invalid-identifier/error b/src/jansson/test/suites/invalid/invalid-identifier/error similarity index 100% rename from jansson/test/suites/invalid/invalid-identifier/error rename to src/jansson/test/suites/invalid/invalid-identifier/error diff --git a/jansson/test/suites/invalid/invalid-identifier/input b/src/jansson/test/suites/invalid/invalid-identifier/input similarity index 100% rename from jansson/test/suites/invalid/invalid-identifier/input rename to src/jansson/test/suites/invalid/invalid-identifier/input diff --git a/jansson/test/suites/invalid/invalid-negative-integer/error b/src/jansson/test/suites/invalid/invalid-negative-integer/error similarity index 100% rename from jansson/test/suites/invalid/invalid-negative-integer/error rename to src/jansson/test/suites/invalid/invalid-negative-integer/error diff --git a/jansson/test/suites/invalid/invalid-negative-integer/input b/src/jansson/test/suites/invalid/invalid-negative-integer/input similarity index 100% rename from jansson/test/suites/invalid/invalid-negative-integer/input rename to src/jansson/test/suites/invalid/invalid-negative-integer/input diff --git a/jansson/test/suites/invalid/invalid-negative-real/error b/src/jansson/test/suites/invalid/invalid-negative-real/error similarity index 100% rename from jansson/test/suites/invalid/invalid-negative-real/error rename to src/jansson/test/suites/invalid/invalid-negative-real/error diff --git a/jansson/test/suites/invalid/invalid-negative-real/input b/src/jansson/test/suites/invalid/invalid-negative-real/input similarity index 100% rename from jansson/test/suites/invalid/invalid-negative-real/input rename to src/jansson/test/suites/invalid/invalid-negative-real/input diff --git a/jansson/test/suites/invalid/invalid-second-surrogate/error b/src/jansson/test/suites/invalid/invalid-second-surrogate/error similarity index 100% rename from jansson/test/suites/invalid/invalid-second-surrogate/error rename to src/jansson/test/suites/invalid/invalid-second-surrogate/error diff --git a/jansson/test/suites/invalid/invalid-second-surrogate/input b/src/jansson/test/suites/invalid/invalid-second-surrogate/input similarity index 100% rename from jansson/test/suites/invalid/invalid-second-surrogate/input rename to src/jansson/test/suites/invalid/invalid-second-surrogate/input diff --git a/jansson/test/suites/invalid/lone-open-brace/error.normal b/src/jansson/test/suites/invalid/lone-open-brace/error.normal similarity index 100% rename from jansson/test/suites/invalid/lone-open-brace/error.normal rename to src/jansson/test/suites/invalid/lone-open-brace/error.normal diff --git a/jansson/test/suites/invalid/lone-open-brace/error.strip b/src/jansson/test/suites/invalid/lone-open-brace/error.strip similarity index 100% rename from jansson/test/suites/invalid/lone-open-brace/error.strip rename to src/jansson/test/suites/invalid/lone-open-brace/error.strip diff --git a/jansson/test/suites/invalid/lone-open-brace/input b/src/jansson/test/suites/invalid/lone-open-brace/input similarity index 100% rename from jansson/test/suites/invalid/lone-open-brace/input rename to src/jansson/test/suites/invalid/lone-open-brace/input diff --git a/jansson/test/suites/invalid/lone-open-bracket/error.normal b/src/jansson/test/suites/invalid/lone-open-bracket/error.normal similarity index 100% rename from jansson/test/suites/invalid/lone-open-bracket/error.normal rename to src/jansson/test/suites/invalid/lone-open-bracket/error.normal diff --git a/jansson/test/suites/invalid/lone-open-bracket/error.strip b/src/jansson/test/suites/invalid/lone-open-bracket/error.strip similarity index 100% rename from jansson/test/suites/invalid/lone-open-bracket/error.strip rename to src/jansson/test/suites/invalid/lone-open-bracket/error.strip diff --git a/jansson/test/suites/invalid/lone-open-bracket/input b/src/jansson/test/suites/invalid/lone-open-bracket/input similarity index 100% rename from jansson/test/suites/invalid/lone-open-bracket/input rename to src/jansson/test/suites/invalid/lone-open-bracket/input diff --git a/jansson/test/suites/invalid/lone-second-surrogate/error b/src/jansson/test/suites/invalid/lone-second-surrogate/error similarity index 100% rename from jansson/test/suites/invalid/lone-second-surrogate/error rename to src/jansson/test/suites/invalid/lone-second-surrogate/error diff --git a/jansson/test/suites/invalid/lone-second-surrogate/input b/src/jansson/test/suites/invalid/lone-second-surrogate/input similarity index 100% rename from jansson/test/suites/invalid/lone-second-surrogate/input rename to src/jansson/test/suites/invalid/lone-second-surrogate/input diff --git a/jansson/test/suites/invalid/minus-sign-without-number/error b/src/jansson/test/suites/invalid/minus-sign-without-number/error similarity index 100% rename from jansson/test/suites/invalid/minus-sign-without-number/error rename to src/jansson/test/suites/invalid/minus-sign-without-number/error diff --git a/jansson/test/suites/invalid/minus-sign-without-number/input b/src/jansson/test/suites/invalid/minus-sign-without-number/input similarity index 100% rename from jansson/test/suites/invalid/minus-sign-without-number/input rename to src/jansson/test/suites/invalid/minus-sign-without-number/input diff --git a/jansson/test/suites/invalid/negative-integer-starting-with-zero/error b/src/jansson/test/suites/invalid/negative-integer-starting-with-zero/error similarity index 100% rename from jansson/test/suites/invalid/negative-integer-starting-with-zero/error rename to src/jansson/test/suites/invalid/negative-integer-starting-with-zero/error diff --git a/jansson/test/suites/invalid/negative-integer-starting-with-zero/input b/src/jansson/test/suites/invalid/negative-integer-starting-with-zero/input similarity index 100% rename from jansson/test/suites/invalid/negative-integer-starting-with-zero/input rename to src/jansson/test/suites/invalid/negative-integer-starting-with-zero/input diff --git a/jansson/test/suites/invalid/null-byte-in-string/error b/src/jansson/test/suites/invalid/null-byte-in-string/error similarity index 100% rename from jansson/test/suites/invalid/null-byte-in-string/error rename to src/jansson/test/suites/invalid/null-byte-in-string/error diff --git a/jansson/test/suites/invalid/null-byte-in-string/input b/src/jansson/test/suites/invalid/null-byte-in-string/input similarity index 100% rename from jansson/test/suites/invalid/null-byte-in-string/input rename to src/jansson/test/suites/invalid/null-byte-in-string/input diff --git a/jansson/test/suites/invalid/null-byte-in-string/nostrip b/src/jansson/test/suites/invalid/null-byte-in-string/nostrip similarity index 100% rename from jansson/test/suites/invalid/null-byte-in-string/nostrip rename to src/jansson/test/suites/invalid/null-byte-in-string/nostrip diff --git a/jansson/test/suites/invalid/null-byte-outside-string/error b/src/jansson/test/suites/invalid/null-byte-outside-string/error similarity index 100% rename from jansson/test/suites/invalid/null-byte-outside-string/error rename to src/jansson/test/suites/invalid/null-byte-outside-string/error diff --git a/jansson/test/suites/invalid/null-byte-outside-string/input b/src/jansson/test/suites/invalid/null-byte-outside-string/input similarity index 100% rename from jansson/test/suites/invalid/null-byte-outside-string/input rename to src/jansson/test/suites/invalid/null-byte-outside-string/input diff --git a/jansson/test/suites/invalid/null-byte-outside-string/nostrip b/src/jansson/test/suites/invalid/null-byte-outside-string/nostrip similarity index 100% rename from jansson/test/suites/invalid/null-byte-outside-string/nostrip rename to src/jansson/test/suites/invalid/null-byte-outside-string/nostrip diff --git a/jansson/test/suites/invalid/null/error b/src/jansson/test/suites/invalid/null/error similarity index 100% rename from jansson/test/suites/invalid/null/error rename to src/jansson/test/suites/invalid/null/error diff --git a/jansson/test/suites/invalid/null/input b/src/jansson/test/suites/invalid/null/input similarity index 100% rename from jansson/test/suites/invalid/null/input rename to src/jansson/test/suites/invalid/null/input diff --git a/jansson/test/suites/invalid/object-apostrophes/error b/src/jansson/test/suites/invalid/object-apostrophes/error similarity index 100% rename from jansson/test/suites/invalid/object-apostrophes/error rename to src/jansson/test/suites/invalid/object-apostrophes/error diff --git a/jansson/test/suites/invalid/object-apostrophes/input b/src/jansson/test/suites/invalid/object-apostrophes/input similarity index 100% rename from jansson/test/suites/invalid/object-apostrophes/input rename to src/jansson/test/suites/invalid/object-apostrophes/input diff --git a/jansson/test/suites/invalid/object-garbage-at-end/error b/src/jansson/test/suites/invalid/object-garbage-at-end/error similarity index 100% rename from jansson/test/suites/invalid/object-garbage-at-end/error rename to src/jansson/test/suites/invalid/object-garbage-at-end/error diff --git a/jansson/test/suites/invalid/object-garbage-at-end/input b/src/jansson/test/suites/invalid/object-garbage-at-end/input similarity index 100% rename from jansson/test/suites/invalid/object-garbage-at-end/input rename to src/jansson/test/suites/invalid/object-garbage-at-end/input diff --git a/jansson/test/suites/invalid/object-in-unterminated-array/error.normal b/src/jansson/test/suites/invalid/object-in-unterminated-array/error.normal similarity index 100% rename from jansson/test/suites/invalid/object-in-unterminated-array/error.normal rename to src/jansson/test/suites/invalid/object-in-unterminated-array/error.normal diff --git a/jansson/test/suites/invalid/object-in-unterminated-array/error.strip b/src/jansson/test/suites/invalid/object-in-unterminated-array/error.strip similarity index 100% rename from jansson/test/suites/invalid/object-in-unterminated-array/error.strip rename to src/jansson/test/suites/invalid/object-in-unterminated-array/error.strip diff --git a/jansson/test/suites/invalid/object-in-unterminated-array/input b/src/jansson/test/suites/invalid/object-in-unterminated-array/input similarity index 100% rename from jansson/test/suites/invalid/object-in-unterminated-array/input rename to src/jansson/test/suites/invalid/object-in-unterminated-array/input diff --git a/jansson/test/suites/invalid/object-no-colon/error.normal b/src/jansson/test/suites/invalid/object-no-colon/error.normal similarity index 100% rename from jansson/test/suites/invalid/object-no-colon/error.normal rename to src/jansson/test/suites/invalid/object-no-colon/error.normal diff --git a/jansson/test/suites/invalid/object-no-colon/error.strip b/src/jansson/test/suites/invalid/object-no-colon/error.strip similarity index 100% rename from jansson/test/suites/invalid/object-no-colon/error.strip rename to src/jansson/test/suites/invalid/object-no-colon/error.strip diff --git a/jansson/test/suites/invalid/object-no-colon/input b/src/jansson/test/suites/invalid/object-no-colon/input similarity index 100% rename from jansson/test/suites/invalid/object-no-colon/input rename to src/jansson/test/suites/invalid/object-no-colon/input diff --git a/jansson/test/suites/invalid/object-no-value/error.normal b/src/jansson/test/suites/invalid/object-no-value/error.normal similarity index 100% rename from jansson/test/suites/invalid/object-no-value/error.normal rename to src/jansson/test/suites/invalid/object-no-value/error.normal diff --git a/jansson/test/suites/invalid/object-no-value/error.strip b/src/jansson/test/suites/invalid/object-no-value/error.strip similarity index 100% rename from jansson/test/suites/invalid/object-no-value/error.strip rename to src/jansson/test/suites/invalid/object-no-value/error.strip diff --git a/jansson/test/suites/invalid/object-no-value/input b/src/jansson/test/suites/invalid/object-no-value/input similarity index 100% rename from jansson/test/suites/invalid/object-no-value/input rename to src/jansson/test/suites/invalid/object-no-value/input diff --git a/jansson/test/suites/invalid/object-unterminated-value/error.normal b/src/jansson/test/suites/invalid/object-unterminated-value/error.normal similarity index 100% rename from jansson/test/suites/invalid/object-unterminated-value/error.normal rename to src/jansson/test/suites/invalid/object-unterminated-value/error.normal diff --git a/jansson/test/suites/invalid/object-unterminated-value/error.strip b/src/jansson/test/suites/invalid/object-unterminated-value/error.strip similarity index 100% rename from jansson/test/suites/invalid/object-unterminated-value/error.strip rename to src/jansson/test/suites/invalid/object-unterminated-value/error.strip diff --git a/jansson/test/suites/invalid/object-unterminated-value/input b/src/jansson/test/suites/invalid/object-unterminated-value/input similarity index 100% rename from jansson/test/suites/invalid/object-unterminated-value/input rename to src/jansson/test/suites/invalid/object-unterminated-value/input diff --git a/jansson/test/suites/invalid/real-garbage-after-e/error b/src/jansson/test/suites/invalid/real-garbage-after-e/error similarity index 100% rename from jansson/test/suites/invalid/real-garbage-after-e/error rename to src/jansson/test/suites/invalid/real-garbage-after-e/error diff --git a/jansson/test/suites/invalid/real-garbage-after-e/input b/src/jansson/test/suites/invalid/real-garbage-after-e/input similarity index 100% rename from jansson/test/suites/invalid/real-garbage-after-e/input rename to src/jansson/test/suites/invalid/real-garbage-after-e/input diff --git a/jansson/test/suites/invalid/real-negative-overflow/error b/src/jansson/test/suites/invalid/real-negative-overflow/error similarity index 100% rename from jansson/test/suites/invalid/real-negative-overflow/error rename to src/jansson/test/suites/invalid/real-negative-overflow/error diff --git a/jansson/test/suites/invalid/real-negative-overflow/input b/src/jansson/test/suites/invalid/real-negative-overflow/input similarity index 100% rename from jansson/test/suites/invalid/real-negative-overflow/input rename to src/jansson/test/suites/invalid/real-negative-overflow/input diff --git a/jansson/test/suites/invalid/real-positive-overflow/error b/src/jansson/test/suites/invalid/real-positive-overflow/error similarity index 100% rename from jansson/test/suites/invalid/real-positive-overflow/error rename to src/jansson/test/suites/invalid/real-positive-overflow/error diff --git a/jansson/test/suites/invalid/real-positive-overflow/input b/src/jansson/test/suites/invalid/real-positive-overflow/input similarity index 100% rename from jansson/test/suites/invalid/real-positive-overflow/input rename to src/jansson/test/suites/invalid/real-positive-overflow/input diff --git a/jansson/test/suites/invalid/real-truncated-at-e/error b/src/jansson/test/suites/invalid/real-truncated-at-e/error similarity index 100% rename from jansson/test/suites/invalid/real-truncated-at-e/error rename to src/jansson/test/suites/invalid/real-truncated-at-e/error diff --git a/jansson/test/suites/invalid/real-truncated-at-e/input b/src/jansson/test/suites/invalid/real-truncated-at-e/input similarity index 100% rename from jansson/test/suites/invalid/real-truncated-at-e/input rename to src/jansson/test/suites/invalid/real-truncated-at-e/input diff --git a/jansson/test/suites/invalid/real-truncated-at-point/error b/src/jansson/test/suites/invalid/real-truncated-at-point/error similarity index 100% rename from jansson/test/suites/invalid/real-truncated-at-point/error rename to src/jansson/test/suites/invalid/real-truncated-at-point/error diff --git a/jansson/test/suites/invalid/real-truncated-at-point/input b/src/jansson/test/suites/invalid/real-truncated-at-point/input similarity index 100% rename from jansson/test/suites/invalid/real-truncated-at-point/input rename to src/jansson/test/suites/invalid/real-truncated-at-point/input diff --git a/jansson/test/suites/invalid/run b/src/jansson/test/suites/invalid/run similarity index 100% rename from jansson/test/suites/invalid/run rename to src/jansson/test/suites/invalid/run diff --git a/jansson/test/suites/invalid/tab-character-in-string/error b/src/jansson/test/suites/invalid/tab-character-in-string/error similarity index 100% rename from jansson/test/suites/invalid/tab-character-in-string/error rename to src/jansson/test/suites/invalid/tab-character-in-string/error diff --git a/jansson/test/suites/invalid/tab-character-in-string/input b/src/jansson/test/suites/invalid/tab-character-in-string/input similarity index 100% rename from jansson/test/suites/invalid/tab-character-in-string/input rename to src/jansson/test/suites/invalid/tab-character-in-string/input diff --git a/jansson/test/suites/invalid/too-big-negative-integer/error b/src/jansson/test/suites/invalid/too-big-negative-integer/error similarity index 100% rename from jansson/test/suites/invalid/too-big-negative-integer/error rename to src/jansson/test/suites/invalid/too-big-negative-integer/error diff --git a/jansson/test/suites/invalid/too-big-negative-integer/input b/src/jansson/test/suites/invalid/too-big-negative-integer/input similarity index 100% rename from jansson/test/suites/invalid/too-big-negative-integer/input rename to src/jansson/test/suites/invalid/too-big-negative-integer/input diff --git a/jansson/test/suites/invalid/too-big-positive-integer/error b/src/jansson/test/suites/invalid/too-big-positive-integer/error similarity index 100% rename from jansson/test/suites/invalid/too-big-positive-integer/error rename to src/jansson/test/suites/invalid/too-big-positive-integer/error diff --git a/jansson/test/suites/invalid/too-big-positive-integer/input b/src/jansson/test/suites/invalid/too-big-positive-integer/input similarity index 100% rename from jansson/test/suites/invalid/too-big-positive-integer/input rename to src/jansson/test/suites/invalid/too-big-positive-integer/input diff --git a/jansson/test/suites/invalid/truncated-unicode-surrogate/error b/src/jansson/test/suites/invalid/truncated-unicode-surrogate/error similarity index 100% rename from jansson/test/suites/invalid/truncated-unicode-surrogate/error rename to src/jansson/test/suites/invalid/truncated-unicode-surrogate/error diff --git a/jansson/test/suites/invalid/truncated-unicode-surrogate/input b/src/jansson/test/suites/invalid/truncated-unicode-surrogate/input similarity index 100% rename from jansson/test/suites/invalid/truncated-unicode-surrogate/input rename to src/jansson/test/suites/invalid/truncated-unicode-surrogate/input diff --git a/jansson/test/suites/invalid/unicode-identifier/error b/src/jansson/test/suites/invalid/unicode-identifier/error similarity index 100% rename from jansson/test/suites/invalid/unicode-identifier/error rename to src/jansson/test/suites/invalid/unicode-identifier/error diff --git a/jansson/test/suites/invalid/unicode-identifier/input b/src/jansson/test/suites/invalid/unicode-identifier/input similarity index 100% rename from jansson/test/suites/invalid/unicode-identifier/input rename to src/jansson/test/suites/invalid/unicode-identifier/input diff --git a/jansson/test/suites/invalid/unterminated-array-and-object/error.normal b/src/jansson/test/suites/invalid/unterminated-array-and-object/error.normal similarity index 100% rename from jansson/test/suites/invalid/unterminated-array-and-object/error.normal rename to src/jansson/test/suites/invalid/unterminated-array-and-object/error.normal diff --git a/jansson/test/suites/invalid/unterminated-array-and-object/error.strip b/src/jansson/test/suites/invalid/unterminated-array-and-object/error.strip similarity index 100% rename from jansson/test/suites/invalid/unterminated-array-and-object/error.strip rename to src/jansson/test/suites/invalid/unterminated-array-and-object/error.strip diff --git a/jansson/test/suites/invalid/unterminated-array-and-object/input b/src/jansson/test/suites/invalid/unterminated-array-and-object/input similarity index 100% rename from jansson/test/suites/invalid/unterminated-array-and-object/input rename to src/jansson/test/suites/invalid/unterminated-array-and-object/input diff --git a/jansson/test/suites/invalid/unterminated-array/error.normal b/src/jansson/test/suites/invalid/unterminated-array/error.normal similarity index 100% rename from jansson/test/suites/invalid/unterminated-array/error.normal rename to src/jansson/test/suites/invalid/unterminated-array/error.normal diff --git a/jansson/test/suites/invalid/unterminated-array/error.strip b/src/jansson/test/suites/invalid/unterminated-array/error.strip similarity index 100% rename from jansson/test/suites/invalid/unterminated-array/error.strip rename to src/jansson/test/suites/invalid/unterminated-array/error.strip diff --git a/jansson/test/suites/invalid/unterminated-array/input b/src/jansson/test/suites/invalid/unterminated-array/input similarity index 100% rename from jansson/test/suites/invalid/unterminated-array/input rename to src/jansson/test/suites/invalid/unterminated-array/input diff --git a/jansson/test/suites/invalid/unterminated-empty-key/error.normal b/src/jansson/test/suites/invalid/unterminated-empty-key/error.normal similarity index 100% rename from jansson/test/suites/invalid/unterminated-empty-key/error.normal rename to src/jansson/test/suites/invalid/unterminated-empty-key/error.normal diff --git a/jansson/test/suites/invalid/unterminated-empty-key/error.strip b/src/jansson/test/suites/invalid/unterminated-empty-key/error.strip similarity index 100% rename from jansson/test/suites/invalid/unterminated-empty-key/error.strip rename to src/jansson/test/suites/invalid/unterminated-empty-key/error.strip diff --git a/jansson/test/suites/invalid/unterminated-empty-key/input b/src/jansson/test/suites/invalid/unterminated-empty-key/input similarity index 100% rename from jansson/test/suites/invalid/unterminated-empty-key/input rename to src/jansson/test/suites/invalid/unterminated-empty-key/input diff --git a/jansson/test/suites/invalid/unterminated-key/error.normal b/src/jansson/test/suites/invalid/unterminated-key/error.normal similarity index 100% rename from jansson/test/suites/invalid/unterminated-key/error.normal rename to src/jansson/test/suites/invalid/unterminated-key/error.normal diff --git a/jansson/test/suites/invalid/unterminated-key/error.strip b/src/jansson/test/suites/invalid/unterminated-key/error.strip similarity index 100% rename from jansson/test/suites/invalid/unterminated-key/error.strip rename to src/jansson/test/suites/invalid/unterminated-key/error.strip diff --git a/jansson/test/suites/invalid/unterminated-key/input b/src/jansson/test/suites/invalid/unterminated-key/input similarity index 100% rename from jansson/test/suites/invalid/unterminated-key/input rename to src/jansson/test/suites/invalid/unterminated-key/input diff --git a/jansson/test/suites/invalid/unterminated-object-and-array/error b/src/jansson/test/suites/invalid/unterminated-object-and-array/error similarity index 100% rename from jansson/test/suites/invalid/unterminated-object-and-array/error rename to src/jansson/test/suites/invalid/unterminated-object-and-array/error diff --git a/jansson/test/suites/invalid/unterminated-object-and-array/input b/src/jansson/test/suites/invalid/unterminated-object-and-array/input similarity index 100% rename from jansson/test/suites/invalid/unterminated-object-and-array/input rename to src/jansson/test/suites/invalid/unterminated-object-and-array/input diff --git a/jansson/test/suites/invalid/unterminated-string/error.normal b/src/jansson/test/suites/invalid/unterminated-string/error.normal similarity index 100% rename from jansson/test/suites/invalid/unterminated-string/error.normal rename to src/jansson/test/suites/invalid/unterminated-string/error.normal diff --git a/jansson/test/suites/invalid/unterminated-string/error.strip b/src/jansson/test/suites/invalid/unterminated-string/error.strip similarity index 100% rename from jansson/test/suites/invalid/unterminated-string/error.strip rename to src/jansson/test/suites/invalid/unterminated-string/error.strip diff --git a/jansson/test/suites/invalid/unterminated-string/input b/src/jansson/test/suites/invalid/unterminated-string/input similarity index 100% rename from jansson/test/suites/invalid/unterminated-string/input rename to src/jansson/test/suites/invalid/unterminated-string/input diff --git a/jansson/test/suites/valid/complex-array/env b/src/jansson/test/suites/valid/complex-array/env similarity index 100% rename from jansson/test/suites/valid/complex-array/env rename to src/jansson/test/suites/valid/complex-array/env diff --git a/jansson/test/suites/valid/complex-array/input b/src/jansson/test/suites/valid/complex-array/input similarity index 100% rename from jansson/test/suites/valid/complex-array/input rename to src/jansson/test/suites/valid/complex-array/input diff --git a/jansson/test/suites/valid/complex-array/output b/src/jansson/test/suites/valid/complex-array/output similarity index 100% rename from jansson/test/suites/valid/complex-array/output rename to src/jansson/test/suites/valid/complex-array/output diff --git a/jansson/test/suites/valid/empty-array/input b/src/jansson/test/suites/valid/empty-array/input similarity index 100% rename from jansson/test/suites/valid/empty-array/input rename to src/jansson/test/suites/valid/empty-array/input diff --git a/jansson/test/suites/valid/empty-array/output b/src/jansson/test/suites/valid/empty-array/output similarity index 100% rename from jansson/test/suites/valid/empty-array/output rename to src/jansson/test/suites/valid/empty-array/output diff --git a/jansson/test/suites/valid/empty-object-in-array/input b/src/jansson/test/suites/valid/empty-object-in-array/input similarity index 100% rename from jansson/test/suites/valid/empty-object-in-array/input rename to src/jansson/test/suites/valid/empty-object-in-array/input diff --git a/jansson/test/suites/valid/empty-object-in-array/output b/src/jansson/test/suites/valid/empty-object-in-array/output similarity index 100% rename from jansson/test/suites/valid/empty-object-in-array/output rename to src/jansson/test/suites/valid/empty-object-in-array/output diff --git a/jansson/test/suites/valid/empty-object/input b/src/jansson/test/suites/valid/empty-object/input similarity index 100% rename from jansson/test/suites/valid/empty-object/input rename to src/jansson/test/suites/valid/empty-object/input diff --git a/jansson/test/suites/valid/empty-object/output b/src/jansson/test/suites/valid/empty-object/output similarity index 100% rename from jansson/test/suites/valid/empty-object/output rename to src/jansson/test/suites/valid/empty-object/output diff --git a/jansson/test/suites/valid/empty-string/input b/src/jansson/test/suites/valid/empty-string/input similarity index 100% rename from jansson/test/suites/valid/empty-string/input rename to src/jansson/test/suites/valid/empty-string/input diff --git a/jansson/test/suites/valid/empty-string/output b/src/jansson/test/suites/valid/empty-string/output similarity index 100% rename from jansson/test/suites/valid/empty-string/output rename to src/jansson/test/suites/valid/empty-string/output diff --git a/jansson/test/suites/valid/escaped-utf-control-char/input b/src/jansson/test/suites/valid/escaped-utf-control-char/input similarity index 100% rename from jansson/test/suites/valid/escaped-utf-control-char/input rename to src/jansson/test/suites/valid/escaped-utf-control-char/input diff --git a/jansson/test/suites/valid/escaped-utf-control-char/output b/src/jansson/test/suites/valid/escaped-utf-control-char/output similarity index 100% rename from jansson/test/suites/valid/escaped-utf-control-char/output rename to src/jansson/test/suites/valid/escaped-utf-control-char/output diff --git a/jansson/test/suites/valid/false/input b/src/jansson/test/suites/valid/false/input similarity index 100% rename from jansson/test/suites/valid/false/input rename to src/jansson/test/suites/valid/false/input diff --git a/jansson/test/suites/valid/false/output b/src/jansson/test/suites/valid/false/output similarity index 100% rename from jansson/test/suites/valid/false/output rename to src/jansson/test/suites/valid/false/output diff --git a/jansson/test/suites/valid/negative-int/input b/src/jansson/test/suites/valid/negative-int/input similarity index 100% rename from jansson/test/suites/valid/negative-int/input rename to src/jansson/test/suites/valid/negative-int/input diff --git a/jansson/test/suites/valid/negative-int/output b/src/jansson/test/suites/valid/negative-int/output similarity index 100% rename from jansson/test/suites/valid/negative-int/output rename to src/jansson/test/suites/valid/negative-int/output diff --git a/jansson/test/suites/valid/negative-one/input b/src/jansson/test/suites/valid/negative-one/input similarity index 100% rename from jansson/test/suites/valid/negative-one/input rename to src/jansson/test/suites/valid/negative-one/input diff --git a/jansson/test/suites/valid/negative-one/output b/src/jansson/test/suites/valid/negative-one/output similarity index 100% rename from jansson/test/suites/valid/negative-one/output rename to src/jansson/test/suites/valid/negative-one/output diff --git a/jansson/test/suites/valid/negative-zero/input b/src/jansson/test/suites/valid/negative-zero/input similarity index 100% rename from jansson/test/suites/valid/negative-zero/input rename to src/jansson/test/suites/valid/negative-zero/input diff --git a/jansson/test/suites/valid/negative-zero/output b/src/jansson/test/suites/valid/negative-zero/output similarity index 100% rename from jansson/test/suites/valid/negative-zero/output rename to src/jansson/test/suites/valid/negative-zero/output diff --git a/jansson/test/suites/valid/null/input b/src/jansson/test/suites/valid/null/input similarity index 100% rename from jansson/test/suites/valid/null/input rename to src/jansson/test/suites/valid/null/input diff --git a/jansson/test/suites/valid/null/output b/src/jansson/test/suites/valid/null/output similarity index 100% rename from jansson/test/suites/valid/null/output rename to src/jansson/test/suites/valid/null/output diff --git a/jansson/test/suites/valid/one-byte-utf-8/input b/src/jansson/test/suites/valid/one-byte-utf-8/input similarity index 100% rename from jansson/test/suites/valid/one-byte-utf-8/input rename to src/jansson/test/suites/valid/one-byte-utf-8/input diff --git a/jansson/test/suites/valid/one-byte-utf-8/output b/src/jansson/test/suites/valid/one-byte-utf-8/output similarity index 100% rename from jansson/test/suites/valid/one-byte-utf-8/output rename to src/jansson/test/suites/valid/one-byte-utf-8/output diff --git a/jansson/test/suites/valid/real-capital-e-negative-exponent/input b/src/jansson/test/suites/valid/real-capital-e-negative-exponent/input similarity index 100% rename from jansson/test/suites/valid/real-capital-e-negative-exponent/input rename to src/jansson/test/suites/valid/real-capital-e-negative-exponent/input diff --git a/jansson/test/suites/valid/real-capital-e-negative-exponent/output b/src/jansson/test/suites/valid/real-capital-e-negative-exponent/output similarity index 100% rename from jansson/test/suites/valid/real-capital-e-negative-exponent/output rename to src/jansson/test/suites/valid/real-capital-e-negative-exponent/output diff --git a/jansson/test/suites/valid/real-capital-e-positive-exponent/input b/src/jansson/test/suites/valid/real-capital-e-positive-exponent/input similarity index 100% rename from jansson/test/suites/valid/real-capital-e-positive-exponent/input rename to src/jansson/test/suites/valid/real-capital-e-positive-exponent/input diff --git a/jansson/test/suites/valid/real-capital-e-positive-exponent/output b/src/jansson/test/suites/valid/real-capital-e-positive-exponent/output similarity index 100% rename from jansson/test/suites/valid/real-capital-e-positive-exponent/output rename to src/jansson/test/suites/valid/real-capital-e-positive-exponent/output diff --git a/jansson/test/suites/valid/real-capital-e/input b/src/jansson/test/suites/valid/real-capital-e/input similarity index 100% rename from jansson/test/suites/valid/real-capital-e/input rename to src/jansson/test/suites/valid/real-capital-e/input diff --git a/jansson/test/suites/valid/real-capital-e/output b/src/jansson/test/suites/valid/real-capital-e/output similarity index 100% rename from jansson/test/suites/valid/real-capital-e/output rename to src/jansson/test/suites/valid/real-capital-e/output diff --git a/jansson/test/suites/valid/real-exponent/input b/src/jansson/test/suites/valid/real-exponent/input similarity index 100% rename from jansson/test/suites/valid/real-exponent/input rename to src/jansson/test/suites/valid/real-exponent/input diff --git a/jansson/test/suites/valid/real-exponent/output b/src/jansson/test/suites/valid/real-exponent/output similarity index 100% rename from jansson/test/suites/valid/real-exponent/output rename to src/jansson/test/suites/valid/real-exponent/output diff --git a/jansson/test/suites/valid/real-fraction-exponent/input b/src/jansson/test/suites/valid/real-fraction-exponent/input similarity index 100% rename from jansson/test/suites/valid/real-fraction-exponent/input rename to src/jansson/test/suites/valid/real-fraction-exponent/input diff --git a/jansson/test/suites/valid/real-fraction-exponent/output b/src/jansson/test/suites/valid/real-fraction-exponent/output similarity index 100% rename from jansson/test/suites/valid/real-fraction-exponent/output rename to src/jansson/test/suites/valid/real-fraction-exponent/output diff --git a/jansson/test/suites/valid/real-negative-exponent/input b/src/jansson/test/suites/valid/real-negative-exponent/input similarity index 100% rename from jansson/test/suites/valid/real-negative-exponent/input rename to src/jansson/test/suites/valid/real-negative-exponent/input diff --git a/jansson/test/suites/valid/real-negative-exponent/output b/src/jansson/test/suites/valid/real-negative-exponent/output similarity index 100% rename from jansson/test/suites/valid/real-negative-exponent/output rename to src/jansson/test/suites/valid/real-negative-exponent/output diff --git a/jansson/test/suites/valid/real-positive-exponent/input b/src/jansson/test/suites/valid/real-positive-exponent/input similarity index 100% rename from jansson/test/suites/valid/real-positive-exponent/input rename to src/jansson/test/suites/valid/real-positive-exponent/input diff --git a/jansson/test/suites/valid/real-positive-exponent/output b/src/jansson/test/suites/valid/real-positive-exponent/output similarity index 100% rename from jansson/test/suites/valid/real-positive-exponent/output rename to src/jansson/test/suites/valid/real-positive-exponent/output diff --git a/jansson/test/suites/valid/real-underflow/input b/src/jansson/test/suites/valid/real-underflow/input similarity index 100% rename from jansson/test/suites/valid/real-underflow/input rename to src/jansson/test/suites/valid/real-underflow/input diff --git a/jansson/test/suites/valid/real-underflow/output b/src/jansson/test/suites/valid/real-underflow/output similarity index 100% rename from jansson/test/suites/valid/real-underflow/output rename to src/jansson/test/suites/valid/real-underflow/output diff --git a/jansson/test/suites/valid/run b/src/jansson/test/suites/valid/run similarity index 100% rename from jansson/test/suites/valid/run rename to src/jansson/test/suites/valid/run diff --git a/jansson/test/suites/valid/short-string/input b/src/jansson/test/suites/valid/short-string/input similarity index 100% rename from jansson/test/suites/valid/short-string/input rename to src/jansson/test/suites/valid/short-string/input diff --git a/jansson/test/suites/valid/short-string/output b/src/jansson/test/suites/valid/short-string/output similarity index 100% rename from jansson/test/suites/valid/short-string/output rename to src/jansson/test/suites/valid/short-string/output diff --git a/jansson/test/suites/valid/simple-ascii-string/input b/src/jansson/test/suites/valid/simple-ascii-string/input similarity index 100% rename from jansson/test/suites/valid/simple-ascii-string/input rename to src/jansson/test/suites/valid/simple-ascii-string/input diff --git a/jansson/test/suites/valid/simple-ascii-string/output b/src/jansson/test/suites/valid/simple-ascii-string/output similarity index 100% rename from jansson/test/suites/valid/simple-ascii-string/output rename to src/jansson/test/suites/valid/simple-ascii-string/output diff --git a/jansson/test/suites/valid/simple-int-0/input b/src/jansson/test/suites/valid/simple-int-0/input similarity index 100% rename from jansson/test/suites/valid/simple-int-0/input rename to src/jansson/test/suites/valid/simple-int-0/input diff --git a/jansson/test/suites/valid/simple-int-0/output b/src/jansson/test/suites/valid/simple-int-0/output similarity index 100% rename from jansson/test/suites/valid/simple-int-0/output rename to src/jansson/test/suites/valid/simple-int-0/output diff --git a/jansson/test/suites/valid/simple-int-1/input b/src/jansson/test/suites/valid/simple-int-1/input similarity index 100% rename from jansson/test/suites/valid/simple-int-1/input rename to src/jansson/test/suites/valid/simple-int-1/input diff --git a/jansson/test/suites/valid/simple-int-1/output b/src/jansson/test/suites/valid/simple-int-1/output similarity index 100% rename from jansson/test/suites/valid/simple-int-1/output rename to src/jansson/test/suites/valid/simple-int-1/output diff --git a/jansson/test/suites/valid/simple-int-123/input b/src/jansson/test/suites/valid/simple-int-123/input similarity index 100% rename from jansson/test/suites/valid/simple-int-123/input rename to src/jansson/test/suites/valid/simple-int-123/input diff --git a/jansson/test/suites/valid/simple-int-123/output b/src/jansson/test/suites/valid/simple-int-123/output similarity index 100% rename from jansson/test/suites/valid/simple-int-123/output rename to src/jansson/test/suites/valid/simple-int-123/output diff --git a/jansson/test/suites/valid/simple-object/input b/src/jansson/test/suites/valid/simple-object/input similarity index 100% rename from jansson/test/suites/valid/simple-object/input rename to src/jansson/test/suites/valid/simple-object/input diff --git a/jansson/test/suites/valid/simple-object/output b/src/jansson/test/suites/valid/simple-object/output similarity index 100% rename from jansson/test/suites/valid/simple-object/output rename to src/jansson/test/suites/valid/simple-object/output diff --git a/jansson/test/suites/valid/simple-real/input b/src/jansson/test/suites/valid/simple-real/input similarity index 100% rename from jansson/test/suites/valid/simple-real/input rename to src/jansson/test/suites/valid/simple-real/input diff --git a/jansson/test/suites/valid/simple-real/output b/src/jansson/test/suites/valid/simple-real/output similarity index 100% rename from jansson/test/suites/valid/simple-real/output rename to src/jansson/test/suites/valid/simple-real/output diff --git a/jansson/test/suites/valid/string-escapes/input b/src/jansson/test/suites/valid/string-escapes/input similarity index 100% rename from jansson/test/suites/valid/string-escapes/input rename to src/jansson/test/suites/valid/string-escapes/input diff --git a/jansson/test/suites/valid/string-escapes/output b/src/jansson/test/suites/valid/string-escapes/output similarity index 100% rename from jansson/test/suites/valid/string-escapes/output rename to src/jansson/test/suites/valid/string-escapes/output diff --git a/jansson/test/suites/valid/three-byte-utf-8/input b/src/jansson/test/suites/valid/three-byte-utf-8/input similarity index 100% rename from jansson/test/suites/valid/three-byte-utf-8/input rename to src/jansson/test/suites/valid/three-byte-utf-8/input diff --git a/jansson/test/suites/valid/three-byte-utf-8/output b/src/jansson/test/suites/valid/three-byte-utf-8/output similarity index 100% rename from jansson/test/suites/valid/three-byte-utf-8/output rename to src/jansson/test/suites/valid/three-byte-utf-8/output diff --git a/jansson/test/suites/valid/true/input b/src/jansson/test/suites/valid/true/input similarity index 100% rename from jansson/test/suites/valid/true/input rename to src/jansson/test/suites/valid/true/input diff --git a/jansson/test/suites/valid/true/output b/src/jansson/test/suites/valid/true/output similarity index 100% rename from jansson/test/suites/valid/true/output rename to src/jansson/test/suites/valid/true/output diff --git a/jansson/test/suites/valid/two-byte-utf-8/input b/src/jansson/test/suites/valid/two-byte-utf-8/input similarity index 100% rename from jansson/test/suites/valid/two-byte-utf-8/input rename to src/jansson/test/suites/valid/two-byte-utf-8/input diff --git a/jansson/test/suites/valid/two-byte-utf-8/output b/src/jansson/test/suites/valid/two-byte-utf-8/output similarity index 100% rename from jansson/test/suites/valid/two-byte-utf-8/output rename to src/jansson/test/suites/valid/two-byte-utf-8/output diff --git a/jansson/test/suites/valid/utf-8-string/input b/src/jansson/test/suites/valid/utf-8-string/input similarity index 100% rename from jansson/test/suites/valid/utf-8-string/input rename to src/jansson/test/suites/valid/utf-8-string/input diff --git a/jansson/test/suites/valid/utf-8-string/output b/src/jansson/test/suites/valid/utf-8-string/output similarity index 100% rename from jansson/test/suites/valid/utf-8-string/output rename to src/jansson/test/suites/valid/utf-8-string/output diff --git a/jansson/test/suites/valid/utf-surrogate-four-byte-encoding/input b/src/jansson/test/suites/valid/utf-surrogate-four-byte-encoding/input similarity index 100% rename from jansson/test/suites/valid/utf-surrogate-four-byte-encoding/input rename to src/jansson/test/suites/valid/utf-surrogate-four-byte-encoding/input diff --git a/jansson/test/suites/valid/utf-surrogate-four-byte-encoding/output b/src/jansson/test/suites/valid/utf-surrogate-four-byte-encoding/output similarity index 100% rename from jansson/test/suites/valid/utf-surrogate-four-byte-encoding/output rename to src/jansson/test/suites/valid/utf-surrogate-four-byte-encoding/output diff --git a/jansson/win32/jansson_config.h b/src/jansson/win32/jansson_config.h similarity index 100% rename from jansson/win32/jansson_config.h rename to src/jansson/win32/jansson_config.h diff --git a/jansson/win32/vs2010/jansson.sln b/src/jansson/win32/vs2010/jansson.sln similarity index 100% rename from jansson/win32/vs2010/jansson.sln rename to src/jansson/win32/vs2010/jansson.sln diff --git a/jansson/win32/vs2010/jansson.vcxproj b/src/jansson/win32/vs2010/jansson.vcxproj similarity index 100% rename from jansson/win32/vs2010/jansson.vcxproj rename to src/jansson/win32/vs2010/jansson.vcxproj diff --git a/jansson/win32/vs2010/jansson.vcxproj.filters b/src/jansson/win32/vs2010/jansson.vcxproj.filters similarity index 100% rename from jansson/win32/vs2010/jansson.vcxproj.filters rename to src/jansson/win32/vs2010/jansson.vcxproj.filters diff --git a/jansson/win32/vs2010/jansson.vcxproj.user b/src/jansson/win32/vs2010/jansson.vcxproj.user similarity index 100% rename from jansson/win32/vs2010/jansson.vcxproj.user rename to src/jansson/win32/vs2010/jansson.vcxproj.user diff --git a/sdk/smsdk_config.h b/src/smsdk_config.h similarity index 100% rename from sdk/smsdk_config.h rename to src/smsdk_config.h diff --git a/sdk/smsdk_ext.cpp b/src/smsdk_ext.cpp similarity index 100% rename from sdk/smsdk_ext.cpp rename to src/smsdk_ext.cpp diff --git a/sdk/smsdk_ext.h b/src/smsdk_ext.h similarity index 100% rename from sdk/smsdk_ext.h rename to src/smsdk_ext.h diff --git a/version.rc b/src/version.rc similarity index 95% rename from version.rc rename to src/version.rc index d45a0c7..ebe6e15 100644 --- a/version.rc +++ b/src/version.rc @@ -1,103 +1,103 @@ -// Microsoft Visual C++ generated resource script. -// -//#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -#include - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION SM_VERSION_FILE - PRODUCTVERSION SM_VERSION_FILE - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "000004b0" - BEGIN - VALUE "Comments", "SourceMod Extension" - VALUE "FileDescription", "SourceMod Extension" - VALUE "FileVersion", SM_VERSION_STRING - VALUE "InternalName", "SourceMod Extension" - VALUE "LegalCopyright", "Copyright (c) 2004-2022, AlliedModders LLC" - VALUE "OriginalFilename", BINARY_NAME - VALUE "ProductName", "SourceMod Extension" - VALUE "ProductVersion", SM_VERSION_STRING - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0, 1200 - END -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED +// Microsoft Visual C++ generated resource script. +// +//#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION SM_VERSION_FILE + PRODUCTVERSION SM_VERSION_FILE + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "SourceMod Extension" + VALUE "FileDescription", "SourceMod Extension" + VALUE "FileVersion", SM_VERSION_STRING + VALUE "InternalName", "SourceMod Extension" + VALUE "LegalCopyright", "Copyright (c) 2004-2022, AlliedModders LLC" + VALUE "OriginalFilename", BINARY_NAME + VALUE "ProductName", "SourceMod Extension" + VALUE "ProductVersion", SM_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED From 9c127f548984e38145286dffee5dce74d98b43a6 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:31:31 +0300 Subject: [PATCH 04/17] Update ci.yml --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 60a7aee..8bcecf3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,7 @@ on: branches: - master - main + workflow_dispatch: jobs: build-libuv-linux: From 4868c5bff0c7aea6cdf47065e351fc957cbfcb3c Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:32:33 +0300 Subject: [PATCH 05/17] Update ci.yml --- .github/workflows/ci.yml | 59 ---------------------------------------- 1 file changed, 59 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8bcecf3..3ad24e8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,65 +14,6 @@ on: workflow_dispatch: jobs: - build-libuv-linux: - runs-on: ubuntu-24.04 - env: - CC: "clang-14" - CXX: "clang++-14" - steps: - - name: Checkout repository with submodules - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install Linux dependencies - run: | - sudo dpkg --add-architecture i386 - sudo apt-get update - sudo apt-get install -y --no-install-recommends \ - gcc-multilib g++-multilib libstdc++6 lib32stdc++6 \ - libc6-dev libc6-dev-i386 linux-libc-dev \ - linux-libc-dev:i386 lib32z1-dev ${{ env.CC }} - - - name: Build and install libuv (Linux x86) - working-directory: libuv - run: | - bash autogen.sh - ./configure --prefix="$(pwd)/dist" --build=i686-pc-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" --disable-shared --enable-static - make -j8 - make install - - - name: Upload libuv Linux Artifact - uses: actions/upload-artifact@v4 - with: - name: libuv-linux - path: libuv/dist - retention-days: 1 - - build-libuv-windows: - runs-on: windows-2022 - steps: - - name: Checkout repository with submodules - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Build and install libuv (Windows x86) - shell: cmd - working-directory: libuv - run: | - mkdir build - cd build - cmake .. -A Win32 -DBUILD_TESTING=OFF -DLIBUV_BUILD_SHARED=OFF -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$:Debug>" -DCMAKE_INSTALL_PREFIX=..\dist - cmake --build . --config Release --target install - - - name: Upload libuv Windows Artifact - uses: actions/upload-artifact@v4 - with: - name: libuv-windows - path: libuv/dist - retention-days: 1 - build-release-extension: uses: srcdslab/ci-workflows/.github/workflows/shared_build_release_am_extension.yml@v1 needs: [build-libuv-linux, build-libuv-windows] From cf38663ae0e032386db85bf9443a0e14f8121429 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:33:12 +0300 Subject: [PATCH 06/17] Update ci.yml --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3ad24e8..bae9038 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,6 @@ on: jobs: build-release-extension: uses: srcdslab/ci-workflows/.github/workflows/shared_build_release_am_extension.yml@v1 - needs: [build-libuv-linux, build-libuv-windows] with: sdks: "sdk2013" artifact-path: "libuv/dist" From 5b919511f45edf92b874b4f9ced0ddcdf1345c58 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:37:16 +0300 Subject: [PATCH 07/17] Update AMBuilder --- src/AMBuilder | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/AMBuilder b/src/AMBuilder index 7394d2e..42dbe39 100644 --- a/src/AMBuilder +++ b/src/AMBuilder @@ -5,9 +5,13 @@ projectName = 'smjansson' project = builder.LibraryProject(projectName) -# Extension source files, embedded Jansson source, and SourceMod SDK sources +# Extension source files (adjust 'src/extension.cpp' if it lives at root) +ext_source = os.path.join(Extension.ext_root, 'src', 'extension.cpp') +if not os.path.exists(ext_source): + ext_source = os.path.join(Extension.ext_root, 'extension.cpp') + project.sources += [ - os.path.join(Extension.ext_root, 'extension.cpp'), + ext_source, os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'dump.c'), os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'error.c'), os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'hashtable.c'), @@ -29,8 +33,11 @@ project.sources += [ os.path.join(Extension.sm_root, 'public', 'libudis86', 'udis86.c'), ] -# Include header directories -jansson_inc = os.path.join(Extension.ext_root, 'src', 'jansson', 'src') +# Include paths for Jansson headers and jansson_config.h +jansson_inc = [ + os.path.join(Extension.ext_root, 'src', 'jansson', 'src'), + os.path.join(Extension.ext_root, 'src', 'jansson'), +] for sdk_name in Extension.sdks: sdk = Extension.sdks[sdk_name] @@ -46,7 +53,7 @@ for sdk_name in Extension.sdks: ) # Include Jansson headers - binary.compiler.cxxincludes += [jansson_inc] + binary.compiler.cxxincludes += jansson_inc # Defines required for Jansson and SourceMod SDK binary.compiler.defines += [ From 93c15458e5a4f6b00805a64b7c1e32ef8701b8a2 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:40:22 +0300 Subject: [PATCH 08/17] please --- Makefile | 200 ------------------------------------------------ PackageScript | 57 -------------- configure.py | 41 ---------- product.version | 1 + 4 files changed, 1 insertion(+), 298 deletions(-) delete mode 100644 Makefile delete mode 100644 PackageScript delete mode 100644 configure.py create mode 100644 product.version diff --git a/Makefile b/Makefile deleted file mode 100644 index 7a75367..0000000 --- a/Makefile +++ /dev/null @@ -1,200 +0,0 @@ -# (C)2004-2012 SourceMod Development Team - -########################################### -### EDIT THESE PATHS FOR YOUR OWN SETUP ### -########################################### - -SDKBASE = ../../forbuild/ -JANSSON = ./jansson-2.3.1/src/ - -SMSDK = $(SDKBASE)sourcemod-central -HL2SDK_ORIG = $(SDKBASE)hl2sdk -HL2SDK_OB = $(SDKBASE)hl2sdk-ob -HL2SDK_OB_VALVE = $(SDKBASE)hl2sdk-ob-valve -HL2SDK_L4D = $(SDKBASE)hl2sdk-l4d -HL2SDK_L4D2 = $(SDKBASE)hl2sdk-l4d2 -MMSOURCE18 = $(SDKBASE)mmsource-1.8 - -##################################### -### EDIT BELOW FOR OTHER PROJECTS ### -##################################### - -PROJECT = smjansson - -#Uncomment for Metamod: Source enabled extension -#USEMETA = true - -OBJECTS = sdk/smsdk_ext.cpp extension.cpp \ - $(JANSSON)dump.c \ - $(JANSSON)error.c \ - $(JANSSON)hashtable.c \ - $(JANSSON)load.c \ - $(JANSSON)memory.c \ - $(JANSSON)pack_unpack.c \ - $(JANSSON)strbuffer.c \ - $(JANSSON)strconv.c \ - $(JANSSON)utf.c \ - $(JANSSON)value.c - - -############################################## -### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### -############################################## - -C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -pipe -fno-strict-aliasing -C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 -C_GCC4_FLAGS = -fvisibility=hidden -CPP_GCC4_FLAGS = -fvisibility-inlines-hidden -CPP = gcc - -########################## -### SDK CONFIGURATIONS ### -########################## - -override ENGSET = false - -# Check for valid list of engines -ifneq (,$(filter original orangebox orangeboxvalve left4dead left4dead2,$(ENGINE))) - override ENGSET = true -endif - -ifeq "$(ENGINE)" "original" - HL2SDK = $(HL2SDK_ORIG) - CFLAGS += -DSOURCE_ENGINE=1 -endif -ifeq "$(ENGINE)" "orangebox" - HL2SDK = $(HL2SDK_OB) - CFLAGS += -DSOURCE_ENGINE=3 -endif -ifeq "$(ENGINE)" "orangeboxvalve" - HL2SDK = $(HL2SDK_OB_VALVE) - CFLAGS += -DSOURCE_ENGINE=6 -endif -ifeq "$(ENGINE)" "left4dead" - HL2SDK = $(HL2SDK_L4D) - CFLAGS += -DSOURCE_ENGINE=7 -endif -ifeq "$(ENGINE)" "left4dead2" - HL2SDK = $(HL2SDK_L4D2) - CFLAGS += -DSOURCE_ENGINE=8 -endif - -HL2PUB = $(HL2SDK)/public - -ifeq "$(ENGINE)" "original" - INCLUDE += -I$(HL2SDK)/public/dlls - METAMOD = $(MMSOURCE18)/core-legacy -else - INCLUDE += -I$(HL2SDK)/public/game/server - METAMOD = $(MMSOURCE18)/core -endif - -OS := $(shell uname -s) - -ifeq "$(OS)" "Darwin" - LIB_EXT = dylib - HL2LIB = $(HL2SDK)/lib/mac -else - LIB_EXT = so - ifeq "$(ENGINE)" "original" - HL2LIB = $(HL2SDK)/linux_sdk - else - HL2LIB = $(HL2SDK)/lib/linux - endif -endif - -# if ENGINE is original or OB -ifneq (,$(filter original orangebox,$(ENGINE))) - LIB_SUFFIX = _i486.$(LIB_EXT) -else - LIB_PREFIX = lib - LIB_SUFFIX = .$(LIB_EXT) -endif - -INCLUDE += -I. -I.. -Isdk -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn -I$(JANSSON) - -ifeq "$(USEMETA)" "true" - LINK_HL2 = $(HL2LIB)/tier1_i486.a $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) $(LIB_PREFIX)tier0$(LIB_SUFFIX) - - LINK += $(LINK_HL2) - - INCLUDE += -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 -I$(METAMOD) \ - -I$(METAMOD)/sourcehook - CFLAGS += -DSE_EPISODEONE=1 -DSE_DARKMESSIAH=2 -DSE_ORANGEBOX=3 -DSE_BLOODYGOODTIME=4 -DSE_EYE=5 \ - -DSE_ORANGEBOXVALVE=6 -DSE_LEFT4DEAD=7 -DSE_LEFT4DEAD2=8 -DSE_ALIENSWARM=9 -endif - -LINK += -m32 -lm -ldl - -CFLAGS += -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp \ - -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Werror \ - -Wno-switch -Wno-unused -mfpmath=sse -msse -DSOURCEMOD_BUILD -DHAVE_STDINT_H -m32 -CPPFLAGS += -Wno-non-virtual-dtor -fno-exceptions -fno-rtti - -################################################ -### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### -################################################ - -BINARY = $(PROJECT).ext.$(LIB_EXT) - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS += $(C_DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS += $(C_OPT_FLAGS) -endif - -ifeq "$(USEMETA)" "true" - BIN_DIR := $(BIN_DIR).$(ENGINE) -endif - -ifeq "$(OS)" "Darwin" - LIB_EXT = dylib - CFLAGS += -isysroot /Developer/SDKs/MacOSX10.5.sdk - LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 -else - LIB_EXT = so - CFLAGS += -D_LINUX - LINK += -shared -endif - -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(C_GCC4_FLAGS) - CPPFLAGS += $(CPP_GCC4_FLAGS) -endif - -OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< - -all: check - mkdir -p $(BIN_DIR)/sdk - if [ "$(USEMETA)" = "true" ]; then \ - ln -sf $(HL2LIB)/$(LIB_PREFIX)vstdlib$(LIB_SUFFIX); \ - ln -sf $(HL2LIB)/$(LIB_PREFIX)tier0$(LIB_SUFFIX); \ - fi - $(MAKE) -f Makefile extension - -check: - if [ "$(USEMETA)" = "true" ] && [ "$(ENGSET)" = "false" ]; then \ - echo "You must supply one of the following values for ENGINE:"; \ - echo "left4dead2, left4dead, orangeboxvalve, orangebox, or original"; \ - exit 1; \ - fi - -extension: check $(OBJ_BIN) - $(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) -f Makefile all DEBUG=true - -default: all - -clean: check - rm -rf $(BIN_DIR)/*.o - rm -rf $(BIN_DIR)/sdk/*.o - rm -rf $(BIN_DIR)/$(BINARY) - diff --git a/PackageScript b/PackageScript deleted file mode 100644 index eb96631..0000000 --- a/PackageScript +++ /dev/null @@ -1,57 +0,0 @@ -# vim: set ts=8 sts=2 sw=2 tw=99 et ft=python: -import os - -# This is where the files will be output to -# package is the default -builder.SetBuildFolder('package') - -# Add any folders you need to this list -folder_list = [ - 'addons/sourcemod/extensions', - 'addons/sourcemod/scripting/include', - 'addons/sourcemod/scripting', -] - -if 'x86_64' in SM.target_archs: - folder_list.extend([ - 'addons/sourcemod/extensions/x64', - ]) - -# Create the distribution folder hierarchy. -folder_map = {} -for folder in folder_list: - norm_folder = os.path.normpath(folder) - folder_map[folder] = builder.AddFolder(norm_folder) - -# Copy binaries. -for cxx_task in SM.extensions: - if cxx_task.target.arch == 'x86_64': - builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions/x64']) - else: - builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions']) - -# Do all straight-up file copies from the source tree. -def CopyFiles(src, dest, files): - if not dest: - dest = src - dest_entry = folder_map[dest] - for source_file in files: - source_path = os.path.join(builder.sourcePath, src, source_file) - dest_path = os.path.join(dest_entry.path, source_file) - if not os.path.isfile(str(dest_path)): - builder.AddCopy(source_path, dest_entry) - -# Sourcemod Files -CopyFiles('pawn/scripting', 'addons/sourcemod/scripting', - [ - 'smjansson.test.sp' - ] -) - -# Include Files -CopyFiles('pawn/scripting/include', 'addons/sourcemod/scripting/include', - [ - 'smjansson.inc', - 'test.inc' - ] -) diff --git a/configure.py b/configure.py deleted file mode 100644 index 6fb4c78..0000000 --- a/configure.py +++ /dev/null @@ -1,41 +0,0 @@ -# vim: set ts=2 sw=2 tw=99 noet: -import sys -try: - from ambuild2 import run, util -except: - try: - import ambuild - sys.stderr.write('It looks like you have AMBuild 1 installed, but this project uses AMBuild 2.\n') - sys.stderr.write('Upgrade to the latest version of AMBuild to continue.\n') - except: - sys.stderr.write('AMBuild must be installed to build this project.\n') - sys.stderr.write('http://www.alliedmods.net/ambuild\n') - sys.exit(1) - -# Hack to show a decent upgrade message, which wasn't done until 2.2. -ambuild_version = getattr(run, 'CURRENT_API', '2.1') -if ambuild_version.startswith('2.1'): - sys.stderr.write("AMBuild 2.2 or higher is required; please update\n") - sys.exit(1) - -parser = run.BuildParser(sourcePath = sys.path[0], api='2.2') - -parser.options.add_argument('--hl2sdk-root', type=str, dest='hl2sdk_root', default=None, - help='Root search folder for HL2SDKs') -parser.options.add_argument('--mms-path', type=str, dest='mms_path', default=None, - help='Path to Metamod:Source') -parser.options.add_argument('--sm-path', type=str, dest='sm_path', default=None, - help='Path to SourceMod') -parser.options.add_argument('--jansson-path', type=str, dest='jansson_path', default=None, - help='Path to jansson') -parser.options.add_argument('--enable-debug', action='store_const', const='1', dest='debug', - help='Enable debugging symbols') -parser.options.add_argument('--enable-optimize', action='store_const', const='1', dest='opt', - help='Enable optimization') -parser.options.add_argument('-s', '--sdks', default='all', dest='sdks', - help='Build against specified SDKs; valid args are "all", "present", or ' - 'comma-delimited list of engine names (default: %default)') -parser.options.add_argument('--targets', type=str, dest='targets', default=None, - help="Override the target architecture (use commas to separate multiple targets).") - -parser.Configure() diff --git a/product.version b/product.version new file mode 100644 index 0000000..7dea76e --- /dev/null +++ b/product.version @@ -0,0 +1 @@ +1.0.1 From e64c37ad0e4b2d819c131d4f2b52c1f4ad383ffa Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:40:51 +0300 Subject: [PATCH 09/17] Add git ignore --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3a26693 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +build +Containerfile +.venv +safetyhook +libuv +ambuild +*.env +*.ps1 From f6c2be1c884e286b88511da40cafc249ea3ba89c Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:44:22 +0300 Subject: [PATCH 10/17] get rid of old sourcemod headers --- src/AMBuilder | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/AMBuilder b/src/AMBuilder index 42dbe39..cf5d655 100644 --- a/src/AMBuilder +++ b/src/AMBuilder @@ -5,11 +5,12 @@ projectName = 'smjansson' project = builder.LibraryProject(projectName) -# Extension source files (adjust 'src/extension.cpp' if it lives at root) +# Resolve extension source file ext_source = os.path.join(Extension.ext_root, 'src', 'extension.cpp') if not os.path.exists(ext_source): ext_source = os.path.join(Extension.ext_root, 'extension.cpp') +# Extension source files, embedded Jansson source, and SourceMod base SDK source project.sources += [ ext_source, os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'dump.c'), @@ -24,16 +25,9 @@ project.sources += [ os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'utf.c'), os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'value.c'), os.path.join(Extension.sm_root, 'public', 'smsdk_ext.cpp'), - os.path.join(Extension.sm_root, 'public', 'asm', 'asm.c'), - os.path.join(Extension.sm_root, 'public', 'libudis86', 'decode.c'), - os.path.join(Extension.sm_root, 'public', 'libudis86', 'itab.c'), - os.path.join(Extension.sm_root, 'public', 'libudis86', 'syn-att.c'), - os.path.join(Extension.sm_root, 'public', 'libudis86', 'syn-intel.c'), - os.path.join(Extension.sm_root, 'public', 'libudis86', 'syn.c'), - os.path.join(Extension.sm_root, 'public', 'libudis86', 'udis86.c'), ] -# Include paths for Jansson headers and jansson_config.h +# Include paths for Jansson headers jansson_inc = [ os.path.join(Extension.ext_root, 'src', 'jansson', 'src'), os.path.join(Extension.ext_root, 'src', 'jansson'), From 3228da81d7d77f3852b56633b15fa649d9b36449 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:48:04 +0300 Subject: [PATCH 11/17] Add smjansson include path to compiler args --- src/AMBuilder | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/AMBuilder b/src/AMBuilder index cf5d655..d06dfac 100644 --- a/src/AMBuilder +++ b/src/AMBuilder @@ -10,7 +10,6 @@ ext_source = os.path.join(Extension.ext_root, 'src', 'extension.cpp') if not os.path.exists(ext_source): ext_source = os.path.join(Extension.ext_root, 'extension.cpp') -# Extension source files, embedded Jansson source, and SourceMod base SDK source project.sources += [ ext_source, os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'dump.c'), @@ -27,7 +26,7 @@ project.sources += [ os.path.join(Extension.sm_root, 'public', 'smsdk_ext.cpp'), ] -# Include paths for Jansson headers +# Include paths for Jansson jansson_inc = [ os.path.join(Extension.ext_root, 'src', 'jansson', 'src'), os.path.join(Extension.ext_root, 'src', 'jansson'), @@ -46,7 +45,8 @@ for sdk_name in Extension.sdks: project, builder, cxx, projectName + '.ext', sdk ) - # Include Jansson headers + # Use BOTH includes and cxxincludes so and "header.h" work + binary.compiler.includes += jansson_inc binary.compiler.cxxincludes += jansson_inc # Defines required for Jansson and SourceMod SDK From c14a34976b7bb76d2b2545083975e1ec2c96c5e3 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:52:28 +0300 Subject: [PATCH 12/17] last commit --- .github/dependabot.yml | 6 ++++++ src/AMBuilder | 7 ++++--- 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..120c689 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" \ No newline at end of file diff --git a/src/AMBuilder b/src/AMBuilder index d06dfac..60651a7 100644 --- a/src/AMBuilder +++ b/src/AMBuilder @@ -45,17 +45,16 @@ for sdk_name in Extension.sdks: project, builder, cxx, projectName + '.ext', sdk ) - # Use BOTH includes and cxxincludes so and "header.h" work binary.compiler.includes += jansson_inc binary.compiler.cxxincludes += jansson_inc - # Defines required for Jansson and SourceMod SDK + # Mandatory Jansson & SM defines cross-platform binary.compiler.defines += [ + 'HAVE_STDINT_H', 'HAVE_STRING_H', 'SOURCEMOD_BUILD', ] - # Platform-specific compiler/linker flags if cxx.target.platform == 'linux': binary.compiler.postlink += ['-lpthread', '-lrt'] elif cxx.target.platform == 'mac': @@ -66,5 +65,7 @@ for sdk_name in Extension.sdks: binary.compiler.cxxflags += ['-fno-rtti'] elif cxx.family == 'msvc': binary.compiler.cxxflags += ['/GR-'] + # Suppress common MSVC C runtime warnings if needed + binary.compiler.defines += ['_CRT_SECURE_NO_WARNINGS'] Extension.extensions += builder.Add(project) From 23f8a6b56fb46c65221d70a47d9757b7fad75b7f Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:55:25 +0300 Subject: [PATCH 13/17] well, maybe this is the last commit --- .github/workflows/ci.yml | 1 - src/AMBuilder | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bae9038..d6cf18c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,6 @@ on: branches: - master - main - workflow_dispatch: jobs: build-release-extension: diff --git a/src/AMBuilder b/src/AMBuilder index 60651a7..c08ecfb 100644 --- a/src/AMBuilder +++ b/src/AMBuilder @@ -65,7 +65,8 @@ for sdk_name in Extension.sdks: binary.compiler.cxxflags += ['-fno-rtti'] elif cxx.family == 'msvc': binary.compiler.cxxflags += ['/GR-'] - # Suppress common MSVC C runtime warnings if needed binary.compiler.defines += ['_CRT_SECURE_NO_WARNINGS'] + # Feed Windows API import libraries to MSVC linker + binary.compiler.postlink += ['kernel32.lib', 'user32.lib'] Extension.extensions += builder.Add(project) From 9ff0400be188b4b1488023fc2bb6649f17dcbd70 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:58:56 +0300 Subject: [PATCH 14/17] Maybe this? --- src/AMBuilder | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AMBuilder b/src/AMBuilder index c08ecfb..ab1c3a0 100644 --- a/src/AMBuilder +++ b/src/AMBuilder @@ -66,7 +66,7 @@ for sdk_name in Extension.sdks: elif cxx.family == 'msvc': binary.compiler.cxxflags += ['/GR-'] binary.compiler.defines += ['_CRT_SECURE_NO_WARNINGS'] - # Feed Windows API import libraries to MSVC linker - binary.compiler.postlink += ['kernel32.lib', 'user32.lib'] + # Specify /DEFAULTLIB switches so MSVC passes them to link.exe properly + binary.compiler.postlink += ['/DEFAULTLIB:kernel32.lib', '/DEFAULTLIB:user32.lib'] Extension.extensions += builder.Add(project) From 7bba36ea4d3456c53d0a2c691b37767ae8d746fe Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 17:02:11 +0300 Subject: [PATCH 15/17] linux is better than windows --- src/AMBuilder | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/AMBuilder b/src/AMBuilder index ab1c3a0..4c132e1 100644 --- a/src/AMBuilder +++ b/src/AMBuilder @@ -10,6 +10,7 @@ ext_source = os.path.join(Extension.ext_root, 'src', 'extension.cpp') if not os.path.exists(ext_source): ext_source = os.path.join(Extension.ext_root, 'extension.cpp') +# Source files to compile project.sources += [ ext_source, os.path.join(Extension.ext_root, 'src', 'jansson', 'src', 'dump.c'), @@ -26,7 +27,7 @@ project.sources += [ os.path.join(Extension.sm_root, 'public', 'smsdk_ext.cpp'), ] -# Include paths for Jansson +# Include paths for Jansson headers jansson_inc = [ os.path.join(Extension.ext_root, 'src', 'jansson', 'src'), os.path.join(Extension.ext_root, 'src', 'jansson'), @@ -45,10 +46,11 @@ for sdk_name in Extension.sdks: project, builder, cxx, projectName + '.ext', sdk ) + # Include paths for both system and quote includes binary.compiler.includes += jansson_inc binary.compiler.cxxincludes += jansson_inc - # Mandatory Jansson & SM defines cross-platform + # Cross-platform mandatory defines binary.compiler.defines += [ 'HAVE_STDINT_H', 'HAVE_STRING_H', @@ -65,8 +67,13 @@ for sdk_name in Extension.sdks: binary.compiler.cxxflags += ['-fno-rtti'] elif cxx.family == 'msvc': binary.compiler.cxxflags += ['/GR-'] - binary.compiler.defines += ['_CRT_SECURE_NO_WARNINGS'] - # Specify /DEFAULTLIB switches so MSVC passes them to link.exe properly - binary.compiler.postlink += ['/DEFAULTLIB:kernel32.lib', '/DEFAULTLIB:user32.lib'] + # Windows defines to ensure MSVC pulls in and intrin headers + binary.compiler.defines += [ + '_CRT_SECURE_NO_WARNINGS', + 'WIN32', + '_WIN32', + 'WIN32_LEAN_AND_MEAN', + ] + binary.compiler.postlink += ['kernel32.lib', 'user32.lib'] Extension.extensions += builder.Add(project) From cce1fe52f07d946aedd1f94e8774176410a21424 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 17:05:59 +0300 Subject: [PATCH 16/17] please? --- src/extension.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/extension.h b/src/extension.h index c58229a..ffa3819 100644 --- a/src/extension.h +++ b/src/extension.h @@ -29,6 +29,19 @@ * Version: $Id$ */ +// To make this compile on windows with the github's CI +#if defined(_MSC_VER) || defined(_WIN32) + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #include + #include + + #pragma intrinsic(_InterlockedIncrement) + #pragma comment(lib, "kernel32.lib") + #pragma comment(lib, "user32.lib") +#endif + #ifndef _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_ #define _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_ From 0a8bd6b3b9ad3d9f6a6c409deb26a2edfd89e11a Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Thu, 30 Jul 2026 17:06:23 +0300 Subject: [PATCH 17/17] cleaning AMBuilder --- src/AMBuilder | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/AMBuilder b/src/AMBuilder index 4c132e1..0341ff3 100644 --- a/src/AMBuilder +++ b/src/AMBuilder @@ -46,7 +46,6 @@ for sdk_name in Extension.sdks: project, builder, cxx, projectName + '.ext', sdk ) - # Include paths for both system and quote includes binary.compiler.includes += jansson_inc binary.compiler.cxxincludes += jansson_inc @@ -67,13 +66,11 @@ for sdk_name in Extension.sdks: binary.compiler.cxxflags += ['-fno-rtti'] elif cxx.family == 'msvc': binary.compiler.cxxflags += ['/GR-'] - # Windows defines to ensure MSVC pulls in and intrin headers binary.compiler.defines += [ '_CRT_SECURE_NO_WARNINGS', 'WIN32', '_WIN32', 'WIN32_LEAN_AND_MEAN', ] - binary.compiler.postlink += ['kernel32.lib', 'user32.lib'] Extension.extensions += builder.Add(project)