[commit: ghc] master: Always allow -staticlib (b8f33bc)
git at git.haskell.org
git at git.haskell.org
Tue Jul 11 17:42:40 UTC 2017
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/b8f33bc6b738b0378976e42b79369f0e53b680c7/ghc
>---------------------------------------------------------------
commit b8f33bc6b738b0378976e42b79369f0e53b680c7
Author: Moritz Angermann <moritz.angermann at gmail.com>
Date: Tue Jul 11 11:57:48 2017 -0400
Always allow -staticlib
the `-staticlib` flag is currently only supported on apple platforms,
due to the avaiablity of libtool (the apple version, which is unlike the
gnu version). This however prevents the use of -staticlib in cases
where it would be beneficial as well. The functionality that
`-staticlib` uses from `libtool` can be stubbed with a small script like
the following:
```
#!/bin/bash
# This script pretends to be libtool. And supports
# only a limited set of flags.
#
# It is supposed to be a stand in for libtool -static, whic
# creates a static archive. This is done by locating all -l<lib>
# libs in the provied -L<lib path> library paths, and building an
# MRI script to create the final archive from all the libraries, and
# other provided inputs.
#
name=${0##*/}
target=${name%-*}
set -e
ldflags_L=()
ldflags_l=()
output=""
inputs=()
STATIC=0
DYNAMIC=1
mode=$DYNAMIC
verbose=0
# find_lib <name> path path path path
function find_lib () {
lib=$1; shift 1;
for dir in $@; do
if [ -f "$dir/$lib" ]; then
echo "$dir/$lib"
break
fi
done
}
while [ "$#" -gt 0 ]; do
case "$1" in
-v|--verbose) verbose=1; shift 1;;
-o) output="$2"; shift 2;;
-L*) ldflags_L+=("${1:2:${#1}-2}"); shift 1;;
-l*) ldflags_l+=("lib${1:2:${#1}-2}.a"); shift 1;;
-static) mode=$STATIC; shift 1;;
-dynamic) mode=$DYNAMIC; shift 1;;
-Wl,*) ldflags+=("${1#*,}"); shift 1;;
-*) echo "unknown option: $1" >&2; exit 1;;
*) inputs+=("$1"); shift 1;;
esac
done
if [ ! $mode == $STATIC ]; then
echo "-dynamic not supported!" >&2; exit 1;
fi
MRI="create ${output}\n"
for input in "${ldflags_l[@]}"; do
lib=$(find_lib $input ${ldflags_L[@]})
if [ -z $lib ]; then
echo "Failed to find lib $input" >&2
exit 1
else
MRI+="addlib $lib\n"
continue
fi
done
for input in "${inputs[@]}"; do
MRI+="addmod $input\n"
done
MRI+="save\nend\n"
echo -e "$MRI" | $target-ar -M
$target-ranlib $output
```
if `ar` supports MRI scripts.
Reviewers: austin, bgamari
Reviewed By: bgamari
Subscribers: rwbarton, thomie
Differential Revision: https://phabricator.haskell.org/D3706
>---------------------------------------------------------------
b8f33bc6b738b0378976e42b79369f0e53b680c7
compiler/main/DriverPipeline.hs | 5 +----
docs/users_guide/phases.rst | 8 +++-----
utils/mkUserGuidePart/Options/Linking.hs | 7 ++++---
3 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs
index eed66b2..ad0e0c8 100644
--- a/compiler/main/DriverPipeline.hs
+++ b/compiler/main/DriverPipeline.hs
@@ -2082,10 +2082,7 @@ linkDynLibCheck dflags o_files dep_packages
linkStaticLibCheck :: DynFlags -> [String] -> [InstalledUnitId] -> IO ()
linkStaticLibCheck dflags o_files dep_packages
- = do
- when (platformOS (targetPlatform dflags) `notElem` [OSiOS, OSDarwin]) $
- throwGhcExceptionIO (ProgramError "Static archive creation only supported on Darwin/OS X/iOS")
- linkBinary' True dflags o_files dep_packages
+ = linkBinary' True dflags o_files dep_packages
-- -----------------------------------------------------------------------------
-- Running CPP
diff --git a/docs/users_guide/phases.rst b/docs/users_guide/phases.rst
index 1efe6a4..f35ba1b 100644
--- a/docs/users_guide/phases.rst
+++ b/docs/users_guide/phases.rst
@@ -539,11 +539,9 @@ for example).
.. ghc-flag:: -staticlib
- On Darwin/OS X/iOS only, link all passed files into a static library
- suitable for linking into an iOS (when using a cross-compiler) or
- Mac Xcode project. To control the name, use the :ghc-flag:`-o` ⟨name⟩ option
- as usual. The default name is ``liba.a``. This should nearly always
- be passed when compiling for iOS with a cross-compiler.
+ Link all passed files into a static library suitable for linking.
+ To control the name, use the :ghc-flag:`-o` ⟨name⟩ option
+ as usual. The default name is ``liba.a``.
.. ghc-flag:: -L ⟨dir⟩
diff --git a/utils/mkUserGuidePart/Options/Linking.hs b/utils/mkUserGuidePart/Options/Linking.hs
index 9edc7c3..3142020 100644
--- a/utils/mkUserGuidePart/Options/Linking.hs
+++ b/utils/mkUserGuidePart/Options/Linking.hs
@@ -11,9 +11,10 @@ linkingOptions =
}
, flag { flagName = "-staticlib"
, flagDescription =
- "On Darwin/OS X/iOS only, generate a standalone static library " ++
- "(as opposed to an executable). This is the usual way to " ++
- "compile for iOS."
+ "Generate a standalone static library (as opposed to an " ++
+ "executable). This is useful when cross compiling. The " ++
+ "library together with all its dependencies ends up in in a " ++
+ "single static library that can be linked against."
, flagType = DynamicFlag
}
, flag { flagName = "-fPIC"
More information about the ghc-commits
mailing list