summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthakis <thakis@chromium.org>2015-10-24 00:16:57 -0700
committerCommit bot <commit-bot@chromium.org>2015-10-24 07:17:43 +0000
commitf8a27cca3c79ca9c8f6bf701aa2cb8bbbc8b3059 (patch)
treef050913c4c20bf8ad2baad4abefda92f2f49b1c7
parent0fceaeddf5408ab60dccc2c2b45ca066caf50396 (diff)
downloadchromium_src-f8a27cca3c79ca9c8f6bf701aa2cb8bbbc8b3059.zip
chromium_src-f8a27cca3c79ca9c8f6bf701aa2cb8bbbc8b3059.tar.gz
chromium_src-f8a27cca3c79ca9c8f6bf701aa2cb8bbbc8b3059.tar.bz2
mac: In static library builds, link against a static libc++.a
To achieve this, just add a -Lthird_party/libc++-static flag to the link line, and add a postbuild that checks that Chromium Framework depends on neither libstdc++.dylib nor libc++.dylib Use the existing verify_order postbuild for this, and let it not run in component builds (since what it checks for isn't interesting in that config, and we do depend on system libc++ in component builds). Also don't do this in asan builds. asan already requires OS X 10.7+. And don't do this for targets below native_client, since those still use the 10.6 SDK (!). This change is small but subtle, see thread "[chromium-dev] Intent to implement: Statically linking libc++ for Chrome/Mac" and the document linked from comment 14 on the bug for details. Ideally, this has no observable behavior change. If it looks like this breaks tests somewhere, especially on 10.6, please revert. (The bots like it, and the things I tried on 10.6 worked too, though.) BUG=400091,544325 R=mark@chromium.org Committed: https://chromium.googlesource.com/chromium/src/+/494270d01189f8b4b2b4ebd501fd980833489729 Committed: https://chromium.googlesource.com/chromium/src/+/0f56cff872068cef226e7ad3f9701eb41d4eb2f5 Review URL: https://codereview.chromium.org/1413863003 Cr-Commit-Position: refs/heads/master@{#355966}
-rw-r--r--.gitignore2
-rw-r--r--DEPS2
-rw-r--r--build/common.gypi63
-rw-r--r--chrome/chrome_dll.gypi2
-rwxr-xr-xchrome/tools/build/mac/verify_order16
-rwxr-xr-xthird_party/libc++-static/build.sh8
-rw-r--r--third_party/libc++-static/libc++.a.sha1 (renamed from third_party/libc++-static/libc++-static.a.sha1)0
7 files changed, 75 insertions, 18 deletions
diff --git a/.gitignore b/.gitignore
index ef33bc3..88cf776 100644
--- a/.gitignore
+++ b/.gitignore
@@ -335,7 +335,7 @@ v8.log
/third_party/khronos_glcts
/third_party/leveldatabase/src
/third_party/leveldb
-/third_party/libc++-static/libc++-static.a
+/third_party/libc++-static/libc++.a
/third_party/libaddressinput/src
/third_party/libexif/sources
/third_party/libjingle/source
diff --git a/DEPS b/DEPS
index 78d08af..96a18fa 100644
--- a/DEPS
+++ b/DEPS
@@ -682,7 +682,7 @@ hooks = [
'--platform=darwin',
'--no_auth',
'--bucket', 'chromium-libcpp',
- '-s', 'src/third_party/libc++-static/libc++-static.a.sha1',
+ '-s', 'src/third_party/libc++-static/libc++.a.sha1',
],
},
# Pull luci-go binaries (isolate, swarming) using checked-in hashes.
diff --git a/build/common.gypi b/build/common.gypi
index e7b0527..56dc197 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -5260,6 +5260,16 @@
}, # configuration "Release"
}, # configurations
'xcode_settings': {
+ # Everything should include libc++ headers. Just passing
+ # -stdlib=libc++ doesn't just work in NaCl targets with asan enabled
+ # until http://crbug.com/544325 is fixed, so tell the compiler to not
+ # add any include paths, and instead below add the c++ include
+ # directory as include_dirs. Then we can not set CLANG_CXX_LIBRARY
+ # to libc++ for NaCl targets and that way they'll link against
+ # libstdc++ on the ASan bots (ASan requires a C++ library to be linked
+ # even for the C-only NaCl programs).
+ 'OTHER_CPLUSPLUSFLAGS': [ '$inherited', '-nostdinc++', ],
+
'GCC_DYNAMIC_NO_PIC': 'NO', # No -mdynamic-no-pic
# (Equivalent to -fPIC)
# MACOSX_DEPLOYMENT_TARGET maps to -mmacosx-version-min
@@ -5277,22 +5287,53 @@
'-fno-strict-aliasing', # See http://crbug.com/32204.
],
'conditions': [
- ['component=="shared_library"', {
- # In component builds, link to the system libc++. This requires
- # OS X 10.7, but we currently pass -mmacosx-version-min=10.6.
- # Xcode's clang complains about this, but our open-source bundled
- # chromium clang doesn't. This has the effect of making
- # everything depend on libc++, which means component-build
- # binaries won't run on 10.6 (no libc++ there), but for a
- # developer-only configuration that's ok.
- # (We don't want to raise the deployment target yet so that
- # official and dev builds have the same deployment target. This
- # affects things like which functions are considered deprecated.)
+ # TODO(thakis): Remove this condition once http://crbug.com/544325
+ # is fixed. Some targets below native_client still link use the
+ # 10.6 SDK which doesn't contain a libc++.
+ ['mac_sdk!="10.6"', {
+ # Tell the compiler to use libc++'s headers and the linker to link
+ # against libc++. The latter part normally requires OS X 10.7,
+ # but we still support running on 10.6. How does this work? Two
+ # parts:
+ # 1. Chromium's clang doesn't error on -mmacosx-version-min=10.6
+ # combined with -stdlib=libc++ (it normally silently produced a
+ # binary that doesn't run on 10.6)
+ # 2. Further down, library_dirs is set to
+ # third_party/libc++-static, which contains a static
+ # libc++.a library. The linker then links against that instead
+ # of against /usr/lib/libc++.dylib when it sees the -lc++ flag
+ # added by the driver.
+ #
+ # In component builds, just link to the system libc++. This has
+ # the effect of making everything depend on libc++, which means
+ # component-build binaries won't run on 10.6 (no libc++ there),
+ # but for a developer-only configuration that's ok. (We don't
+ # want to raise the deployment target yet so that official and
+ # dev builds have the same deployment target. This affects
+ # things like which functions are considered deprecated.)
'CLANG_CXX_LIBRARY': 'libc++', # -stdlib=libc++
+
}],
],
},
'target_conditions': [
+ ['>(nacl_untrusted_build)==0', {
+ 'include_dirs': [
+ '<(DEPTH)/third_party/llvm-build/Release+Asserts/include/c++/v1',
+ ],
+ }],
+ ['>(nacl_untrusted_build)==0 and component=="static_library"', {
+ # See the comment for CLANG_CXX_LIBRARY above for what this does.
+ # The NaCl toolchains have their own toolchain and don't need this.
+ # ASan requires 10.7+ and clang implicitly adds -lc++abi in ASan
+ # mode. Our libc++.a contains both libc++ and libc++abi in one
+ # library, so it doesn't work in that mode.
+ 'conditions': [
+ ['asan==0', {
+ 'library_dirs': [ '<(DEPTH)/third_party/libc++-static' ],
+ }],
+ ],
+ }],
['_type=="executable"', {
'postbuilds': [
{
diff --git a/chrome/chrome_dll.gypi b/chrome/chrome_dll.gypi
index ef61887..b0422e4 100644
--- a/chrome/chrome_dll.gypi
+++ b/chrome/chrome_dll.gypi
@@ -304,7 +304,7 @@
],
}],
# This step currently fails when using LTO. TODO(pcc): Re-enable.
- ['OS=="mac" and use_lto==0', {
+ ['OS=="mac" and use_lto==0 and component=="static_library" and asan==0', {
'postbuilds': [
{
# This step causes an error to be raised if the .order file
diff --git a/chrome/tools/build/mac/verify_order b/chrome/tools/build/mac/verify_order
index 3d5d644..cfa4c5a 100755
--- a/chrome/tools/build/mac/verify_order
+++ b/chrome/tools/build/mac/verify_order
@@ -12,6 +12,8 @@
#
# This script can be used to verify that all of the global text symbols in
# a Mach-O file are accounted for in an order file.
+#
+# Also check that the file does not depend on either of libstdc++ or libc++.
if [ ${#} -ne 2 ] ; then
echo "usage: ${0} LAST_SYMBOL MACH_O_FILE" >& 2
@@ -40,4 +42,18 @@ if [ ${?} -eq 0 ] || [ -n "${UNORDERED_SYMBOLS}" ] ; then
exit 1
fi
+LIBS=$(otool -L "${MACH_O_FILE}")
+if [ ${?} -ne 0 ] ; then
+ echo "${0}: failed to get libraries in ${MACH_O_FILE}" >& 2
+ exit 1
+fi
+if grep -Fq libstdc++ <<< ${LIBS} ; then
+ echo "${0}: ${MACH_O_FILE} depends on libstdc++" >& 2
+ exit 1
+fi
+if grep -Fq libc++ <<< ${LIBS} ; then
+ echo "${0}: ${MACH_O_FILE} depends on libc++" >& 2
+ exit 1
+fi
+
exit 0
diff --git a/third_party/libc++-static/build.sh b/third_party/libc++-static/build.sh
index 96d490c..d79054d 100755
--- a/third_party/libc++-static/build.sh
+++ b/third_party/libc++-static/build.sh
@@ -38,16 +38,16 @@ sed -i '' 's/"default"/"hidden"/g' ../../libcxxabi/src/*
sed -i '' 's/push(default)/push(hidden)/g' ../../libcxxabi/src/*
# Let the default handler not depend on __cxa_demangle, this saves 0.5MB binary
-# size in each binary linking against libc++-static.a
+# size in each binary linking against libc++.a
patch -d ../../libcxxabi -p0 < "${THIS_DIR}/libcxxabi.patch"
"$CXX" -c -I../../libcxx/include/ -I../../libcxxabi/include ../../libcxxabi/src/*.cpp $FLAGS
popd
-libtool -static -o libc++-static.a libcxx*/*.o
+libtool -static -o libc++.a libcxx*/*.o
-cp libc++-static.a "${THIS_DIR}"
-upload_to_google_storage.py -b chromium-libcpp "${THIS_DIR}/libc++-static.a"
+cp libc++.a "${THIS_DIR}/libc++.a"
+upload_to_google_storage.py -b chromium-libcpp "${THIS_DIR}/libc++.a"
popd
rm -rf "${DIR}"
diff --git a/third_party/libc++-static/libc++-static.a.sha1 b/third_party/libc++-static/libc++.a.sha1
index 06a3493..06a3493 100644
--- a/third_party/libc++-static/libc++-static.a.sha1
+++ b/third_party/libc++-static/libc++.a.sha1