From c1552daa3283ba03ef041312036d0e2f56c8fd87 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 8 Dec 2012 11:07:59 -0400 Subject: use install_name_tool to adjust library paths in osx app Have not yet been able to test this. --- Build/OSXMkLibs.hs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'Build/OSXMkLibs.hs') 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 -- cgit v1.2.3