summaryrefslogtreecommitdiff
path: root/Build/OSXMkLibs.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-11-26 14:09:40 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-11-26 14:09:40 -0400
commitdd19a319cb8cddd0a476f58d0a73e181e71aeac7 (patch)
tree05693bc500b9acd5180dc28fc719cc53cce603c6 /Build/OSXMkLibs.hs
parent620941d8430013547dfc4ccfc5c5e20e9d4baa19 (diff)
rewrote OSX library copier in Haskell, now with recursive copying of library deps
Diffstat (limited to 'Build/OSXMkLibs.hs')
-rw-r--r--Build/OSXMkLibs.hs69
1 files changed, 69 insertions, 0 deletions
diff --git a/Build/OSXMkLibs.hs b/Build/OSXMkLibs.hs
new file mode 100644
index 000000000..7423e4ce7
--- /dev/null
+++ b/Build/OSXMkLibs.hs
@@ -0,0 +1,69 @@
+{- OSX library copier
+ -
+ - Copyright 2012 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Build.OSXMkLibs where
+
+import Control.Applicative
+import System.Environment
+import Data.Maybe
+import System.FilePath
+import System.Directory
+import System.IO
+import Control.Monad
+import Data.List
+
+import Utility.PartialPrelude
+import Utility.Directory
+import Utility.Process
+import Utility.Monad
+import Utility.SafeCommand
+import Utility.Path
+
+{- Recursively find and install libs, until nothing new to install is found. -}
+mklibs :: FilePath -> [FilePath] -> IO [FilePath]
+mklibs appbase libdirs = do
+ new <- catMaybes <$> installLibs appbase
+ if null new
+ then return (libdirs++new)
+ else mklibs appbase (libdirs++new)
+
+{- Returns directories into which new libs were installed. -}
+installLibs :: FilePath -> IO [Maybe FilePath]
+installLibs appbase = do
+ needlibs <- otool appbase
+ forM needlibs $ \lib -> do
+ let libdir = parentDir lib
+ let dest = appbase </> lib
+ ifM (doesFileExist dest)
+ ( return Nothing
+ , do
+ createDirectoryIfMissing True (appbase </> libdir)
+ _ <- boolSystem "cp" [File lib, File dest]
+ return $ Just libdir
+ )
+
+otool :: FilePath -> IO [FilePath]
+otool appbase = do
+ files <- filterM doesFileExist =<< dirContentsRecursive appbase
+ s <- readProcess "otool" ("-L" : files)
+ return $ nub $ parseOtool s
+
+parseOtool :: String -> [FilePath]
+parseOtool = catMaybes . map parse . lines
+ where
+ parse l
+ | "\t" `isPrefixOf` l = headMaybe $ words l
+ | otherwise = Nothing
+
+main :: IO ()
+main = getArgs >>= go
+ where
+ go [] = error "specify OSXAPP_BASE"
+ go (appbase:_) = do
+ libdirs <- mklibs appbase []
+ writeFile (appbase </> "libdirs") $
+ unlines $ nub libdirs