Skip to content

Commit

Permalink
mac: In static library builds, link against a static libc++.a
Browse files Browse the repository at this point in the history
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).

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
R=mark@chromium.org

Review URL: https://codereview.chromium.org/1413863003 .

Cr-Commit-Position: refs/heads/master@{#355826}
  • Loading branch information
nico committed Oct 23, 2015
1 parent e760327 commit 494270d
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 22 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
42 changes: 27 additions & 15 deletions build/common.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -5260,6 +5260,26 @@
}, # configuration "Release"
}, # configurations
'xcode_settings': {
# 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++

'GCC_DYNAMIC_NO_PIC': 'NO', # No -mdynamic-no-pic
# (Equivalent to -fPIC)
# MACOSX_DEPLOYMENT_TARGET maps to -mmacosx-version-min
Expand All @@ -5276,23 +5296,15 @@
# specified or not.
'-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.)
'CLANG_CXX_LIBRARY': 'libc++', # -stdlib=libc++
}],
],
},
'target_conditions': [
['>(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.
'library_dirs': [
'<(DEPTH)/third_party/libc++-static',
],
}],
['_type=="executable"', {
'postbuilds': [
{
Expand Down
2 changes: 1 addition & 1 deletion chrome/chrome_dll.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -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"', {
'postbuilds': [
{
# This step causes an error to be raised if the .order file
Expand Down
16 changes: 16 additions & 0 deletions chrome/tools/build/mac/verify_order
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
8 changes: 4 additions & 4 deletions third_party/libc++-static/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
File renamed without changes.

0 comments on commit 494270d

Please sign in to comment.