rewrote OSX library copier in Haskell, now with recursive copying of library deps

This commit is contained in:
Joey Hess 2012-11-26 14:09:40 -04:00
parent c9f293e18b
commit 4f9cb2041c
2 changed files with 70 additions and 9 deletions

69
Build/OSXMkLibs.hs Normal file
View file

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

View file

@ -206,15 +206,7 @@ osxapp:
install -d "$(OSXAPP_BASE)/git-core"
(cd "$(shell git --exec-path)" && tar c .) | (cd "$(OSXAPP_BASE)"/git-core && tar x)
touch "$(OSXAPP_BASE)/libdirs.tmp"
for lib in $$(otool -L "$(OSXAPP_BASE)"/bin/* "$(OSXAPP_BASE)"/git-core/* | egrep '^ ' | cut -d ' ' -f 1 | sed 's/^ //' | sort | uniq); do \
dir=$$(dirname "$$lib"); \
install -d "$(OSXAPP_BASE)/$$dir"; \
echo "$$dir" >> "$(OSXAPP_BASE)/libdirs.tmp"; \
cp "$$lib" "$(OSXAPP_BASE)/$$dir"; \
done
sort "$(OSXAPP_BASE)/libdirs.tmp" | uniq > "$(OSXAPP_BASE)/libdirs"
rm -f "$(OSXAPP_BASE)/libdirs.tmp"
runghc Build/OSXMkLibs.hs $(OSXAPP_BASE)
rm -f tmp/git-annex.dmg
hdiutil create -size 640m -format UDRW -srcfolder $(GIT_ANNEX_TMP_BUILD_DIR)/build-dmg \
-volname git-annex -o tmp/git-annex.dmg