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 @@ -643,11 +643,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 @@ -657,6 +660,7 @@ jobs:
- name: clang-cl+sanitize
args: >-
"-Db_sanitize=address,undefined"
"-Db_lundef=false"
extra_envs:
CC: clang-cl
CXX: clang-cl
Expand Down
32 changes: 24 additions & 8 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)
set(CMAKE_C_STANDARD 11)

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 @@ -237,7 +239,6 @@ macro(add_static_if_needed target)
endmacro()

set(qjs_sources
cutils.c
dtoa.c
libregexp.c
libunicode.c
Expand All @@ -246,6 +247,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 @@ -270,13 +273,26 @@ 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_compile_definitions(qjs PRIVATE ${qjs_defines} QUICKJS_NG_QJS_INTERNAL)
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>)

get_target_property(QJS_LIB_TYPE qjs TYPE)
# Pass a compiler definition so that Windows gets its declspec's right.
if(QJS_LIB_TYPE STREQUAL "SHARED_LIBRARY")
# We use PUBLIC here because we want the consumers to also have this
# definition.
target_compile_definitions(qjs PUBLIC QUICKJS_NG_DLL)
endif()

if(EMSCRIPTEN)
add_executable(qjs_wasm ${qjs_sources})
Expand Down Expand Up @@ -306,7 +322,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 qjs cutils)


# QuickJS CLI
Expand All @@ -323,7 +339,7 @@ set_target_properties(qjs_exe PROPERTIES
OUTPUT_NAME "qjs"
)
target_compile_definitions(qjs_exe PRIVATE ${qjs_defines})
target_link_libraries(qjs_exe qjs)
target_link_libraries(qjs_exe qjs cutils)
if(NOT WIN32)
set_target_properties(qjs_exe PROPERTIES ENABLE_EXPORTS TRUE)
endif()
Expand All @@ -346,7 +362,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 qjs cutils)
endif()

# Interrupt test
Expand All @@ -356,17 +372,17 @@ 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 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
Expand Down Expand Up @@ -444,7 +460,7 @@ set_target_properties(qjs PROPERTIES
VERSION ${QJS_VERSION_MAJOR}.${QJS_VERSION_MINOR}.${QJS_VERSION_PATCH}
SOVERSION ${QJS_VERSION_MAJOR}
)
install(FILES quickjs.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES quickjs.h quickjs-ng-util.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
if(QJS_BUILD_LIBC)
install(FILES quickjs-libc.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
Expand Down
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@ all: $(QJS)
amalgam: TEMP := $(shell mktemp -d)
amalgam: $(QJS)
$(QJS) amalgam.js $(TEMP)/quickjs-amalgam.c
cp quickjs.h quickjs-libc.h $(TEMP)
cd $(TEMP) && zip -9 quickjs-amalgam.zip quickjs-amalgam.c quickjs.h quickjs-libc.h
cp quickjs.h quickjs-libc.h quickjs-ng-util.h $(TEMP)
cd $(TEMP) && zip -9 quickjs-amalgam.zip quickjs-amalgam.c quickjs.h quickjs-libc.h quickjs-ng-util.h
cp $(TEMP)/quickjs-amalgam.zip $(BUILD_DIR)
cd $(TEMP) && $(RM) quickjs-amalgam.zip quickjs-amalgam.c quickjs.h quickjs-libc.h
cd $(TEMP) && $(RM) quickjs-amalgam.zip quickjs-amalgam.c quickjs.h quickjs-libc.h quickjs-ng-util.h
$(RM) -d $(TEMP)

fuzz:
Expand Down
2 changes: 2 additions & 0 deletions amalgam.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const quickjs_c_atomics_h = loadFile("quickjs-c-atomics.h")
const quickjs_h = loadFile("quickjs.h")
const quickjs_libc_c = loadFile("quickjs-libc.c")
const quickjs_libc_h = loadFile("quickjs-libc.h")
const quickjs_ng_util_h = loadFile("quickjs-ng-util.h")
const quickjs_opcode_h = loadFile("quickjs-opcode.h")
const gen_builtin_array_fromasync_h = loadFile("builtin-array-fromasync.h")

Expand All @@ -30,6 +31,7 @@ let source = "#if defined(QJS_BUILD_LIBC) && defined(__linux__) && !defined(_GNU
+ libunicode_h // exports lre_is_id_start, used by libregexp.h
+ libregexp_h
+ libunicode_table_h
+ quickjs_ng_util_h
+ quickjs_h
+ quickjs_c
+ cutils_c
Expand Down
83 changes: 57 additions & 26 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ project(
default_options: [
'c_std=gnu11,c11',
'warning_level=3',
'default_library=static',
],
license: 'MIT',
license_files: 'LICENSE',
Expand All @@ -15,6 +14,8 @@ project(
host_system = host_machine.system()
cc = meson.get_compiler('c')

add_project_arguments('-DQUICKJS_NG_BUILD', language: 'c')

qjs_gcc_warning_args = [
'-Wno-unsafe-buffer-usage',
'-Wno-sign-conversion',
Expand Down Expand Up @@ -131,14 +132,14 @@ qjs_sys_deps += dependency('threads', required: false)
qjs_sys_deps += dependency('dl', required: false)

qjs_srcs = files(
'cutils.c',
'dtoa.c',
'libregexp.c',
'libunicode.c',
'quickjs.c',
)
qjs_hdrs = files(
'quickjs.h',
'quickjs-ng-util.h'
)

qjs_libc = get_option('libc')
Expand All @@ -147,6 +148,10 @@ qjs_libc_hdrs = files('quickjs-libc.h')

if qjs_libc
qjs_hdrs += qjs_libc_hdrs
add_project_arguments(
'-DQJS_BUILD_LIBC',
language: 'c'
)
endif

qjs_parser = get_option('parser')
Expand All @@ -161,18 +166,18 @@ if not qjs_parser
qjs_c_args += ['-DQJS_DISABLE_PARSER']
endif

qjs_libc_lib = static_library(
'quickjs-libc',
qjs_libc_srcs,
cutils_lib = static_library(
'cutils',
'cutils.c',

dependencies: qjs_sys_deps,
c_args: qjs_c_args,
gnu_symbol_visibility: 'hidden',
c_args: qjs_c_args
)

qjs_lib = library(
'qjs',
qjs_srcs,
qjs_libc ? qjs_libc_srcs : [],

# export public headers
generator(
Expand All @@ -182,8 +187,9 @@ qjs_lib = library(
).process(qjs_hdrs),

dependencies: qjs_sys_deps,
link_whole: qjs_libc ? qjs_libc_lib : [],
c_args: qjs_c_args,
link_with: cutils_lib,
c_args: [qjs_c_args, '-DQUICKJS_NG_QJS_INTERNAL'],
c_shared_args: ['-DQUICKJS_NG_DLL'],
gnu_symbol_visibility: 'hidden',

install: true,
Expand All @@ -194,13 +200,42 @@ qjs_export_variables = [
f'have_parser=@qjs_parser@'
]

# Be conservative here: only pass -DQUICKJS_NG_DLL iff default_library ==
# 'shared', thus qjs is guarranteed to be a DLL. Not passing -DQUICKJS_NG_DLL if
# qjs is a DLL is not harmful, but passing the definition for DLL qjs is desired.
# Alternatively, if -DQUICKJS_NG_DLL is passed for static qjs, the consumers
# will not compile.
qjs_dep_args = get_option('default_library') == 'shared' ? ['-DQUICKJS_NG_DLL'] : []

qjs_dep = declare_dependency(
compile_args: qjs_dep_args,
link_with: qjs_lib,
dependencies: qjs_sys_deps,
include_directories: qjs_lib.private_dir_include(),
variables: qjs_export_variables,
)


if qjs_libc
qjs_libc_dep = declare_dependency(
dependencies: qjs_dep
)
else
qjs_libc_lib = static_library(
'quickjs-libc',
qjs_libc_srcs,

c_args: qjs_c_args,
link_with: cutils_lib,
dependencies: [qjs_sys_deps, qjs_dep],
gnu_symbol_visibility: 'hidden',
)
qjs_libc_dep = declare_dependency(
dependencies: qjs_dep,
link_with: qjs_libc_lib
)
endif

if host_system == 'emscripten'
qjs_wasm_export_name = 'getQuickJs'
executable(
Expand Down Expand Up @@ -272,9 +307,8 @@ qjsc_exe = executable(
qjsc_srcs,

c_args: qjs_c_args,
link_with: qjs_libc ? [] : qjs_libc_lib,
dependencies: qjs_dep,

link_with: [cutils_lib],
dependencies: [qjs_dep, qjs_libc_dep],
install: true,
)

Expand All @@ -298,8 +332,8 @@ qjs_exe = executable(
qjs_exe_srcs,

c_args: qjs_c_args,
link_with: qjs_libc ? [] : qjs_libc_lib,
dependencies: [qjs_dep, mimalloc_dep],
link_with: [cutils_lib],
dependencies: [qjs_dep, qjs_libc_dep, mimalloc_dep],
export_dynamic: true,

install: true,
Expand All @@ -326,7 +360,7 @@ if meson.is_cross_build()
qjs_libc_srcs,

dependencies: qjs_sys_native_deps,
c_args: qjs_c_args,
c_args: [qjs_c_args, '-DQUICKJS_NG_QJS_INTERNAL'],
gnu_symbol_visibility: 'hidden',

build_by_default: false,
Expand Down Expand Up @@ -379,10 +413,10 @@ if tests.allowed()
run262_exe = executable(
'run-test262',
'run-test262.c',
qjs_libc_srcs,

link_with: cutils_lib,
c_args: qjs_c_args,
dependencies: qjs_dep,
dependencies: [qjs_dep, qjs_libc_dep]
)

test(
Expand Down Expand Up @@ -482,6 +516,7 @@ if tests.allowed()
'api-test',
'api-test.c',

link_with: cutils_lib,
c_args: qjs_c_args,
dependencies: qjs_dep,
build_by_default: false,
Expand All @@ -494,10 +529,9 @@ if tests.allowed()
executable(
'function_source',
'gen/function_source.c',
qjs_libc_srcs,

c_args: qjs_c_args,
dependencies: qjs_dep,
dependencies: [qjs_dep, qjs_libc_dep],
build_by_default: false,
),
)
Expand All @@ -506,9 +540,9 @@ endif
# Unicode generator
unicode_gen = executable(
'unicode_gen',
'cutils.c',
'unicode_gen.c',

link_with: cutils_lib,
c_args: qjs_c_args,
build_by_default: false,
)
Expand Down Expand Up @@ -605,19 +639,17 @@ if examples.allowed()
executable(
'hello',
'gen/hello.c',
qjs_libc_srcs,

c_args: qjs_c_args,
dependencies: qjs_dep,
dependencies: [qjs_dep, qjs_libc_dep]
)

executable(
'hello_module',
'gen/hello_module.c',
qjs_libc_srcs,

c_args: qjs_c_args,
dependencies: qjs_dep,
dependencies: [qjs_dep, qjs_libc_dep]
)

subdir('examples')
Expand All @@ -626,10 +658,9 @@ if examples.allowed()
'test_fib',
'examples/fib.c',
'gen/test_fib.c',
qjs_libc_srcs,

c_args: qjs_c_args,
dependencies: qjs_dep,
dependencies: [qjs_dep, qjs_libc_dep],
export_dynamic: true,
)
endif
Loading
Loading