Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -648,11 +648,14 @@ jobs:
- name: clang+sanitize
args: >-
"-Db_sanitize=address,undefined"
"-Db_lundef=false"
extra_envs:
CC: clang
CXX: clang++
- name: clang+msan
args: -Db_sanitize=memory
args: >-
"-Db_sanitize=memory"
"-Db_lundef=false"
extra_envs:
CC: clang
CXX: clang++
Expand All @@ -662,6 +665,7 @@ jobs:
- name: clang-cl+sanitize
args: >-
"-Db_sanitize=address,undefined"
"-Db_lundef=false"
extra_envs:
CC: clang-cl
CXX: clang-cl
Expand Down
99 changes: 71 additions & 28 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)
set(CMAKE_C_STANDARD 11)

# Used to properly define JS_LIBC_EXTERN.
add_compile_definitions(QUICKJS_NG_BUILD)

# MINGW doesn't exist in older cmake versions, newer versions don't know
# about CMAKE_COMPILER_IS_MINGW, and there is no unique CMAKE_C_COMPILER_ID
# for mingw-based compilers...
Expand Down Expand Up @@ -232,7 +235,7 @@ endif()
xoption(QJS_BUILD_LIBC "Build standard library modules as part of the library" OFF)
macro(add_qjs_libc_if_needed target)
if(NOT QJS_BUILD_LIBC)
target_sources(${target} PRIVATE quickjs-libc.c)
target_link_libraries(${target} PRIVATE qjs-libc)
endif()
endmacro()
macro(add_static_if_needed target)
Expand All @@ -245,7 +248,6 @@ macro(add_static_if_needed target)
endmacro()

set(qjs_sources
cutils.c
dtoa.c
libregexp.c
libunicode.c
Expand All @@ -254,6 +256,8 @@ set(qjs_sources

if(QJS_BUILD_LIBC)
list(APPEND qjs_sources quickjs-libc.c)
# The definition must be added to the entire project.
add_compile_definitions(QJS_BUILD_LIBC)
endif()
list(APPEND qjs_defines _GNU_SOURCE)
if(WIN32)
Expand All @@ -278,13 +282,50 @@ if(M_LIBRARIES OR CMAKE_C_COMPILER_ID STREQUAL "TinyCC")
list(APPEND qjs_libs m)
endif()

add_library(cutils STATIC cutils.c)
target_compile_definitions(cutils PRIVATE ${qjs_defines})
target_link_libraries(cutils PRIVATE ${qjs_libs})

add_library(qjs ${qjs_sources})
target_compile_definitions(qjs PRIVATE ${qjs_defines})
target_include_directories(qjs PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
target_link_libraries(qjs PUBLIC ${qjs_libs})
target_link_libraries(qjs PRIVATE $<BUILD_INTERFACE:cutils>)

# Pass a compiler definition so that Windows gets its declspec's right.
get_target_property(QJS_LIB_TYPE qjs TYPE)
if(QJS_LIB_TYPE STREQUAL "SHARED_LIBRARY")
target_compile_definitions(qjs
PRIVATE BUILDING_QJS_SHARED
PUBLIC USING_QJS_SHARED
)
endif()

# An interface library for modules.
add_library(qjs_module_lib INTERFACE)
target_include_directories(qjs_module_lib INTERFACE
$<TARGET_PROPERTY:qjs,INTERFACE_INCLUDE_DIRECTORIES>
)
target_compile_definitions(qjs_module_lib INTERFACE
QUICKJS_NG_MODULE_BUILD
$<TARGET_PROPERTY:qjs,INTERFACE_COMPILE_DEFINITIONS>
)
if(WIN32)
# Since Windows cannot resolve symbols at load time, we need to
# explicitly link it to qjs.
target_link_libraries(qjs_module_lib INTERFACE
qjs
)
endif()

if(NOT QJS_BUILD_LIBC)
add_library(qjs-libc STATIC quickjs-libc.c)
target_compile_definitions(qjs-libc PRIVATE ${qjs_defines})
target_link_libraries(qjs-libc PRIVATE ${qjs_libs} qjs cutils)
endif()

if(EMSCRIPTEN)
add_executable(qjs_wasm ${qjs_sources})
Expand All @@ -301,7 +342,7 @@ if(EMSCRIPTEN)
-sEXPORTED_RUNTIME_METHODS=ccall,cwrap
)
target_compile_definitions(qjs_wasm PRIVATE ${qjs_defines})
target_link_libraries(qjs_wasm m)
target_link_libraries(qjs_wasm PRIVATE m)
endif()


Expand All @@ -314,7 +355,7 @@ add_executable(qjsc
add_qjs_libc_if_needed(qjsc)
add_static_if_needed(qjsc)
target_compile_definitions(qjsc PRIVATE ${qjs_defines})
target_link_libraries(qjsc qjs)
target_link_libraries(qjsc PRIVATE qjs cutils)


# QuickJS CLI
Expand All @@ -331,10 +372,8 @@ set_target_properties(qjs_exe PROPERTIES
OUTPUT_NAME "qjs"
)
target_compile_definitions(qjs_exe PRIVATE ${qjs_defines})
target_link_libraries(qjs_exe qjs)
if(NOT WIN32)
set_target_properties(qjs_exe PROPERTIES ENABLE_EXPORTS TRUE)
endif()
target_link_libraries(qjs_exe PRIVATE qjs cutils)
set_target_properties(qjs_exe PROPERTIES ENABLE_EXPORTS TRUE)

# WASI Reactor
#
Expand Down Expand Up @@ -369,9 +408,9 @@ if(QJS_BUILD_CLI_WITH_MIMALLOC OR QJS_BUILD_CLI_WITH_STATIC_MIMALLOC)
find_package(mimalloc REQUIRED)
# Upstream mimalloc doesn't provide a way to know if both libraries are supported.
if(QJS_BUILD_CLI_WITH_STATIC_MIMALLOC)
target_link_libraries(qjs_exe mimalloc-static)
target_link_libraries(qjs_exe PRIVATE mimalloc-static)
else()
target_link_libraries(qjs_exe mimalloc)
target_link_libraries(qjs_exe PRIVATE mimalloc)
endif()
endif()

Expand All @@ -384,7 +423,7 @@ if(NOT EMSCRIPTEN)
)
add_qjs_libc_if_needed(run-test262)
target_compile_definitions(run-test262 PRIVATE ${qjs_defines})
target_link_libraries(run-test262 qjs)
target_link_libraries(run-test262 PRIVATE qjs cutils)
endif()

# Interrupt test
Expand All @@ -394,78 +433,82 @@ add_executable(api-test
api-test.c
)
target_compile_definitions(api-test PRIVATE ${qjs_defines})
target_link_libraries(api-test qjs)
target_link_libraries(api-test PRIVATE qjs cutils)

# Unicode generator
#

add_executable(unicode_gen EXCLUDE_FROM_ALL
cutils.c
libunicode.c
unicode_gen.c
)
target_compile_definitions(unicode_gen PRIVATE ${qjs_defines})
target_link_libraries(unicode_gen PRIVATE cutils)

add_executable(function_source
gen/function_source.c
)
add_qjs_libc_if_needed(function_source)
target_include_directories(function_source PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_definitions(function_source PRIVATE ${qjs_defines})
target_link_libraries(function_source qjs)
target_link_libraries(function_source PRIVATE qjs)

# Examples
#

if(QJS_BUILD_EXAMPLES)
if(WIN32 AND NOT (QJS_LIB_TYPE STREQUAL "SHARED_LIBRARY"))
message(AUTHOR_WARNING
"Binary modules used with static qjs on Windows. There might be\n"
"runtime errors when the module is used due to two copies of qjs\n"
"in memory.\n"
"Please use \"-DBUILD_SHARED_LIBS=true\" if possible."
)
endif()

add_executable(hello
gen/hello.c
)
add_qjs_libc_if_needed(hello)
target_include_directories(hello PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_definitions(hello PRIVATE ${qjs_defines})
target_link_libraries(hello qjs)
target_link_libraries(hello PRIVATE qjs)

add_executable(hello_module
gen/hello_module.c
)
add_qjs_libc_if_needed(hello_module)
target_include_directories(hello_module PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_definitions(hello_module PRIVATE ${qjs_defines})
target_link_libraries(hello_module qjs)
target_link_libraries(hello_module PRIVATE qjs)

add_library(fib MODULE examples/fib.c)
set_target_properties(fib PROPERTIES
PREFIX ""
C_VISIBILITY_PRESET default
)
target_compile_definitions(fib PRIVATE JS_SHARED_LIBRARY)
if(WIN32)
target_link_libraries(fib qjs)
elseif(APPLE)
target_link_libraries(fib PRIVATE qjs_module_lib)
if(APPLE)
target_link_options(fib PRIVATE -undefined dynamic_lookup)
endif()

add_library(point MODULE examples/point.c)
set_target_properties(point PROPERTIES
PREFIX ""
C_VISIBILITY_PRESET default
)
target_compile_definitions(point PRIVATE JS_SHARED_LIBRARY)
if(WIN32)
target_link_libraries(point qjs)
elseif(APPLE)
target_link_libraries(point PRIVATE qjs_module_lib)
if(APPLE)
target_link_options(point PRIVATE -undefined dynamic_lookup)
endif()

add_executable(test_fib
examples/fib.c
gen/test_fib.c
)
add_qjs_libc_if_needed(test_fib)
target_include_directories(test_fib PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_definitions(test_fib PRIVATE ${qjs_defines})
target_link_libraries(test_fib qjs)
target_link_libraries(test_fib PRIVATE qjs)
# Loads fib.so which depends on symbols from libqjs.
set_target_properties(test_fib PROPERTIES ENABLE_EXPORTS TRUE)
endif()

# Install target
Expand Down
19 changes: 3 additions & 16 deletions examples/fib.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "../quickjs.h"

#include <quickjs.h>

#define countof(x) (sizeof(x) / sizeof((x)[0]))

Expand Down Expand Up @@ -55,21 +56,7 @@ static int js_fib_init(JSContext *ctx, JSModuleDef *m)
countof(js_fib_funcs));
}

#ifdef JS_SHARED_LIBRARY
#define JS_INIT_MODULE js_init_module
#else
#define JS_INIT_MODULE js_init_module_fib
#endif

#ifndef JS_EXTERN
#ifdef _WIN32
#define JS_EXTERN __declspec(dllexport)
#else
#define JS_EXTERN
#endif
#endif

JS_EXTERN JSModuleDef *JS_INIT_MODULE(JSContext *ctx, const char *module_name)
JS_MODULE_EXTERN JSModuleDef *js_init_module(JSContext *ctx, const char *module_name)
{
JSModuleDef *m;
m = JS_NewCModule(ctx, module_name, js_fib_init);
Expand Down
10 changes: 4 additions & 6 deletions examples/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,15 @@ shared_module(
'fib.c',

name_prefix: '',
gnu_symbol_visibility: 'default',
c_args: ['-DJS_SHARED_LIBRARY'],
dependencies: host_system == 'windows' ? qjs_dep : [],
gnu_symbol_visibility: 'hidden',
dependencies: qjs_module_dep,
)

shared_module(
'point',
'point.c',

name_prefix: '',
gnu_symbol_visibility: 'default',
c_args: ['-DJS_SHARED_LIBRARY'],
dependencies: host_system == 'windows' ? qjs_dep : [],
gnu_symbol_visibility: 'hidden',
dependencies: qjs_module_dep,
)
14 changes: 4 additions & 10 deletions examples/point.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,11 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "../quickjs.h"

#include <math.h>

#include <quickjs.h>

#define countof(x) (sizeof(x) / sizeof((x)[0]))

/* Point Class */
Expand Down Expand Up @@ -141,15 +143,7 @@ static int js_point_init(JSContext *ctx, JSModuleDef *m)
return 0;
}

#ifndef JS_EXTERN
#ifdef _WIN32
#define JS_EXTERN __declspec(dllexport)
#else
#define JS_EXTERN
#endif
#endif

JS_EXTERN JSModuleDef *js_init_module(JSContext *ctx, const char *module_name)
JS_MODULE_EXTERN JSModuleDef *js_init_module(JSContext *ctx, const char *module_name)
{
JSModuleDef *m;
m = JS_NewCModule(ctx, module_name, js_point_init);
Expand Down
Loading
Loading