Skip to content

Conversation

@BalkanMadman
Copy link
Contributor

Hello!

We've been packaging QuickJS-ng in Gentoo and we've found meson to be the most versatile amongst the added build systems. Huge thanks for taking care of QuickJS and implementing modern build systems -- it makes the life of us, packagers, much much easier.

This PR bundles two simple fixes for meson.build

@BalkanMadman
Copy link
Contributor Author

BalkanMadman commented Nov 4, 2025

As far as I'm aware, the CI failures are not caused by these changes

@BalkanMadman
Copy link
Contributor Author

Ping. Any updates?

@saghul
Copy link
Contributor

saghul commented Nov 18, 2025

I've triggered the CI again. IIRC the failures were directly related to this change, but let's see.

@bnoordhuis
Copy link
Contributor

bnoordhuis commented Nov 18, 2025

I'm fine with this change. @saghul?

edit: cross-wired

@BalkanMadman
Copy link
Contributor Author

I've been going through CI and stumbled upon this: https://github.com/quickjs-ng/quickjs/actions/runs/19475324220/job/55744866380?pr=1225#step:7:42

meson.build:624: WARNING: Trying to use ['address', 'undefined'] sanitizer on Clang with b_lundef.

@BalkanMadman
Copy link
Contributor Author

I can reproduce the failure on my machine too (albeit with clang only).

@BalkanMadman
Copy link
Contributor Author

https://github.com/google/sanitizers/wiki/AddressSanitizer#faq:

Q: When I link my shared library with -fsanitize=address, it fails due to some undefined ASan symbols (e.g. asan_init_v4)?

A: Most probably you link with -Wl,-z,defs or -Wl,--no-undefined. These flags don't work with ASan unless you also use -shared-libasan (which is the default mode for GCC, but not for Clang).

@BalkanMadman
Copy link
Contributor Author

Meson option b_lundef defaults to true, e.g. -Wl,--no-undefined is added to CFLAGS.

@BalkanMadman
Copy link
Contributor Author

Passing -shared-libasan seems to fix the error.

@BalkanMadman
Copy link
Contributor Author

Should fix the CI.

@saghul
Copy link
Contributor

saghul commented Nov 19, 2025

Yeah so as I said, the meson CI needs updating now to statically link by default.

@BalkanMadman
Copy link
Contributor Author

Would you like to me to do the CI update (including the fix for the failing CI for this PR) in this PR or separately?

@saghul
Copy link
Contributor

saghul commented Nov 21, 2025

Would you like to me to do the CI update (including the fix for the failing CI for this PR) in this PR or separately?

In this PR please, we like to avoid merging failing PRs.

@BalkanMadman
Copy link
Contributor Author

BalkanMadman commented Nov 22, 2025

Would you like to me to do the CI update (including the fix for the failing CI for this PR) in this PR or separately?

In this PR please, we like to avoid merging failing PRs.

Your release CI builds QuickJS-NG with CMake so this PR shouldn't affect that. The PR already contains a fix for PR CI. My apologies, screwed up the quoting

@BalkanMadman
Copy link
Contributor Author

Apparently, for MSVC CI, we're hitting mesonbuild/meson#13892. Will add a commit forcing MSVC-based builds to use static libs.

@bnoordhuis
Copy link
Contributor

@BalkanMadman ping, seems this was close to done?

@BalkanMadman
Copy link
Contributor Author

Hello! Sorry for the delay, could you please try running the CI again? The two new commits should fix two issues in building QuickJS-NG shared.

@BalkanMadman BalkanMadman force-pushed the meson-fixes branch 2 times, most recently from 5b8d06a to 0cf1f7f Compare December 24, 2025 08:54
@BalkanMadman
Copy link
Contributor Author

BalkanMadman commented Dec 24, 2025

Okay, I also need to guard all the dll{export,import} shenanigans if we're building static libqjs🔥🔥🔥

Because obviously just exporting symbols isn't enough and on Windows you need separate exports for DLLs and static libs👍

@saghul
Copy link
Contributor

saghul commented Dec 24, 2025

Not sure I get the unconditional define in quickjs.c. Shouldn't it be set by Meson depending on the build type?

@saghul
Copy link
Contributor

saghul commented Dec 26, 2025

Looks like there are conflicts, can you rebase?

CMakeLists.txt Outdated
Comment on lines 298 to 299
# We shouldn't really support building examples with static qjs..
# Anyways, this is required for fib.so and point.so to link properly.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# We shouldn't really support building examples with static qjs..
# Anyways, this is required for fib.so and point.so to link properly.
# Required for fib.so and point.so to link properly.

Because why shouldn't we support it?

Copy link
Contributor Author

@BalkanMadman BalkanMadman Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good question, you're right. I'll adjust the check.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Completely revamped the check. Since runtime modules shouldn't link to qjs directly but rather use its symbols at runtime, I added an INTERFACE library for modules in CMake and the same dep in meson.

@BalkanMadman BalkanMadman force-pushed the meson-fixes branch 3 times, most recently from cc1ac41 to 38ffa75 Compare February 1, 2026 21:02
@BalkanMadman
Copy link
Contributor Author

All suggestions applied. Will test the JS_MODULE_EXTERN commit on Windows right now.

@BalkanMadman
Copy link
Contributor Author

Oh yes the classic "our platform is crippled and we can't resolve symbols at runtime".

Previously, irrespective of the setting of -Dlibc, quickjs-libc would be
built as a static library. In case -Dlibc=true is set, the static
library is linked in libqjs only. In case -Dlibc=false is set, the
archive is linked to every quickjs-libc consumer.

In the former case (-Dlibc=true), building quickjs-libc as static
library introduces useless indirection, since quickjs-libc is going to
be linked only to libqjs anyway. CMake just adds the libc's sources to
qjs's and calls it a day.

This commit changes meson.build. If -Dlibc=true is set, quickjs-libc's
sources are compiled as a part of libqjs. If not, it compiled as a
static library, as was done before.

In both cases, a direct dependency of quickjs-libc has been changed into
a `dependency` on qjs_libc_dep which conveniently abstracts both
configuration.

So, if quickjs-libc needs to be linked to, just add `dependencies:
qjs_libc_dep`.

Signed-off-by: Zurab Kvachadze <zurabid2016@gmail.com>
Previously, if QJS_BUILD_LIBC was false, quickjs-libc would be built
with every consumer. This made it harder to specify and trace the
dependencies/compiler definitions of quickjs-libc itself.

With this change, if -DQJS_BUILD_LIBC=false is passed to CMake,
quickjs-libc is built as a normal static library, with its own compiler
definitions and dependencies.

This changes CMake to match the Meson behaviour. Additionally, since
CMake does not allow mixing keyword and non-keyword declarations, this
commit adds explicit `PRIVATE` to all `target_link_libraries`
declarations.

Signed-off-by: Zurab Kvachadze <zurabid2016@gmail.com>
@BalkanMadman BalkanMadman force-pushed the meson-fixes branch 2 times, most recently from ae41959 to 0028b63 Compare February 3, 2026 17:31
@BalkanMadman
Copy link
Contributor Author

Okay, restored the old behaviour of linking to qjs on Windows, should be okay now.

@bnoordhuis
Copy link
Contributor

There's still a windows-mingw-shared build error:

cmake --build build -j 4
ninja: error: build.ninja:312: multiple rules generate libqjs.dll.a

@BalkanMadman
Copy link
Contributor Author

Well, that's a new one. I gotta look through CMakeLists.txt again.

@BalkanMadman
Copy link
Contributor Author

Figured it out: both libqjs and qjs export symbols with implib having the same name which trips Ninja. Should be fixed now.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates QuickJS-NG’s public headers and build scripts (Meson/CMake) to better support Windows DLL builds and consistent symbol export/import behavior across the core library, libc, and binary modules.

Changes:

  • Introduces platform/compiler-aware JS_EXTERN/JS_LIBC_EXTERN/JS_MODULE_EXTERN macros and updates module/libc headers and examples to use them.
  • Refactors Meson and CMake builds to separate cutils.c into its own library and adjusts link/dependency wiring for shared builds and Windows modules.
  • Tweaks CI Meson sanitizer configurations to disable undefined-symbol enforcement in certain Clang sanitizer jobs.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
quickjs.h Adds export/import and module/libc extern macros for Windows/shared builds.
quickjs-libc.h Switches libc API declarations to JS_LIBC_EXTERN.
meson.build Refactors build graph (new cutils lib), adds shared/DLL compile defs, adjusts dependencies and pkg-config flags.
examples/fib.c Uses <quickjs.h> and JS_MODULE_EXTERN for module entrypoint.
examples/point.c Uses <quickjs.h> and JS_MODULE_EXTERN for module entrypoint.
examples/meson.build Updates module build dependencies to use qjs_module_dep and hidden visibility.
CMakeLists.txt Refactors build graph (new cutils lib), adds shared/DLL compile defs, introduces module interface target.
.github/workflows/ci.yml Adds -Db_lundef=false to certain Meson Clang sanitizer modes.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@saghul
Copy link
Contributor

saghul commented Feb 9, 2026

Ops, I clicked the copilot button by mistake! It did have some interesting things to say though!

Since the macros like JS_EXTERN are used in more than one place, it is
quite reasonable and helpful to declare them in one place. Additionally,
the Windows support with the __declspec tango was missing.

This commit, in addition to reorganising definitions, also plumbs
Windows support for JS_EXTERN and JS_LIBC_EXTERN.

Signed-off-by: Zurab Kvachadze <zurabid2016@gmail.com>
The new macro is a counterpart to JS_EXTERN, but for binary C modules.
This commit introduces one more preprocessor define that must be set
when building C modules.

This commit changes examples/fib.c and examples/point.c to use the new
macro, while also removing redundant JS_SHARED_LIBRARY. Additionally,
the includes use the angled brackets now since quickjs.h is supposed to
be external to the binary modules.

meson.build is fixed to properly add the include directory; the manual
header copying has also been removed as it is redundant.

Signed-off-by: Zurab Kvachadze <zurabid2016@gmail.com>
Clang cannot handle building shared libraries with sanitizers and
-Wl,--no-undefined (set by default unless explicitly disabled with
-Db_lundef=false).

This commit prefixes CI in case shared libraries are built with
sanitisers.

Signed-off-by: Zurab Kvachadze <zurabid2016@gmail.com>
During the build, the default library can be overridden via the
-Ddefault_library=type flag.

Presetting this key in meson.build makes life harder for distributions
which almost always want to build shared libraries. Those requiring
static libraries can always force that via the aforementioned flag.

Signed-off-by: Zurab Kvachadze <zurabid2016@gmail.com>
Copy link
Contributor

@bnoordhuis bnoordhuis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM at a quick glance. Thanks!

Copy link
Contributor

@saghul saghul left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, nice work!

@saghul saghul merged commit f2f5843 into quickjs-ng:master Feb 9, 2026
122 checks passed
@BalkanMadman BalkanMadman deleted the meson-fixes branch February 9, 2026 13:37
@BalkanMadman
Copy link
Contributor Author

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants