diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 271 |
1 files changed, 171 insertions, 100 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d488ad43..e9bc50fee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,8 +67,14 @@ elseif(CMAKE_BUILD_TYPE STREQUAL "Release") endif() # --- Build Flags --- -set(DEFAULT_ON_UNLESS_WINDOWS $<NOT:$<BOOL:${WIN32}>>) -set(DEFAULT_ON_UNLESS_APPLE $<NOT:$<BOOL:${APPLE}>>) +set(DEFAULT_ON_UNLESS_WINDOWS ON) +if (WIN32) + set(DEFAULT_ON_UNLESS_WINDOWS OFF) +endif() +set(DEFAULT_ON_UNLESS_APPLE ON) +if (APPLE) + set(DEFAULT_ON_UNLESS_APPLE OFF) +endif() option(USE_STATIC_SQLITE "Statically link SQLite?" ${DEFAULT_ON_UNLESS_APPLE}) option(USE_CUSTOM_ZLIB "Use Bun's recommended version of zlib" ${DEFAULT_ON_UNLESS_WINDOWS}) @@ -115,9 +121,7 @@ endfunction() find_program(ZIG_COMPILER zig REQUIRED DOC "Path to the Zig compiler" VALIDATOR validate_zig) message(STATUS "Found Zig Compiler: ${ZIG_COMPILER}") -# An existing Buntime. This is a sort of chicken-and-egg problem where you need `bun` to build `bun` -# maybe in the future we can make it possible to use bun-polyfills in combination -# with Node to fufill this requirement. +# Bun find_program(BUN_EXECUTABLE bun REQUIRED DOC "Path to an already built release of Bun") # CCache @@ -165,13 +169,33 @@ if(NOT DEFINED ASSERT_ENABLED) endif() message(STATUS "C++ Assertions: ${ASSERT_ENABLED}") -# --- +# --- CMake Macros --- + +# Append the given dependencies to the source file +macro(WEBKIT_ADD_SOURCE_DEPENDENCIES _source _deps) + set(_tmp) + get_source_file_property(_tmp ${_source} OBJECT_DEPENDS) + if (NOT _tmp) + set(_tmp "") + endif () + + foreach (f ${_deps}) + list(APPEND _tmp "${f}") + endforeach () + + set_source_files_properties(${_source} PROPERTIES OBJECT_DEPENDS "${_tmp}") + unset(_tmp) +endmacro() + +# --- BUILD --- set(BUN_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src") -set(BUN_WORKDIR "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${bun}.dir") +set(BUN_WORKDIR "${CMAKE_CURRENT_BINARY_DIR}") set(BUN_DEPS_DIR "${BUN_SRC}/deps") set(BUN_CODEGEN_SRC "${BUN_SRC}/codegen") +message(STATUS "Temp Directory: ${BUN_WORKDIR}") + file(GLOB BUN_CPP CONFIGURE_DEPENDS "${BUN_SRC}/deps/*.cpp" "${BUN_SRC}/io/*.cpp" @@ -202,87 +226,129 @@ file(GLOB BUN_CLASSES_TS CONFIGURE_DEPENDS "${BUN_SRC}/bun.js/node/*.classes.ts" ) add_custom_command( - OUTPUT "${BUN_WORKDIR}/generated-classes/ZigGeneratedClasses.h" - "${BUN_WORKDIR}/generated-classes/ZigGeneratedClasses.cpp" - "${BUN_WORKDIR}/generated-classes/ZigGeneratedClasses+lazyStructureHeader.h" - "${BUN_WORKDIR}/generated-classes/ZigGeneratedClasses+DOMClientIsoSubspaces.h" - "${BUN_WORKDIR}/generated-classes/ZigGeneratedClasses+DOMIsoSubspaces.h" - "${BUN_WORKDIR}/generated-classes/ZigGeneratedClasses+lazyStructureImpl.h" - "${BUN_WORKDIR}/generated-classes/ZigGeneratedClasses.zig" - COMMAND ${BUN_EXECUTABLE} "${BUN_CODEGEN_SRC}/generate-classes.ts" ${BUN_CLASSES_TS} "${BUN_WORKDIR}/generated-classes" + OUTPUT "${BUN_WORKDIR}/codegen/ZigGeneratedClasses.h" + "${BUN_WORKDIR}/codegen/ZigGeneratedClasses.cpp" + "${BUN_WORKDIR}/codegen/ZigGeneratedClasses+lazyStructureHeader.h" + "${BUN_WORKDIR}/codegen/ZigGeneratedClasses+DOMClientIsoSubspaces.h" + "${BUN_WORKDIR}/codegen/ZigGeneratedClasses+DOMIsoSubspaces.h" + "${BUN_WORKDIR}/codegen/ZigGeneratedClasses+lazyStructureImpl.h" + "${BUN_WORKDIR}/codegen/ZigGeneratedClasses.zig" + COMMAND ${BUN_EXECUTABLE} "${BUN_CODEGEN_SRC}/generate-classes.ts" ${BUN_CLASSES_TS} "${BUN_WORKDIR}/codegen" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} MAIN_DEPENDENCY "${BUN_CODEGEN_SRC}/generate-classes.ts" DEPENDS ${BUN_CLASSES_TS} VERBATIM COMMENT "Generating *.classes.ts bindings" ) -include_directories("${BUN_WORKDIR}/generated-classes") - -# JSSink generator -# add_custom_command( -# OUTPUT "${BUN_SRC}/bun.js/bindings/JSSink.cpp" -# "${BUN_SRC}/bun.js/bindings/JSSink.h" -# COMMAND ${BUN_EXECUTABLE} "src/codegen/generate-jssink.ts" -# VERBATIM -# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -# COMMENT "Generating JSSink" -# ) - -# # Append the given dependencies to the source file -# macro(WEBKIT_ADD_SOURCE_DEPENDENCIES _source _deps) -# set(_tmp) -# get_source_file_property(_tmp ${_source} OBJECT_DEPENDS) -# if (NOT _tmp) -# set(_tmp "") -# endif () - -# foreach (f ${_deps}) -# list(APPEND _tmp "${f}") -# endforeach () - -# set_source_files_properties(${_source} PROPERTIES OBJECT_DEPENDS "${_tmp}") -# unset(_tmp) -# endmacro() - -# # LUT generator -# file(Bun_OBJECT_LUT_SOURCES -# src/bun.js/bindings/BunObject.cpp -# src/bun.js/bindings/ZigGlobalObject.lut.txt -# src/bun.js/bindings/JSBuffer.cpp -# src/bun.js/bindings/Process.cpp -# src/bun.js/bindings/ProcessBindingConstants.cpp -# src/bun.js/bindings/ProcessBindingNatives.cpp -# ) -# set(HASH_LUT_GENERATOR ${BUN_SRC}/codegen/create_hash_table) - -# macro(GENERATE_HASH_LUT _input _output) -# add_custom_command( -# OUTPUT ${_output} -# MAIN_DEPENDENCY ${HASH_LUT_GENERATOR} -# DEPENDS ${_input} -# COMMAND ${PERL_EXECUTABLE} ${HASH_LUT_GENERATOR} ${_input} > ${_output} -# VERBATIM) -# list(APPEND JavaScriptCore_HEADERS ${_output}) -# WEBKIT_ADD_SOURCE_DEPENDENCIES(${_input} ${_output}) -# endmacro() - -# # GENERATOR 1-A: LUT creator -# foreach(_file ${JavaScriptCore_OBJECT_LUT_SOURCES}) -# get_filename_component(_name ${_file} NAME_WE) -# GENERATE_HASH_LUT(${CMAKE_CURRENT_SOURCE_DIR}/${_file} ${JavaScriptCore_DERIVED_SOURCES_DIR}/${_name}.lut.h) -# endforeach() - -set(IDENTIFIER_CACHE_FILES + +# --- JSSink Generator --- +add_custom_command( + OUTPUT "${BUN_WORKDIR}/codegen/JSSink.cpp" + "${BUN_WORKDIR}/codegen/JSSink.h" + COMMAND ${BUN_EXECUTABLE} "src/codegen/generate-jssink.ts" "${BUN_WORKDIR}/codegen" + VERBATIM + MAIN_DEPENDENCY "src/codegen/generate-jssink.ts" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Generating JSSink" +) + +# --- .lut.h Generator --- +set(BUN_OBJECT_LUT_SOURCES + bun.js/bindings/BunObject.cpp + bun.js/bindings/ZigGlobalObject.lut.txt + bun.js/bindings/JSBuffer.cpp + bun.js/bindings/Process.cpp + bun.js/bindings/ProcessBindingConstants.cpp + bun.js/bindings/ProcessBindingNatives.cpp +) +set(BUN_HASH_LUT_GENERATOR "${BUN_CODEGEN_SRC}/create-hash-table.ts") +macro(GENERATE_HASH_LUT _input _output _display_name) + + add_custom_command( + OUTPUT ${_output} + MAIN_DEPENDENCY ${BUN_HASH_LUT_GENERATOR} + DEPENDS ${_input} + COMMAND ${BUN_EXECUTABLE} ${BUN_HASH_LUT_GENERATOR} ${_input} ${_output} + VERBATIM + COMMENT "Generating ${_display_name}" + ) + # list(APPEND JavaScriptCore_HEADERS ${_output}) + WEBKIT_ADD_SOURCE_DEPENDENCIES(${_input} ${_output}) +endmacro() +foreach(_file ${BUN_OBJECT_LUT_SOURCES}) + get_filename_component(_name ${_file} NAME_WE) + + # workaround for ZigGlobalObject + if(_name MATCHES "ZigGlobalObject") + set(_name "ZigGlobalObject") + endif() + + GENERATE_HASH_LUT(${BUN_SRC}/${_file} ${BUN_WORKDIR}/codegen/${_name}.lut.h ${_name}.lut.h) +endforeach() + +WEBKIT_ADD_SOURCE_DEPENDENCIES(${BUN_SRC}/bun.js/bindings/ZigGlobalObject.cpp ${BUN_WORKDIR}/codegen/ZigGlobalObject.lut.h) + +# --- Identifier Cache --- +set(BUN_IDENTIFIER_CACHE_OUT "${BUN_SRC}/js_lexer/id_continue_bitset.blob" "${BUN_SRC}/js_lexer/id_continue_bitset.meta.blob" "${BUN_SRC}/js_lexer/id_start_bitset.blob" "${BUN_SRC}/js_lexer/id_start_bitset.meta.blob") +add_custom_command( + OUTPUT ${BUN_IDENTIFIER_CACHE_OUT} + MAIN_DEPENDENCY "${BUN_SRC}/js_lexer/identifier_data.zig" + DEPENDS "${BUN_SRC}/js_lexer/identifier_cache.zig" + COMMAND ${ZIG_COMPILER} run "${BUN_SRC}/js_lexer/identifier_data.zig" + VERBATIM + COMMENT "Building Identifier Cache" +) + +# --- Bundled TS/JS --- +# Note: It's not worth doing this in parallel at the CMake/Ninja level, because this bundling +# requires all the JS files to be known, but also Bun will use all cores during bundling anyways. +file(GLOB BUN_TS_MODULES CONFIGURE_DEPENDS + "${BUN_SRC}/js/node/*.ts" + "${BUN_SRC}/js/node/*.js" + "${BUN_SRC}/js/bun/*.js" + "${BUN_SRC}/js/bun/*.ts" + "${BUN_SRC}/js/thirdparty/*.js" + "${BUN_SRC}/js/thirdparty/*.ts" + "${BUN_SRC}/js/internal/*.js" + "${BUN_SRC}/js/internal/*.ts" +) +file(GLOB BUN_TS_FUNCTIONS CONFIGURE_DEPENDS "${BUN_SRC}/js/builtins/*.ts") + +add_custom_command( + OUTPUT + "${BUN_WORKDIR}/js/InternalModuleRegistryConstants.h" + "${BUN_WORKDIR}/js/InternalModuleRegistry+createInternalModuleById.h" + "${BUN_WORKDIR}/js/InternalModuleRegistry+enum.h" + "${BUN_WORKDIR}/js/InternalModuleRegistry+numberOfModules.h" + "${BUN_WORKDIR}/js/NativeModuleImpl.h" + "${BUN_WORKDIR}/js/ResolvedSourceTag.zig" + "${BUN_WORKDIR}/js/SyntheticModuleType.h" + COMMAND ${BUN_EXECUTABLE} "${BUN_SRC}/codegen/bundle-modules.ts" "${BUN_WORKDIR}" + DEPENDS ${BUN_TS_MODULES} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Bundling JS modules" +) +WEBKIT_ADD_SOURCE_DEPENDENCIES(${BUN_SRC}/bun.js/bindings/InternalModuleRegistry.cpp "${BUN_WORKDIR}/js/InternalModuleRegistryConstants.h") + +add_custom_command( + OUTPUT "${BUN_WORKDIR}/js/WebCoreJSBuiltins.cpp" "${BUN_WORKDIR}/js/WebCoreJSBuiltins.h" + COMMAND ${BUN_EXECUTABLE} "${BUN_SRC}/codegen/bundle-functions.ts" "${BUN_WORKDIR}" + DEPENDS ${BUN_TS_FUNCTIONS} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Bundling JS builtin functions" +) + +# --- Zig Object --- file(GLOB ZIG_FILES "${BUN_SRC}/*.zig" - "${BUN_SRC}/*/*.zig" - "${BUN_SRC}/*/**/*.zig" - "${BUN_SRC}/*/*/*/*.zig" + "${BUN_SRC}/**/*.zig" + "${BUN_SRC}/**/**/*.zig" + "${BUN_SRC}/**/**/**/*.zig" ) set(BUN_ZIG_OBJ "${BUN_WORKDIR}/${bun}.o") @@ -290,33 +356,39 @@ add_custom_command( OUTPUT "${BUN_ZIG_OBJ}" COMMAND "${ZIG_COMPILER}" "build" "obj" "-Doptimize=${ZIG_OPTIMIZE}" - "-Doutput-dir=${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${bun}.dir" + "-Doutput-dir=${BUN_WORKDIR}" "-Dcpu=${CPU_TARGET}" - "-Dgenerated-files=${BUN_WORKDIR}" - - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/build.zig ${ZIG_FILES} "${BUN_WORKDIR}/generated-classes/ZigGeneratedClasses.zig" + "-Dgenerated-code=${BUN_WORKDIR}/codegen" + DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/build.zig" + "${ZIG_FILES}" + "${BUN_WORKDIR}/codegen/ZigGeneratedClasses.zig" + "${BUN_WORKDIR}/js/ResolvedSourceTag.zig" + "${BUN_IDENTIFIER_CACHE_OUT}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Building zig code" VERBATIM USES_TERMINAL ) -# add_executable(${bun} ${BUN_CPP} ${USOCKETS_FILES} ${BUN_ZIG_OBJ} ${EXTRA_SRC}) -add_executable(${bun} "/Users/dave/code/bun/src/bun.js/bindings/JSSocketAddress.cpp" "${BUN_ZIG_OBJ}") +# -- The Buntime™️ --- +add_executable( + ${bun} + + ${BUN_CPP} + ${USOCKETS_FILES} + ${BUN_ZIG_OBJ} + "${BUN_WORKDIR}/codegen/JSSink.cpp" + "${BUN_WORKDIR}/codegen/ZigGeneratedClasses.cpp" + "${BUN_WORKDIR}/js/WebCoreJSBuiltins.cpp" + "${BUN_ZIG_OBJ}" +) # Set /subsystem:console on bun for windows if (WIN32) set_target_properties(${bun} PROPERTIES LINK_FLAGS " /SUBSYSTEM:CONSOLE ") endif() -# TODO: not good enough -# add_custom_command( -# TARGET bun PRE_BUILD -# COMMAND ${BUN_EXECUTABLE} "${BUN_SRC}/js/_codegen/index.ts" -# DEPENDS "${BUN_SRC}/js/**/*.{js,ts}" -# COMMENT "Bundling JS modules" -# ) - set_target_properties(${bun} PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED YES @@ -349,10 +421,10 @@ add_compile_definitions( "BUILDING_JSCONLY__" "NDEBUG=$<IF:$<CONFIG:ASSERT_ENABLED>,0,1>" "ASSERT_ENABLED=$<IF:$<CONFIG:ASSERT_ENABLED>,1,0>" + "BUN_DYNAMIC_JS_LOAD_PATH=\"${BUN_WORKDIR}/js\"" ) include_directories( - packages/bun-uws - packages + packages/ packages/bun-usockets packages/bun-usockets/src src/bun.js/bindings @@ -360,8 +432,6 @@ include_directories( src/bun.js/bindings/webcrypto src/bun.js/bindings/sqlite src/bun.js/modules - src/js/out - src/js/out/modules src/js/builtins src/napi src/deps @@ -374,6 +444,8 @@ include_directories( ${WEBKIT_DIR}/JavaScriptCore/PrivateHeaders ${WEBKIT_DIR}/bmalloc/PrivateHeaders ${WEBKIT_DIR}/WTF/PrivateHeaders + "${BUN_WORKDIR}/codegen" + "${BUN_WORKDIR}/js" ) if (CMAKE_BUILD_TYPE STREQUAL "Debug") @@ -384,7 +456,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug") string(APPEND CMAKE_CXX_FLAGS " /O1") string(APPEND CMAKE_C_FLAGS " /O1") endif() - add_compile_definitions("BUN_DEBUG") + add_compile_definitions("BUN_DEBUG=1") elseif (NOT MSVC) string(APPEND CMAKE_CXX_FLAGS " -O3 -femit-llvm" ) string(APPEND CMAKE_C_FLAGS " -O3 -femit-llvm") @@ -400,6 +472,8 @@ if (WIN32) "_CRT_SECURE_NO_WARNINGS" "WIN32_LEAN_AND_MEAN=1" ) + + set_property(TARGET ${bun} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreadedDLL") endif() # if clang @@ -567,7 +641,6 @@ else () target_link_libraries(${bun} PRIVATE c-ares::cares) endif() - if (USE_CUSTOM_BASE64) include_directories(src/deps/base64/include) if (WIN32) @@ -593,10 +666,6 @@ if (NOT WIN32) endif() endif() -set_property(TARGET ${bun} PROPERTY - MSVC_RUNTIME_LIBRARY "MultiThreadedDLL" -) - if (USE_CUSTOM_LOLHTML) if (WIN32) target_link_libraries(${bun} PRIVATE "${BUN_DEPS_DIR}/lolhtml.lib") @@ -615,15 +684,17 @@ if (WIN32) find_package(libuv CONFIG REQUIRED ) target_link_libraries(${bun} PRIVATE $<IF:$<TARGET_EXISTS:libuv::uv_a>,libuv::uv_a,libuv::uv>) endif() - + message(STATUS "Found libuv: ${libuv_LIBRARIES}") endif() if (USE_STATIC_SQLITE) add_library(sqlite3 STATIC src/bun.js/bindings/sqlite/sqlite3.c) target_include_directories(sqlite3 PUBLIC src/bun.js/bindings/sqlite) target_link_libraries(bun PRIVATE sqlite3) + message(STATUS "Using static sqlite3") target_compile_definitions(${bun} PRIVATE "LAZY_LOAD_SQLITE=0") else() + message(STATUS "Using dynamicly linked sqlite3") target_compile_definitions(${bun} PRIVATE "LAZY_LOAD_SQLITE=1") endif() |