rewrote OSX library copier in Haskell, now with recursive copying of library deps
This commit is contained in:
parent
c9f293e18b
commit
4f9cb2041c
2 changed files with 70 additions and 9 deletions
69
Build/OSXMkLibs.hs
Normal file
69
Build/OSXMkLibs.hs
Normal 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
|
10
Makefile
10
Makefile
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue