From ebf5f2b4bd11b06f2ff8a0df9ee165e29db35d36 Mon Sep 17 00:00:00 2001 From: Kenta Kubo <601636+kkebo@users.noreply.github.com> Date: Sat, 12 Oct 2024 15:06:08 +0900 Subject: [PATCH 1/4] feat: add partial support for WASI This change allows building the `cmark-gfm` target for both `wasm32-unknown-wasi` and `wasm32-unknown-wasip1-threads`. The other targets are not tested. The differences between two target triples: - `wasm32-unknown-wasi` - C - can import `unistd.h` - has `__wasi__` - does not have `__unix__` - **does not have `_REENTRANT`** - **does not have `_POSIX_THREADS`** - **does not support pthreads API at all** - Swift - can use `#if os(WASI)` - SwiftPM - `BuildSettingsCondition`'s `Platform` is `.wasi` - `wasm32-unknown-wasip1-threads` - C - can import `unistd.h` - has `__wasi__` - does not have `__unix__` - **has `_REENTRANT` (defined in wasi-libc)** - **has `_POSIX_THREADS` (defined in wasi-libc)** - **supports a subset of pthreads API** - Swift - can use `#if os(WASI)` - SwiftPM - `BuildSettingsCondition`'s `Platform` is `.wasi` --- Package.swift | 5 +---- api_test/harness.c | 4 ++-- src/include/mutex.h | 8 +++++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Package.swift b/Package.swift index f1acc5f3a..618c280a4 100644 --- a/Package.swift +++ b/Package.swift @@ -11,12 +11,9 @@ import PackageDescription // link time. let cSettings: [CSetting] = [ .define("CMARK_GFM_STATIC_DEFINE", .when(platforms: [.windows])), - .define("CMARK_THREADING"), ] #else - let cSettings: [CSetting] = [ - .define("CMARK_THREADING"), - ] + let cSettings: [CSetting] = [] #endif let package = Package( diff --git a/api_test/harness.c b/api_test/harness.c index f561aeace..a00ae9eff 100644 --- a/api_test/harness.c +++ b/api_test/harness.c @@ -54,7 +54,7 @@ void INT_EQ(test_batch_runner *runner, int got, int expected, const char *msg, } } -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__wasi__) #include static char *write_tmp(char const *header, char const *data) { @@ -79,7 +79,7 @@ void STR_EQ(test_batch_runner *runner, const char *got, const char *expected, va_end(ap); if (!cond) { -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__wasi__) char *got_fn = write_tmp("actual\n", got); char *expected_fn = write_tmp("expected\n", expected); char buf[1024]; diff --git a/src/include/mutex.h b/src/include/mutex.h index 59427f345..357c38e58 100644 --- a/src/include/mutex.h +++ b/src/include/mutex.h @@ -3,9 +3,15 @@ #include +#ifndef CMARK_THREADING +#if !defined(__wasi__) || defined(_REENTRANT) +#define CMARK_THREADING +#endif +#endif + #ifdef CMARK_THREADING -#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__wasi__) #include #endif From 1153b7f24e9d8f5c596f8b739323a60caba85509 Mon Sep 17 00:00:00 2001 From: Kenta Kubo <601636+kkebo@users.noreply.github.com> Date: Tue, 5 Nov 2024 01:42:38 +0900 Subject: [PATCH 2/4] Revert "remove empty `config.h` and `cmark-gfm_config.h` headers" This reverts commit 6f648763b260b38ea6bce7fd0dfa24ea2fa9e4ef. --- CMakeLists.txt | 2 ++ Package.swift | 1 + bin/main.c | 1 + src/CMakeLists.txt | 4 ++++ src/blocks.c | 1 + src/buffer.c | 1 + src/commonmark.c | 1 + src/config.h.in | 12 ++++++++++++ src/html.c | 1 + src/include/buffer.h | 1 + src/include/cmark-gfm_config.h | 21 +++++++++++++++++++++ src/include/houdini.h | 2 +- src/include/inlines.h | 1 + src/include/module.modulemap | 1 + src/include/mutex.h | 2 ++ src/include/syntax_extension.h | 1 + src/inlines.c | 1 + src/iterator.c | 1 + src/latex.c | 1 + src/man.c | 1 + src/node.c | 1 + src/registry.c | 1 + src/xml.c | 1 + 23 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/config.h.in create mode 100644 src/include/cmark-gfm_config.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 23eca3c50..d2e27342c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,6 +76,8 @@ endif() add_compile_definitions($<$:CMARK_DEBUG_NODES>) # FIXME(compnerd) why do we not use `!defined(NDEBUG)`? add_compile_definitions($<$:DEBUG>) +# Use CMake's generated headers instead of the Swift package prebuilt ones +add_compile_definitions(CMARK_USE_CMAKE_HEADERS) add_compile_options($<$,$>:-pg>) diff --git a/Package.swift b/Package.swift index 618c280a4..6cdf00ff5 100644 --- a/Package.swift +++ b/Package.swift @@ -38,6 +38,7 @@ let package = Package( exclude: [ "scanners.re", "libcmark-gfm.pc.in", + "config.h.in", "CMakeLists.txt", ], cSettings: cSettings diff --git a/bin/main.c b/bin/main.c index 0b523596c..46c54bb33 100644 --- a/bin/main.c +++ b/bin/main.c @@ -4,6 +4,7 @@ #include #include +#include "cmark-gfm_config.h" #include "cmark-gfm.h" #include "node.h" #include "cmark-gfm-extension_api.h" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 54499cb1a..deee8dcbb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,6 @@ +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/config.h) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libcmark-gfm.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libcmark-gfm.pc @ONLY) @@ -68,6 +71,7 @@ install(FILES include/chunk.h include/cmark_ctype.h include/cmark-gfm.h + include/cmark-gfm_config.h include/cmark-gfm-extension_api.h include/cmark-gfm_version.h include/export.h diff --git a/src/blocks.c b/src/blocks.c index 6467a3a59..1efd8fd01 100644 --- a/src/blocks.c +++ b/src/blocks.c @@ -13,6 +13,7 @@ #include "cmark_ctype.h" #include "syntax_extension.h" +#include "cmark-gfm_config.h" #include "parser.h" #include "cmark-gfm.h" #include "node.h" diff --git a/src/buffer.c b/src/buffer.c index aeca03d09..5adfa3054 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -7,6 +7,7 @@ #include #include +#include "cmark-gfm_config.h" #include "cmark_ctype.h" #include "buffer.h" diff --git a/src/commonmark.c b/src/commonmark.c index a5aa74728..dee18b4d9 100644 --- a/src/commonmark.c +++ b/src/commonmark.c @@ -5,6 +5,7 @@ #include #include +#include "cmark-gfm_config.h" #include "cmark-gfm.h" #include "node.h" #include "buffer.h" diff --git a/src/config.h.in b/src/config.h.in new file mode 100644 index 000000000..d2b00970a --- /dev/null +++ b/src/config.h.in @@ -0,0 +1,12 @@ +#ifndef CMARK_CONFIG_H +#define CMARK_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/html.c b/src/html.c index 4d5624ae7..cb9ad6801 100644 --- a/src/html.c +++ b/src/html.c @@ -5,6 +5,7 @@ #include #include "cmark_ctype.h" +#include "cmark-gfm_config.h" #include "cmark-gfm.h" #include "houdini.h" #include "scanners.h" diff --git a/src/include/buffer.h b/src/include/buffer.h index 56a28feb5..3926b6549 100644 --- a/src/include/buffer.h +++ b/src/include/buffer.h @@ -6,6 +6,7 @@ #include #include #include +#include "cmark-gfm_config.h" #include "cmark-gfm.h" #ifdef __cplusplus diff --git a/src/include/cmark-gfm_config.h b/src/include/cmark-gfm_config.h new file mode 100644 index 000000000..7afb648d8 --- /dev/null +++ b/src/include/cmark-gfm_config.h @@ -0,0 +1,21 @@ +#ifndef CMARK_CONFIG_H +#define CMARK_CONFIG_H + +#ifdef CMARK_USE_CMAKE_HEADERS +// if the CMake config header exists, use that instead of this Swift package prebuilt one +// we need to undefine the header guard, since config.h uses the same one +#undef CMARK_CONFIG_H +#include "config.h" +#else + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* not CMARK_USE_CMAKE_HEADERS */ + +#endif /* not CMARK_CONFIG_H */ diff --git a/src/include/houdini.h b/src/include/houdini.h index 61a3cd639..e55b77fd8 100644 --- a/src/include/houdini.h +++ b/src/include/houdini.h @@ -2,7 +2,7 @@ #define CMARK_HOUDINI_H #include - +#include "cmark-gfm_config.h" #include "buffer.h" #ifdef __cplusplus diff --git a/src/include/inlines.h b/src/include/inlines.h index b99acfc5f..84090e89d 100644 --- a/src/include/inlines.h +++ b/src/include/inlines.h @@ -4,6 +4,7 @@ #include #include +#include "cmark-gfm_config.h" #include "references.h" #ifdef __cplusplus diff --git a/src/include/module.modulemap b/src/include/module.modulemap index 16c65818f..549f1e499 100644 --- a/src/include/module.modulemap +++ b/src/include/module.modulemap @@ -1,5 +1,6 @@ module cmark_gfm { header "cmark-gfm.h" + header "cmark-gfm_config.h" header "cmark-gfm-extension_api.h" header "buffer.h" header "chunk.h" diff --git a/src/include/mutex.h b/src/include/mutex.h index 357c38e58..7284abc14 100644 --- a/src/include/mutex.h +++ b/src/include/mutex.h @@ -1,6 +1,8 @@ #ifndef CMARK_MUTEX_H #define CMARK_MUTEX_H +#include "cmark-gfm_config.h" + #include #ifndef CMARK_THREADING diff --git a/src/include/syntax_extension.h b/src/include/syntax_extension.h index de8d3d62a..4ccb6ce35 100644 --- a/src/include/syntax_extension.h +++ b/src/include/syntax_extension.h @@ -3,6 +3,7 @@ #include "cmark-gfm.h" #include "cmark-gfm-extension_api.h" +#include "cmark-gfm_config.h" #include diff --git a/src/inlines.c b/src/inlines.c index 6e51feb0c..5fee895d6 100644 --- a/src/inlines.c +++ b/src/inlines.c @@ -4,6 +4,7 @@ #include #include "cmark_ctype.h" +#include "cmark-gfm_config.h" #include "node.h" #include "parser.h" #include "references.h" diff --git a/src/iterator.c b/src/iterator.c index e7cc64582..d8c0eade5 100644 --- a/src/iterator.c +++ b/src/iterator.c @@ -2,6 +2,7 @@ #include #include +#include "cmark-gfm_config.h" #include "node.h" #include "cmark-gfm.h" #include "iterator.h" diff --git a/src/latex.c b/src/latex.c index 0fc607975..b4df8d0d4 100644 --- a/src/latex.c +++ b/src/latex.c @@ -4,6 +4,7 @@ #include #include +#include "cmark-gfm_config.h" #include "cmark-gfm.h" #include "node.h" #include "buffer.h" diff --git a/src/man.c b/src/man.c index 1baceb4c5..b92cdb319 100644 --- a/src/man.c +++ b/src/man.c @@ -4,6 +4,7 @@ #include #include +#include "cmark-gfm_config.h" #include "cmark-gfm.h" #include "node.h" #include "buffer.h" diff --git a/src/node.c b/src/node.c index 78fbd6265..967b1b900 100644 --- a/src/node.c +++ b/src/node.c @@ -2,6 +2,7 @@ #include #include +#include "cmark-gfm_config.h" #include "mutex.h" #include "node.h" #include "syntax_extension.h" diff --git a/src/registry.c b/src/registry.c index 090a01c31..91f79530a 100644 --- a/src/registry.c +++ b/src/registry.c @@ -2,6 +2,7 @@ #include #include +#include "cmark-gfm_config.h" #include "cmark-gfm.h" #include "mutex.h" #include "syntax_extension.h" diff --git a/src/xml.c b/src/xml.c index ad46af723..b3ed49b33 100644 --- a/src/xml.c +++ b/src/xml.c @@ -4,6 +4,7 @@ #include #include +#include "cmark-gfm_config.h" #include "cmark-gfm.h" #include "node.h" #include "buffer.h" From 0627c66d5f94a7294d60cc2a910a1e0b6cf866d5 Mon Sep 17 00:00:00 2001 From: Kenta Kubo <601636+kkebo@users.noreply.github.com> Date: Tue, 5 Nov 2024 01:42:49 +0900 Subject: [PATCH 3/4] Revert "build: hoist `CMARK_THREADING` to a build-only config" This reverts commit aef4761a7878a437b981251fc31d0a7b7392de12. --- CMakeLists.txt | 1 - src/config.h.in | 2 ++ src/include/cmark-gfm_config.h | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d2e27342c..e40ca1633 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,6 @@ include(FindAsan) if(CMARK_THREADING) set(THREADS_PREFER_PTHREAD_FLAG YES) include(FindThreads) - add_compile_definitions(CMARK_THREADING) endif() include(GNUInstallDirs) diff --git a/src/config.h.in b/src/config.h.in index d2b00970a..77e6400ca 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -5,6 +5,8 @@ extern "C" { #endif +#cmakedefine CMARK_THREADING + #ifdef __cplusplus } #endif diff --git a/src/include/cmark-gfm_config.h b/src/include/cmark-gfm_config.h index 7afb648d8..c67ad6c6b 100644 --- a/src/include/cmark-gfm_config.h +++ b/src/include/cmark-gfm_config.h @@ -12,6 +12,8 @@ extern "C" { #endif +#define CMARK_THREADING + #ifdef __cplusplus } #endif From 415c3ac674340254a9c703b4860e46aa01159aed Mon Sep 17 00:00:00 2001 From: Kenta Kubo <601636+kkebo@users.noreply.github.com> Date: Tue, 5 Nov 2024 01:54:03 +0900 Subject: [PATCH 4/4] build: change `CMARK_THREADING` to 0 or 1 --- src/config.h.in | 2 +- src/include/cmark-gfm_config.h | 8 +++++++- src/include/mutex.h | 8 +------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/config.h.in b/src/config.h.in index 77e6400ca..ad2c4b6c8 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -5,7 +5,7 @@ extern "C" { #endif -#cmakedefine CMARK_THREADING +#cmakedefine01 CMARK_THREADING #ifdef __cplusplus } diff --git a/src/include/cmark-gfm_config.h b/src/include/cmark-gfm_config.h index c67ad6c6b..4a17341f3 100644 --- a/src/include/cmark-gfm_config.h +++ b/src/include/cmark-gfm_config.h @@ -12,7 +12,13 @@ extern "C" { #endif -#define CMARK_THREADING +#ifndef CMARK_THREADING +#if defined(__wasi__) && !defined(_REENTRANT) +#define CMARK_THREADING 0 +#else +#define CMARK_THREADING 1 +#endif +#endif #ifdef __cplusplus } diff --git a/src/include/mutex.h b/src/include/mutex.h index 7284abc14..31933af68 100644 --- a/src/include/mutex.h +++ b/src/include/mutex.h @@ -5,13 +5,7 @@ #include -#ifndef CMARK_THREADING -#if !defined(__wasi__) || defined(_REENTRANT) -#define CMARK_THREADING -#endif -#endif - -#ifdef CMARK_THREADING +#if CMARK_THREADING #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__wasi__) #include