Skip to content

Commit

Permalink
Build static library for JavaScriptCore before linking framework
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=263697
<rdar://113641596>

Reviewed by Elliott Williams.

This change introduces a libJavaScriptCore.a target, which is then used
to link JavaScriptCore.framework.  By configuring the project to build
this way, there is no need to duplicate the list of sources between both
targets.  When JSC_USE_STATIC_LINKING=YES, the jsc binary is linked to
libJavaScriptCore.a instead of to JavaScriptCore.framework.

* Source/JavaScriptCore/API/JSWrapperMap.h:
* Source/JavaScriptCore/API/ObjCCallbackFunction.h:
- Fix header include paths to work with static library.
* Source/JavaScriptCore/Configurations/BaseTarget.xcconfig: Copy from Source/JavaScriptCore/Configurations/JSC.xcconfig.
- Extract common variables from JavaScriptCore.xcconfig that are shared
  with libJavaScriptCore.xcconfig.
* Source/JavaScriptCore/Configurations/Base.xcconfig:
- Extract linker variables from JavaScriptCore.xcconfig that are shared
  with JSC.xcconfig.
- Note that `-fobjc-link-runtime` replaces
  `-lobjc -framework CoreFoundation -framework Foundation`.
* Source/JavaScriptCore/Configurations/JSC.xcconfig:
(JSC_USE_STATIC_LINKING): Add.
- Set to the same boolean value as ENABLE_LIBFUZZER (which will default
  to NO), but make it a separate variable to allow this behavior to be
  overriden via xcodebuild.
- Configure OTHER_LDFLAGS to statically link libJavaScriptCore.a when
  JSC_USE_STATIC_LINKING=YES, else use dynamic linking (default) to
  JavaScriptCore.framework.
* Source/JavaScriptCore/Configurations/JavaScriptCore.xcconfig:
- Extract shared variables into BaseTarget.xcconfig.
- Move build related variables into libJavaScriptCore.xcconfig.
* Source/JavaScriptCore/Configurations/libJavaScriptCore.xcconfig: Add.
- Move build-related variables from JavaScriptCore.xcconfig.
* Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj:
- Add new xcconfig files to project.
- Add libJavaScriptCore.a target and use libJavaScriptCore.xcconfig as
  its base.
- Move from JavaScriptCore framework target to libJavaScriptCore target:
  - Custom Build Rules.
  - Compile Sources.
  - Target Dependencies.
  - Copy Profiling Data build phase script.
- Add target dependency on libJavaScriptCore to JavaScriptCore.
- Add JavaScriptCoreFramework.cpp source file to JavaScriptCore
  framework target.
- Remove all items from "Link Binary with Libraries" for JavaScriptCore
  and jsc targets (except libedit.dylib on jsc) since this is handled
  via OTHER_LDFLAGS in xcconfig files now.
* Source/JavaScriptCore/JavaScriptCoreFramework.cpp: Add.
- Xcode requires at least one source file to compile to link a
  framework so create an empty one.

Canonical link: https://commits.webkit.org/270226@main
  • Loading branch information
David Kilzer authored and ddkilzer committed Nov 4, 2023
1 parent 8e6019e commit 3d73290
Show file tree
Hide file tree
Showing 9 changed files with 258 additions and 87 deletions.
4 changes: 2 additions & 2 deletions Source/JavaScriptCore/API/JSWrapperMap.h
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2013 Apple Inc. All rights reserved.
* Copyright (C) 2013-2023 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
Expand All @@ -23,8 +23,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#import "JSValueInternal.h"
#import <JavaScriptCore/JavaScriptCore.h>
#import <JSValueInternal.h>
#import <objc/objc-runtime.h>

#if JSC_OBJC_API_ENABLED
Expand Down
2 changes: 1 addition & 1 deletion Source/JavaScriptCore/API/ObjCCallbackFunction.h
Expand Up @@ -29,7 +29,7 @@

#if JSC_OBJC_API_ENABLED

#import <JavaScriptCore/JSCallbackFunction.h>
#import "JSCallbackFunction.h"

#if defined(__OBJC__)
@class JSContext;
Expand Down
15 changes: 15 additions & 0 deletions Source/JavaScriptCore/Configurations/Base.xcconfig
Expand Up @@ -156,3 +156,18 @@ WK_DEFAULT_LTO_MODE = $(WK_USER_LTO_MODE_thin);

WK_PROCESSED_XCENT_FILE=$(TEMP_FILE_DIR)/$(FULL_PRODUCT_NAME).entitlements
WK_USE_RESTRICTED_ENTITLEMENTS = $(USE_INTERNAL_SDK);

// Shared variables used for dynamic or static linking of JavaScriptCore and jsc.

OTHER_LDFLAGS_JAVASCRIPTCORE_DEPS = -fobjc-link-runtime -licucore -framework Security;

WTF_ARCHIVE = $(BUILT_PRODUCTS_DIR)/libWTF.a;
WTF_ARCHIVE[config=Production] = $(SDK_DIR)$(WK_ALTERNATE_WEBKIT_SDK_PATH)$(WK_LIBRARY_INSTALL_PATH)/libWTF.a;

BMALLOC_ARCHIVE = $(BUILT_PRODUCTS_DIR)/libbmalloc.a;
BMALLOC_ARCHIVE[config=Production] = $(SDK_DIR)$(WK_ALTERNATE_WEBKIT_SDK_PATH)$(WK_LIBRARY_INSTALL_PATH)/libbmalloc.a;

LIBPAS_ARCHIVE = $(BUILT_PRODUCTS_DIR)/libpas.a;
LIBPAS_ARCHIVE[config=Production] = $(SDK_DIR)$(WK_ALTERNATE_WEBKIT_SDK_PATH)$(WK_LIBRARY_INSTALL_PATH)/libpas.a;

LIBJAVASCRIPTCORE_ARCHIVE = $(BUILT_PRODUCTS_DIR)/libJavaScriptCore.a;
31 changes: 31 additions & 0 deletions Source/JavaScriptCore/Configurations/BaseTarget.xcconfig
@@ -0,0 +1,31 @@
// Copyright (C) 2009-2023 Apple Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "../../../Configurations/Version.xcconfig"

GCC_PREFIX_HEADER = JavaScriptCorePrefix.h;
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(ENABLE_LLVM_PROFILE_GENERATION) PAS_BMALLOC_HIDDEN;
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
OTHER_CFLAGS = $(inherited) -fno-slp-vectorize --system-header-prefix=unicode/ -D__STDC_WANT_LIB_EXT1__=1;
HEADER_SEARCH_PATHS = "${BUILT_PRODUCTS_DIR}/DerivedSources/JavaScriptCore" $(HEADER_SEARCH_PATHS);
PRODUCT_NAME = JavaScriptCore;
8 changes: 6 additions & 2 deletions Source/JavaScriptCore/Configurations/JSC.xcconfig
@@ -1,4 +1,4 @@
// Copyright (C) 2011-2022 Apple Inc. All rights reserved.
// Copyright (C) 2011-2023 Apple Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
Expand All @@ -25,7 +25,11 @@

INSTALL_PATH = $(INSTALL_PATH_PREFIX)$(JAVASCRIPTCORE_FRAMEWORKS_DIR)/$(JAVASCRIPTCORE_HELPERS_DIR);

OTHER_LDFLAGS = $(inherited) $(WK_RELOCATABLE_FRAMEWORKS_LDFLAGS) $(SOURCE_VERSION_LDFLAGS);
JSC_USE_STATIC_LINKING = $(WK_NOT_$(WK_NOT_$(ENABLE_LIBFUZZER)));

OTHER_LDFLAGS = $(inherited) $(OTHER_LDFLAGS_STATIC_LINKING_$(JSC_USE_STATIC_LINKING));
OTHER_LDFLAGS_STATIC_LINKING_YES = $(OTHER_LDFLAGS_JAVASCRIPTCORE_DEPS) $(WTF_ARCHIVE) $(BMALLOC_ARCHIVE) $(LIBPAS_ARCHIVE) $(LIBJAVASCRIPTCORE_ARCHIVE);
OTHER_LDFLAGS_STATIC_LINKING_NO = -framework JavaScriptCore $(WK_RELOCATABLE_FRAMEWORKS_LDFLAGS) $(SOURCE_VERSION_LDFLAGS);
WK_RELOCATABLE_FRAMEWORKS_LDFLAGS = $(WK_RELOCATABLE_FRAMEWORKS_LDFLAGS_$(WK_RELOCATABLE_FRAMEWORKS));
WK_RELOCATABLE_FRAMEWORKS_LDFLAGS_YES = -Wl,-dyld_env,DYLD_FRAMEWORK_PATH=@executable_path/../../../..;

Expand Down
37 changes: 3 additions & 34 deletions Source/JavaScriptCore/Configurations/JavaScriptCore.xcconfig
Expand Up @@ -19,9 +19,9 @@
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "../../../Configurations/Version.xcconfig"
#include "BaseTarget.xcconfig"

DEFINES_MODULE = YES;
MODULEMAP_FILE = $(SRCROOT)/JavaScriptCore.modulemap;
Expand Down Expand Up @@ -61,46 +61,18 @@ WK_NO_STATIC_INITIALIZERS_Release_NO_ = $(WK_ERROR_WHEN_LINKING_WITH_STATIC_INIT
WK_NO_STATIC_INITIALIZERS_Production__ = $(WK_ERROR_WHEN_LINKING_WITH_STATIC_INITIALIZERS);
WK_NO_STATIC_INITIALIZERS_Production_NO_ = $(WK_ERROR_WHEN_LINKING_WITH_STATIC_INITIALIZERS);

OTHER_LDFLAGS_BASE = -unexported_symbols_list $(SRCROOT)/unexported-libc++.txt -force_load $(WTF_ARCHIVE) -force_load $(BMALLOC_ARCHIVE) -load_hidden $(LIBPAS_ARCHIVE) $(SOURCE_VERSION_LDFLAGS) $(WK_NO_STATIC_INITIALIZERS);
OTHER_LDFLAGS_BASE = $(OTHER_LDFLAGS_JAVASCRIPTCORE_DEPS) -unexported_symbols_list $(SRCROOT)/unexported-libc++.txt -force_load $(WTF_ARCHIVE) -force_load $(BMALLOC_ARCHIVE) -force_load $(LIBJAVASCRIPTCORE_ARCHIVE) -load_hidden $(LIBPAS_ARCHIVE) $(SOURCE_VERSION_LDFLAGS) $(WK_NO_STATIC_INITIALIZERS);
OTHER_LDFLAGS[sdk=embedded*] = $(inherited) $(OTHER_LDFLAGS_BASE);
OTHER_LDFLAGS[sdk=macosx*] = $(inherited) $(OTHER_LDFLAGS_BASE) -framework CoreServices $(PROFILE_GENERATE_OR_USE_LDFLAGS);

WTF_ARCHIVE = $(BUILT_PRODUCTS_DIR)/libWTF.a;
WTF_ARCHIVE[config=Production] = $(SDK_DIR)$(WK_ALTERNATE_WEBKIT_SDK_PATH)$(WK_LIBRARY_INSTALL_PATH)/libWTF.a;

BMALLOC_ARCHIVE = $(BUILT_PRODUCTS_DIR)/libbmalloc.a;
BMALLOC_ARCHIVE[config=Production] = $(SDK_DIR)$(WK_ALTERNATE_WEBKIT_SDK_PATH)$(WK_LIBRARY_INSTALL_PATH)/libbmalloc.a;

LIBPAS_ARCHIVE = $(BUILT_PRODUCTS_DIR)/libpas.a;
LIBPAS_ARCHIVE[config=Production] = $(SDK_DIR)$(WK_ALTERNATE_WEBKIT_SDK_PATH)$(WK_LIBRARY_INSTALL_PATH)/libpas.a;

SECTORDER_FLAGS = $(SECTORDER_FLAGS_$(CONFIGURATION));
SECTORDER_FLAGS_Production[sdk=macosx*] = -Wl,-order_file,JavaScriptCore.order;

CLANG_OPTIMIZATION_PROFILE_FILE = $(BUILT_PRODUCTS_DIR)/DerivedSources/JavaScriptCore/JavaScriptCore.profdata;
WK_COMPRESSED_OPTIMIZATION_PROFILE_FILE = $(WK_COMPRESSED_OPTIMIZATION_PROFILE_FILE_$(USE_INTERNAL_SDK));
WK_COMPRESSED_OPTIMIZATION_PROFILE_FILE_YES = $(WK_WEBKITADDITIONS_HEADERS_FOLDER_PATH)/Profiling/JavaScriptCore.profdata.compressed;

CLANG_USE_OPTIMIZATION_PROFILE = $(CLANG_USE_OPTIMIZATION_PROFILE_$(USE_INTERNAL_SDK)_$(CONFIGURATION)_$(WK_PLATFORM_NAME));
CLANG_USE_OPTIMIZATION_PROFILE_YES_Release_macosx = YES;
CLANG_USE_OPTIMIZATION_PROFILE_YES_Release_iphoneos = YES;
CLANG_USE_OPTIMIZATION_PROFILE_YES_Production_macosx = YES;
CLANG_USE_OPTIMIZATION_PROFILE_YES_Production_iphoneos = YES;

CLANG_INSTRUMENT_FOR_OPTIMIZATION_PROFILING = $(CLANG_INSTRUMENT_FOR_OPTIMIZATION_PROFILING_$(ENABLE_LLVM_PROFILE_GENERATION));
CLANG_INSTRUMENT_FOR_OPTIMIZATION_PROFILING_ENABLE_LLVM_PROFILE_GENERATION = YES;

GCC_PREFIX_HEADER = JavaScriptCorePrefix.h;
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(ENABLE_LLVM_PROFILE_GENERATION) PAS_BMALLOC_HIDDEN;
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
OTHER_CFLAGS = $(inherited) -fno-slp-vectorize --system-header-prefix=unicode/ -D__STDC_WANT_LIB_EXT1__=1;
HEADER_SEARCH_PATHS = "${BUILT_PRODUCTS_DIR}/DerivedSources/JavaScriptCore" $(HEADER_SEARCH_PATHS);
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = $(INSTALL_PATH_PREFIX)$(JAVASCRIPTCORE_FRAMEWORKS_DIR);
DYLIB_INSTALL_NAME_BASE = $(DYLIB_INSTALL_NAME_BASE_$(WK_USE_ALTERNATE_FRAMEWORKS_DIR));
DYLIB_INSTALL_NAME_BASE_NO = $(NORMAL_JAVASCRIPTCORE_FRAMEWORKS_DIR)
DYLIB_INSTALL_NAME_BASE_YES = $(JAVASCRIPTCORE_FRAMEWORKS_DIR);
PRODUCT_NAME = JavaScriptCore;
PRODUCT_BUNDLE_IDENTIFIER = com.apple.$(PRODUCT_NAME:rfc1034identifier);

ALTERNATE_ROOT_PATH = $(JAVASCRIPTCORE_FRAMEWORKS_DIR);
Expand All @@ -113,6 +85,3 @@ APPLY_RULES_IN_COPY_HEADERS = YES;

JSC_FRAMEWORK_HEADER_POSTPROCESSING_DISABLED = YES;
JSC_FRAMEWORK_HEADER_POSTPROCESSING_DISABLED[config=Production] = $(WK_USE_OVERRIDE_FRAMEWORKS_DIR);

EXCLUDED_SOURCE_FILE_NAMES = $(inherited);
EXCLUDED_SOURCE_FILE_NAMES[sdk=iphone*] = $(inherited) framework.sb;
44 changes: 44 additions & 0 deletions Source/JavaScriptCore/Configurations/libJavaScriptCore.xcconfig
@@ -0,0 +1,44 @@
// Copyright (C) 2009-2023 Apple Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "BaseTarget.xcconfig"

CLANG_OPTIMIZATION_PROFILE_FILE = $(BUILT_PRODUCTS_DIR)/DerivedSources/JavaScriptCore/JavaScriptCore.profdata;
WK_COMPRESSED_OPTIMIZATION_PROFILE_FILE = $(WK_COMPRESSED_OPTIMIZATION_PROFILE_FILE_$(USE_INTERNAL_SDK));
WK_COMPRESSED_OPTIMIZATION_PROFILE_FILE_YES = $(WK_WEBKITADDITIONS_HEADERS_FOLDER_PATH)/Profiling/JavaScriptCore.profdata.compressed;

CLANG_USE_OPTIMIZATION_PROFILE = $(CLANG_USE_OPTIMIZATION_PROFILE_$(USE_INTERNAL_SDK)_$(CONFIGURATION)_$(WK_PLATFORM_NAME));
CLANG_USE_OPTIMIZATION_PROFILE_YES_Release_macosx = YES;
CLANG_USE_OPTIMIZATION_PROFILE_YES_Release_iphoneos = YES;
CLANG_USE_OPTIMIZATION_PROFILE_YES_Production_macosx = YES;
CLANG_USE_OPTIMIZATION_PROFILE_YES_Production_iphoneos = YES;

CLANG_INSTRUMENT_FOR_OPTIMIZATION_PROFILING = $(CLANG_INSTRUMENT_FOR_OPTIMIZATION_PROFILING_$(ENABLE_LLVM_PROFILE_GENERATION));
CLANG_INSTRUMENT_FOR_OPTIMIZATION_PROFILING_ENABLE_LLVM_PROFILE_GENERATION = YES;

SKIP_INSTALL = YES;

STRIP_INSTALLED_PRODUCT = NO;

EXCLUDED_SOURCE_FILE_NAMES = $(inherited);
EXCLUDED_SOURCE_FILE_NAMES[sdk=iphone*] = $(inherited) framework.sb;

0 comments on commit 3d73290

Please sign in to comment.