From bcf027c35c2ab00e0040e010ee8514d162bedb7a Mon Sep 17 00:00:00 2001 From: dave caruso Date: Fri, 20 Oct 2023 18:28:05 -0700 Subject: [PATCH] chaos chaos chaos --- .scripts/postinstall.sh | 7 - CMakeLists.txt | 303 ++++++++++++++++++++++------------ bun.lockb | Bin 74368 -> 72626 bytes package.json | 1 - src/bun.js/WebKit | 2 +- src/codegen/bundle-modules.ts | 2 +- 6 files changed, 196 insertions(+), 119 deletions(-) diff --git a/.scripts/postinstall.sh b/.scripts/postinstall.sh index 89c7332034..d08cc5effa 100755 --- a/.scripts/postinstall.sh +++ b/.scripts/postinstall.sh @@ -1,13 +1,6 @@ #!/bin/bash set -euxo pipefail -# if bun-webkit node_modules directory exists -if [ -d ./node_modules/bun-webkit ] || [ -d ./node_modules/bun-webkit-debug ]; then - rm -f bun-webkit - # get the first matching bun-webkit-* directory name - ln -s ./node_modules/$(ls ./node_modules | grep bun-webkit- | grep -v bun-webkit-debug | head -n 1) ./bun-webkit -fi - # sets up vscode C++ intellisense rm -f .vscode/clang++ ln -s $(which clang++-16 || which clang++) .vscode/clang++ 2>/dev/null diff --git a/CMakeLists.txt b/CMakeLists.txt index 37ccebff66..b28e8ead2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,14 +3,11 @@ cmake_minimum_required(VERSION 3.22) cmake_policy(SET CMP0091 NEW) cmake_policy(SET CMP0067 NEW) -set(CMAKE_COLOR_DIAGNOSTICS ON) -set(CMAKE_CXX_STANDARD 20) -set(CMAKE_C_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_C_STANDARD_REQUIRED ON) +set(Bun_VERSION "1.0.7") +set(WEBKIT_TAG 1a49a1f94bf42ab4f8c6b11d7bbbb21e491d2d62) set(BUN_WORKDIR "${CMAKE_CURRENT_BINARY_DIR}") -message(STATUS "Building in ${BUN_WORKDIR}") +message(STATUS "Configuring Bun ${Bun_VERSION} in ${BUN_WORKDIR}") # --- Build Type --- # This is done at the start simply so this is the first message printed @@ -36,36 +33,98 @@ elseif(CMAKE_BUILD_TYPE STREQUAL "Release") endif() # --- LLVM --- -# This has to be done before `project` in order to override the default compiler -if(UNIX) - set(LLVM_VERSION 17) - - find_path( - LLVM_PREFIX - NAMES bin/clang++-${LLVM_VERSION} bin/clang-${LLVM_VERSION} bin/clang++ bin/clang - PATHS ENV PATH /usr /usr/local /opt/homebrew/opt/llvm@${LLVM_VERSION} /opt/homebrew - DOC "Path to LLVM binary directory" +# This detection is a little overkill, but it ensures that the set LLVM_VERSION matches under +# any case possible. Sorry for the complexity... +# +# Bun and WebKit must be compiled with the same compiler, so we do as much as we can to ensure that +# the compiler used for the prebuilt WebKit, LLVM 16, is the one that we detect in this process. +# +# It has to be done before project() is called, so that CMake doesnt pick a compiler for us, but even then +# we do some extra work afterwards to double-check, and we will rerun BUN_FIND_LLVM if the compiler did not match. +# +# If the user passes -DLLVM_PREFIX, most of this logic is skipped, but we still warn if invalid. +set(LLVM_VERSION 16) +macro(BUN_FIND_LLVM) + find_program( + _LLVM_CLANG_PATH + NAMES clang++-${LLVM_VERSION} clang-${LLVM_VERSION} clang++ clang + PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} + DOC "Path to LLVM ${LLVM_VERSION}'s clang++ binary. Please pass -DLLVM_PREFIX with the path to LLVM" ) - if(LLVM_PREFIX MATCHES "/$") - string(REGEX REPLACE "/$" "" LLVM_PREFIX "${LLVM_PREFIX}") + if(NOT _LLVM_CLANG_PATH) + message(FATAL_ERROR "Could not find LLVM ${LLVM_VERSION}, search paths: ${PLATFORM_LLVM_SEARCH_PATHS}") endif() + set(CMAKE_CXX_COMPILER ${_LLVM_CLANG_PATH}) + set(CMAKE_C_COMPILER ${_LLVM_CLANG_PATH}) + find_program( + STRIP + NAMES llvm-strip + PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} + DOC "Path to LLVM ${LLVM_VERSION}'s llvm-strip binary" + ) + find_program( + DSYMUTIL + NAMES dsymutil + PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} + DOC "Path to LLVM ${LLVM_VERSION}'s dsymutil binary" + ) + find_program( + AR + NAMES llvm-ar + PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} + DOC "Path to LLVM ${LLVM_VERSION}'s llvm-ar binary" + ) + find_program( + RANLIB + NAMES llvm-ranlib + PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} + DOC "Path to LLVM ${LLVM_VERSION}'s llvm-ar binary" + ) - if (NOT EXISTS "${LLVM_PREFIX}/bin/clang") - message(FATAL_ERROR "Could not find LLVM ${LLVM_VERSION} installed on your system.") + execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE _tmp) + string(REGEX MATCH "version ([0-9]+)\\.([0-9]+)\\.([0-9]+)" CMAKE_CXX_COMPILER_VERSION "${_tmp}") + set(CMAKE_CXX_COMPILER_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") +endmacro() +if(UNIX) + if(LLVM_PREFIX) + set(PLATFORM_LLVM_SEARCH_PATHS ${LLVM_PREFIX}/bin) + else() + set(PLATFORM_LLVM_SEARCH_PATHS /usr/lib/llvm-${LLVM_VERSION}/bin /lib/llvm-${LLVM_VERSION}/bin /usr/bin /usr/local/bin) + if(APPLE) + set(PLATFORM_LLVM_SEARCH_PATHS /opt/homebrew/opt/llvm@${LLVM_VERSION}/bin /opt/homebrew/bin ${PLATFORM_LLVM_SEARCH_PATHS}) + endif() endif() - - set(CMAKE_CXX_COMPILER "${LLVM_PREFIX}/bin/clang++" CACHE STRING "CMAKE_CXX_COMPILER" FORCE) - set(CMAKE_C_COMPILER "${LLVM_PREFIX}/bin/clang" CACHE STRING "CMAKE_C_COMPILER" FORCE) - set(CMAKE_CXX_COMPILER_ID "Clang" CACHE STRING "CMAKE_CXX_COMPILER_ID" FORCE) - set(STRIP "${LLVM_PREFIX}/bin/llvm-strip") - set(DSYMUTIL "${LLVM_PREFIX}/bin/dsymutil") - - message(STATUS "Found LLVM ${LLVM_VERSION}: ${LLVM_PREFIX}") + if(CMAKE_CXX_COMPILER) + set(_LLVM_CLANG_PATH "${CMAKE_CXX_COMPILER}") + endif() + BUN_FIND_LLVM() else() - set(STRIP "strip") + # On windows it is expected to use MSVC, and until we get a better build configuration, it is a free-for-all endif() -project(Bun VERSION "1.0.7") +set(CMAKE_COLOR_DIAGNOSTICS ON) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_C_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_STANDARD_REQUIRED ON) + +project(Bun VERSION "${Bun_VERSION}") + +# More effort to prevent using the wrong C++ compiler +if(UNIX) + if((NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (NOT CMAKE_CXX_COMPILER_VERSION MATCHES "^${LLVM_VERSION}\.")) + # Attempt to auto-correct the compiler + message(STATUS "Compiler mismatch, attempting to auto-correct") + unset(_LLVM_CLANG_PATH) + BUN_FIND_LLVM() + if((NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (NOT CMAKE_CXX_COMPILER_VERSION MATCHES "^${LLVM_VERSION}\.")) + message(WARNING "Expected LLVM ${LLVM_VERSION} as the C++ compiler, build may fail or break at runtime.") + endif() + endif() +endif() + +message(STATUS "C++ Compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} at ${CMAKE_CXX_COMPILER}") +# --- End LLVM --- set(DEFAULT_ON_UNLESS_WINDOWS ON) set(REQUIRED_IF_NOT_WINDOWS "REQUIRED") @@ -96,6 +155,7 @@ option(USE_CUSTOM_LOLHTML "Use Bun's recommended version of lolhtml" ON) option(USE_CUSTOM_TINYCC "Use Bun's recommended version of tinycc" ON) option(USE_CUSTOM_LIBUV "Use Bun's recommended version of libuv (Windows only)" OFF) option(USE_BASELINE_BUILD "Build Bun for baseline (older) CPUs" OFF) +option(USE_DEBUG_JSC "Enable assertions and use a debug build of JavaScriptCore" OFF) option(USE_UNIFIED_SOURCES "Use unified sources to speed up the build" OFF) option(CANARY "Make `bun --revision` report a canary release" OFF) @@ -126,12 +186,8 @@ if(WIN32) set(ZIG_TARGET "${ARCH}-windows-msvc") endif() - -if(USE_CONFIGURE_DEPENDS) - set(CONFIGURE_DEPENDS "CONFIGURE_DEPENDS") -else() - set(CONFIGURE_DEPENDS "") -endif() +# set(CONFIGURE_DEPENDS "") +set(CONFIGURE_DEPENDS "CONFIGURE_DEPENDS") # --- CLI Paths --- @@ -178,58 +234,104 @@ if(CCACHE_PROGRAM) message(STATUS "Using ccache: ${CCACHE_PROGRAM}") endif() -# --- Dependencies --- - -if(NOT WIN32) - # WebKit - if(NOT WEBKIT_DIR) - # TODO: allow this to point to the actual webkit cmake file to allow easier rebuilds - find_path( - WEBKIT_DIR - NAMES lib/libJavaScriptCore.a - PATHS - ${CMAKE_CURRENT_SOURCE_DIR}/bun-webkit - DOC "Path to WebKit build directory" - ) - # ensure libWTF.a, libJavaScriptCore.a, and libbmalloc.a exist - if(NOT WEBKIT_DIR) - message(FATAL_ERROR "Could not find WebKit build directory. Please set WEBKIT_DIR to the directory containing lib/libJavaScriptCore.a. Did you forget to run `bun install` beforehand.") - endif() - if (NOT EXISTS "${WEBKIT_DIR}/lib/libWTF.a" OR NOT EXISTS "${WEBKIT_DIR}/lib/libJavaScriptCore.a" OR NOT EXISTS "${WEBKIT_DIR}/lib/libbmalloc.a") - message(FATAL_ERROR "WebKit directory ${WEBKIT_DIR} does not contain all the required files for Bun.") - endif() - endif() - set(WEBKIT_INCLUDE_DIR "${WEBKIT_DIR}/include") - message(STATUS "Found WebKit: ${WEBKIT_DIR}") - - # C++ Assertions - # It is very important that the value of ASSERT_ENABLED is the same for both Bun and WebKit, - # If this is not the case, everything will crash as the sizes and offsets of things will be different - if(NOT DEFINED ASSERT_ENABLED) - if(WEBKIT_DIR MATCHES "/bun-webkit$|WebKitBuild/Release$") - set(ASSERT_ENABLED "0") - elseif(WEBKIT_DIR MATCHES "/WebKitBuild/Debug$") - set(ASSERT_ENABLED "1") - else() - message(WARNING "Could not guess default value for ASSERT_ENABLED.") - set(ASSERT_ENABLED "0") - endif() - endif() - if(ASSERT_ENABLED) - message(STATUS "C++ Assertions: ON") - else() - message(STATUS "C++ Assertions: OFF") - endif() +# --- WebKit --- +# WebKit is either prebuilt and distributed via NPM, or you can pass WEBKIT_DIR to use a local build. +# We cannot include their CMake build files (TODO: explain why, for now ask @paperdave why) +# +# On Unix, this will pull from NPM the single package that is needed and use that +if(WIN32) + set(WEBKIT_LIB_BASENAME "lib64") else() - # TODO: Real checking - set(WEBKIT_DIR "C:/Users/windo/Code/WebKit/bun-webkit-x64") - set(WEBKIT_INCLUDE_DIR "C:/Users/windo/Code/WebKit/bun-webkit-x64/include") - set(WEBKIT_LIB_DIR "C:/Users/windo/Code/WebKit/WebKitBuild/lib64") - - set(ASSERT_ENABLED "0") - message(STATUS "Hardcoded WebKit: ${WEBKIT_DIR}") + set(WEBKIT_LIB_BASENAME "lib") endif() +if(NOT WEBKIT_DIR) + if(WIN32) + message(FATAL_ERROR "Windows does not have prebuilt webkit yet. Please run release-windows.ps1 and pass the path to the built webkit with -DWEBKIT_DIR") + endif() + set(BUN_WEBKIT_PACKAGE_NAME_SUFFIX "") + set(ASSERT_ENABLED "0") + if(USE_DEBUG_JSC) + set(BUN_WEBKIT_PACKAGE_NAME_SUFFIX "-debug") + set(ASSERT_ENABLED "1") + elseif(NOT DEBUG) + set(BUN_WEBKIT_PACKAGE_NAME_SUFFIX "-lto") + set(ASSERT_ENABLED "0") + endif() + if (WIN32) + set(BUN_WEBKIT_PACKAGE_PLATFORM "win32") + elseif(APPLE) + set(BUN_WEBKIT_PACKAGE_PLATFORM "macos") + else() + set(BUN_WEBKIT_PACKAGE_PLATFORM "linux") + endif() + if(ARCH STREQUAL "x86_64") + set(BUN_WEBKIT_PACKAGE_ARCH "amd64") + elseif(ARCH MATCHES "aarch64|arm64|arm") + set(BUN_WEBKIT_PACKAGE_ARCH "arm64") + endif() + set(BUN_WEBKIT_PACKAGE_NAME "bun-webkit-${BUN_WEBKIT_PACKAGE_PLATFORM}-${BUN_WEBKIT_PACKAGE_ARCH}${BUN_WEBKIT_PACKAGE_NAME_SUFFIX}") + write_file("${BUN_WORKDIR}/package.json" "{\"name\":\"bun\",\"dependencies\":{\"${BUN_WEBKIT_PACKAGE_NAME}\":\"0.0.1-${WEBKIT_TAG}\" } }") + message(STATUS "Using Pre-built WebKit: ${BUN_WEBKIT_PACKAGE_NAME}") + execute_process( + COMMAND ${BUN_EXECUTABLE} "install" "${BUN_WEBKIT_PACKAGE_NAME}@0.0.1-${WEBKIT_TAG}" "--exact" "--no-save" + WORKING_DIRECTORY ${BUN_WORKDIR} + ) + if(NOT EXISTS "${BUN_WORKDIR}/node_modules/${BUN_WEBKIT_PACKAGE_NAME}") + message(FATAL_ERROR "Prebuilt WebKit package ${BUN_WEBKIT_PACKAGE_NAME} failed to install") + endif() + set(WEBKIT_INCLUDE_DIR "${BUN_WORKDIR}/node_modules/${BUN_WEBKIT_PACKAGE_NAME}/include") + set(WEBKIT_LIB_DIR "${BUN_WORKDIR}/node_modules/${BUN_WEBKIT_PACKAGE_NAME}/${WEBKIT_LIB_BASENAME}") +else() + # Setting WEBKIT_DIR means you either have a path to the WebKit repo, or you have a path to packaged webkit + # Non-packaged webkit has CMakeLists.txt + if(EXISTS "${WEBKIT_DIR}/CMakeLists.txt") + # Since we may be doing a Debug build of Bun but with a Release build of JSC, we can't + # include their CMakeLists directly here, but rather we need to run `cmake` as a dependency + # of our build. It'll still have decent caching which is what really matters. + # cmake WEBKIT_DIR -B WEBKIT_DIR/WebKitBuild/WEBKIT_BUILD_TYPE + # -DPORT=JSCOnly + # -DENABLE_STATIC_JSC=ON + # -DENABLE_SINGLE_THREADED_VM_ENTRY_SCOPE=ON + # -DCMAKE_BUILD_TYPE=Debug + # -DENABLE_BUN_SKIP_FAILING_ASSERTIONS=ON + # -DUSE_THIN_ARCHIVES=OFF + # -DENABLE_FTL_JIT=ON + # -DCMAKE_C_COMPILER=(which clang-16) + # -DDCMAKE_CXX_COMPILER=(which clang++-16) + # -DDUSE_BUN_JSC_ADDITIONS=1 + # -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" + # -DCMAKE_AR=$(which llvm-ar) + # -DCMAKE_RANLIB=$(which llvm-ranlib) + # -DALLOW_LINE_AND_COLUMN_NUMBER_IN_BUILTINS=ON + # -G Ninja + # -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 + # -DPTHREAD_JIT_PERMISSIONS_API=1 + # -DUSE_PTHREAD_JIT_PERMISSIONS_API=ON + # -DENABLE_REMOTE_INSPECTOR=ON + message(FATAL_ERROR "TODO: Setting WEBKIT_DIR to the WebKit repository") + else() + if(NOT EXISTS "${WEBKIT_DIR}/${WEBKIT_LIB_BASENAME}/libWTF.a" OR NOT EXISTS "${WEBKIT_DIR}/${WEBKIT_LIB_BASENAME}/libJavaScriptCore.a" OR NOT EXISTS "${WEBKIT_DIR}/${WEBKIT_LIB_BASENAME}/libbmalloc.a") + if(WEBKIT_DIR MATCHES "src/bun.js/WebKit$") + message(FATAL_ERROR "WebKit directory ${WEBKIT_DIR} does not contain all the required files for Bun. Did you forget to init submodules?") + endif() + message(FATAL_ERROR "WebKit directory ${WEBKIT_DIR} does not contain all the required files for Bun. Expected a path to the oven-sh/WebKit repository, or a path to a folder containing `include` and `lib`.") + endif() + + set(WEBKIT_INCLUDE_DIR "${WEBKIT_DIR}/include") + set(WEBKIT_LIB_DIR "${WEBKIT_DIR}/${WEBKIT_LIB_BASENAME}") + + message(STATUS "Using specified WebKit directory: ${WEBKIT_DIR}") + + if(EXISTS "${WEBKIT_DIR}/is-debug-build.txt") + set(ASSERT_ENABLED "1") + message(STATUS "WebKit assertions: ON") + else() + set(ASSERT_ENABLED "0") + message(STATUS "WebKit assertions: OFF") + endif() + endif() +endif() # --- CMake Macros --- @@ -545,18 +647,7 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/src/napi ${CMAKE_CURRENT_SOURCE_DIR}/src/deps ${CMAKE_CURRENT_SOURCE_DIR}/src/deps/picohttpparser - - ${CMAKE_CURRENT_SOURCE_DIR}/bun-webkit/include - - # ${WEBKIT_INCLUDE_DIR} - C:/Users/windo/Code/WebKit/bun-webkit-x64/include - # ${WEBKIT_DIR}/ICU - # ${WEBKIT_DIR}/bmalloc - # ${WEBKIT_DIR}/ - # ${WEBKIT_DIR}/JavaScriptCore/PrivateHeaders - # ${WEBKIT_DIR}/bmalloc/PrivateHeaders - # ${WEBKIT_DIR}/WTF/PrivateHeaders - + ${WEBKIT_INCLUDE_DIR} "${BUN_WORKDIR}/codegen" ) @@ -660,9 +751,9 @@ if(UNIX AND NOT APPLE) target_link_libraries(${bun} PRIVATE "c") target_link_libraries(${bun} PRIVATE "libatomic.a") - target_link_libraries(${bun} PRIVATE "${WEBKIT_DIR}/lib/libicudata.a") - target_link_libraries(${bun} PRIVATE "${WEBKIT_DIR}/lib/libicui18n.a") - target_link_libraries(${bun} PRIVATE "${WEBKIT_DIR}/lib/libicuuc.a") + target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libicudata.a") + target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libicui18n.a") + target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libicuuc.a") set_target_properties(${bun} PROPERTIES LINK_DEPENDS "${BUN_SRC}/linker.lds") set_target_properties(${bun} PROPERTIES LINK_DEPENDS "${BUN_SRC}/symbols.dyn") @@ -850,9 +941,9 @@ else() endif() if(NOT MSVC) - target_link_libraries(${bun} PRIVATE "${WEBKIT_DIR}/lib/libWTF.a") - target_link_libraries(${bun} PRIVATE "${WEBKIT_DIR}/lib/libJavaScriptCore.a") - target_link_libraries(${bun} PRIVATE "${WEBKIT_DIR}/lib/libbmalloc.a") + target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libWTF.a") + target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libJavaScriptCore.a") + target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libbmalloc.a") else() target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/WTF.lib") target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/JavaScriptCore.lib") @@ -877,13 +968,7 @@ else() target_include_directories(${bun} PUBLIC C:/Users/windo/Code/WebKit/WebKitLibraries/win/include) target_link_directories(${bun} PUBLIC C:/Users/windo/Code/WebKit/WebKitLibraries/win/lib64) target_link_directories(${bun} PUBLIC C:/Users/windo/Code/lib64) - - # icudt.lib - # icuin.lib - # icuio.lib - # icutest.lib - # icutu.lib - # icuuc.lib + target_link_libraries(${bun} PUBLIC icuuc icudt icutu icuio icuin icutest) target_link_libraries(${bun} PUBLIC winmm ws2_32 bcrypt ntdll kernel32 shell32 shlwapi advapi32 vcruntime ucrt legacy_stdio_definitions) endif() diff --git a/bun.lockb b/bun.lockb index e2cafbc7f12f6423d45f847c0f26c60da7f67853..093984797c4dc7f2f95b2530be25f4619a0c8fd1 100755 GIT binary patch delta 7882 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 `// -${declareASCIILiteral(`${idToEnumName(id)}Code`, outputs.host.get(id.slice(0, -3)))} +${declareASCIILiteral(`${idToEnumName(id)}Code`, outputs.get(id.slice(0, -3)))} // `, )