From 1dd386903b884306d5af94bbabaca62d32d1d34f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 8 Dec 2012 11:07:59 -0400 Subject: [PATCH] use install_name_tool to adjust library paths in osx app Have not yet been able to test this. --- Build/OSXMkLibs.hs | 24 +++++++++++++++++-- Makefile | 13 +++++----- .../osx/git-annex.app/Contents/MacOS/runshell | 12 +++++----- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/Build/OSXMkLibs.hs b/Build/OSXMkLibs.hs index cb8c017aed..fa5178988f 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 5e5ce68b3c..e9077eb072 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 ade1dd3f6a..3366620ab0 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