use install_name_tool to adjust library paths in osx app

Have not yet been able to test this.
This commit is contained in:
Joey Hess 2012-12-08 11:07:59 -04:00
parent 1108430c45
commit 1dd386903b
3 changed files with 34 additions and 15 deletions

View file

@ -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