summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-12-08 11:07:59 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-12-08 11:07:59 -0400
commitc1552daa3283ba03ef041312036d0e2f56c8fd87 (patch)
treeec8ea7939347c84ae2e5d106f76ff26cc05c7da1
parent7864e92bdaf01838eab279f79f90015e86b20bb0 (diff)
use install_name_tool to adjust library paths in osx app
Have not yet been able to test this.
-rw-r--r--Build/OSXMkLibs.hs24
-rw-r--r--Makefile13
-rwxr-xr-xstandalone/osx/git-annex.app/Contents/MacOS/runshell12
3 files changed, 34 insertions, 15 deletions
diff --git a/Build/OSXMkLibs.hs b/Build/OSXMkLibs.hs
index cb8c017ae..fa5178988 100644
--- a/Build/OSXMkLibs.hs
+++ b/Build/OSXMkLibs.hs
@@ -47,11 +47,15 @@ installLibs appbase = do
return $ Just libdir
)
+{- Returns libraries to install. -}
otool :: FilePath -> IO [FilePath]
otool appbase = do
files <- filterM doesFileExist =<< dirContentsRecursive appbase
- s <- readProcess "otool" ("-L" : files)
- return $ nub $ parseOtool s
+ l <- forM files $ \file -> do
+ libs <- parseOtool <$> readProcess "otool" ["-L", file]
+ forM_ libs $ \lib -> install_name_tool file lib
+ return libs
+ return $ nub $ concat l
parseOtool :: String -> [FilePath]
parseOtool = catMaybes . map parse . lines
@@ -60,6 +64,22 @@ parseOtool = catMaybes . map parse . lines
| "\t" `isPrefixOf` l = headMaybe $ words l
| otherwise = Nothing
+{- Adjusts binaries to use libraries in paths relative to the executable.
+ -
+ - Assumes all executables are installed into the same directory, and
+ - the libraries will be installed in subdirectories that match their
+ - absolute paths. -}
+install_name_tool :: FilePath -> FilePath -> IO ()
+install_name_tool binary lib = do
+ ok <- boolSystem "install_name_tool"
+ [ Param "-change"
+ , File lib
+ , Param $ "@executable_path" ++ lib
+ , File binary
+ ]
+ unless ok $
+ hPutStrLn stderr $ "install_name_tool failed for " ++ binary
+
main :: IO ()
main = getArgs >>= go
where
diff --git a/Makefile b/Makefile
index 5e5ce68b3..e9077eb07 100644
--- a/Makefile
+++ b/Makefile
@@ -192,19 +192,18 @@ osxapp:
install -d $(GIT_ANNEX_TMP_BUILD_DIR)/build-dmg
cp -R standalone/osx/git-annex.app "$(OSXAPP_DEST)"
- install -d "$(OSXAPP_BASE)/bin"
- cp git-annex "$(OSXAPP_BASE)/bin/"
- strip "$(OSXAPP_BASE)/bin/git-annex"
- ln -sf git-annex "$(OSXAPP_BASE)/bin/git-annex-shell"
+ install -d "$(OSXAPP_BASE)"
+ cp git-annex "$(OSXAPP_BASE)"
+ strip "$(OSXAPP_BASE)/git-annex"
+ ln -sf git-annex "$(OSXAPP_BASE)/git-annex-shell"
gzcat standalone/licences.gz > $(OSXAPP_BASE)/LICENSE
cp $(OSXAPP_BASE)/LICENSE $(GIT_ANNEX_TMP_BUILD_DIR)/build-dmg/LICENSE.txt
for bin in $(THIRDPARTY_BINS); do \
- cp "$$(which "$$bin")" "$(OSXAPP_BASE)/bin/"; \
+ cp "$$(which "$$bin")" "$(OSXAPP_BASE)"; \
done
- install -d "$(OSXAPP_BASE)/git-core"
- (cd "$(shell git --exec-path)" && tar c .) | (cd "$(OSXAPP_BASE)"/git-core && tar x)
+ (cd "$(shell git --exec-path)" && tar c .) | (cd "$(OSXAPP_BASE)" && tar x)
runghc Build/OSXMkLibs.hs $(OSXAPP_BASE)
rm -f tmp/git-annex.dmg
diff --git a/standalone/osx/git-annex.app/Contents/MacOS/runshell b/standalone/osx/git-annex.app/Contents/MacOS/runshell
index ade1dd3f6..3366620ab 100755
--- a/standalone/osx/git-annex.app/Contents/MacOS/runshell
+++ b/standalone/osx/git-annex.app/Contents/MacOS/runshell
@@ -55,18 +55,18 @@ export PATH
# different versions of a single library. And it seems to work better
# than DYLD_FALLBACK_LIBRARY_PATH, which fails to override old system
# versions of libraries when a program in the app needs a newer version.
-ORIG_DYLD_ROOT_PATH="$DYLD_ROOT_PATH"
-export ORIG_DYLD_ROOT_PATH
-DYLD_ROOT_PATH=$base
-export DYLD_ROOT_PATH
+#ORIG_DYLD_ROOT_PATH="$DYLD_ROOT_PATH"
+#export ORIG_DYLD_ROOT_PATH
+#DYLD_ROOT_PATH=$base
+#export DYLD_ROOT_PATH
ORIG_GIT_EXEC_PATH="$GIT_EXEC_PATH"
export ORIG_GIT_EXEC_PATH
-GIT_EXEC_PATH=$base/git-core
+GIT_EXEC_PATH=$base
export GIT_EXEC_PATH
# Indicate which variables were exported above.
-GIT_ANNEX_STANDLONE_ENV="PATH DYLD_ROOT_PATH GIT_EXEC_PATH"
+GIT_ANNEX_STANDLONE_ENV="PATH GIT_EXEC_PATH"
export GIT_ANNEX_STANDLONE_ENV
if [ "$1" ]; then