diff --git a/Build/LinuxMkLibs.hs b/Build/LinuxMkLibs.hs index 9301070891..a873d76ad3 100644 --- a/Build/LinuxMkLibs.hs +++ b/Build/LinuxMkLibs.hs @@ -24,7 +24,7 @@ import Utility.Path import Utility.FileMode import Utility.CopyFile -mklibs :: FilePath -> a -> IO () +mklibs :: FilePath -> a -> IO Bool mklibs top _installedbins = do fs <- dirContentsRecursive top exes <- filterM checkExe fs @@ -48,6 +48,19 @@ mklibs top _installedbins = do let linker = Prelude.head linkers mapM_ (installLinkerShim top linker) exes + return (any hwcaplibdir libdirs) + where + -- hwcap lib dirs are things like foo/tls and foo/x86. + -- Hard to know if a directory is, so this is a heuristic + -- looking for things that are certianly not. If this heuristic + -- fails, a minor optimisation will not happen, but there will be + -- no bad results. + hwcaplibdir d = not $ or + [ "lib" == takeFileName d + -- eg, "lib/x86_64-linux-gnu" + , "-linux-" `isInfixOf` takeFileName d + ] + {- If there are two libdirs that are the same except one is in - usr/lib and the other is in lib/, move the contents of the usr/lib one - into the lib/ one. This reduces the number of directories the linker diff --git a/Build/OSXMkLibs.hs b/Build/OSXMkLibs.hs index 39e7b16ca1..4f7271d984 100644 --- a/Build/OSXMkLibs.hs +++ b/Build/OSXMkLibs.hs @@ -31,8 +31,10 @@ import qualified Data.Set as S type LibMap = M.Map FilePath String -mklibs :: FilePath -> M.Map FilePath FilePath -> IO () -mklibs appbase installedbins = mklibs' appbase installedbins [] [] M.empty +mklibs :: FilePath -> M.Map FilePath FilePath -> IO Bool +mklibs appbase installedbins = do + mklibs' appbase installedbins [] [] M.empty + return True {- Recursively find and install libs, until nothing new to install is found. -} mklibs' :: FilePath -> M.Map FilePath FilePath -> [FilePath] -> [(FilePath, FilePath)] -> LibMap -> IO () diff --git a/Build/Standalone.hs b/Build/Standalone.hs index 4353c7aa36..f8c43242c2 100644 --- a/Build/Standalone.hs +++ b/Build/Standalone.hs @@ -152,13 +152,22 @@ installLocales _ = return () installLocales topdir = cp "/usr/share/i18n" (topdir "i18n") #endif -installWrapper :: FilePath -> FilePath -> IO () +installSkel :: FilePath -> FilePath -> IO () #ifdef darwin_HOST_OS -installWrapper topdir basedir = do +installSkel topdir basedir = do removeDirectoryRecursive basedir - createDirectoryIfMissing True (takeDirectory basedir) unlessM (boolSystem "cp" [Param "-R", File "standalone/osx/git-annex.app", File basedir]) $ error "cp failed" +#else +installSkel topdir _basedir = do + removeDirectoryRecursive topdir + unlessM (boolSystem "cp" [Param "-R", File "standalone/linux/skel", File topdir]) $ + error "cp failed" +#endif + +installSkelRest :: FilePath -> FilePath -> Bool -> IO () +#ifdef darwin_HOST_OS +installSkelRest topdir basedir _hwcaplibs = do plist <- lines <$> readFile "standalone/osx/Info.plist.template" version <- getVersion writeFile (basedir "Contents" "Info.plist") @@ -166,11 +175,7 @@ installWrapper topdir basedir = do where expandversion v l = replace "GIT_ANNEX_VERSION" v l #else -installWrapper topdir _basedir = do - removeDirectoryRecursive topdir - createDirectoryIfMissing True (takeDirectory topdir) - unlessM (boolSystem "cp" [Param "-R", File "standalone/linux/skel", File topdir]) $ - error "cp failed" +installSkelRest topdir _basedir hwcaplibs = do runshell <- lines <$> readFile "standalone/linux/skel/runshell" -- GIT_ANNEX_PACKAGE_INSTALL can be set by a distributor and -- runshell will be modified @@ -180,6 +185,12 @@ installWrapper topdir _basedir = do modifyFileMode (topdir "runshell") (addModes executeModes) where expandrunshell (Just gapi) l@"GIT_ANNEX_PACKAGE_INSTALL=" = l ++ gapi + -- This is an optimisation, that avoids the linker looking in + -- several directories for hwcap optimised libs, when there are + -- none. + expandrunshell _ l@"LD_HWCAP_MASK=" = l ++ if not hwcaplibs + then "0" + else "" expandrunshell _ l = l #endif @@ -203,11 +214,12 @@ main :: IO () main = getArgs >>= go where go (topdir:basedir:[]) = do - installWrapper topdir basedir + installSkel topdir basedir installGitAnnex topdir installedbins <- installBundledPrograms topdir installGitLibs topdir installMagic topdir installLocales topdir - mklibs topdir installedbins + hwcaplibs <- mklibs topdir installedbins + installSkelRest topdir basedir hwcaplibs go _ = error "specify topdir and basedir" diff --git a/doc/todo/may_be___40__again__41___to_prelink_or_somehow_avoid_all_the_failing_opens__63__.mdwn b/doc/todo/may_be___40__again__41___to_prelink_or_somehow_avoid_all_the_failing_opens__63__.mdwn index 6da8dc6d88..96fc9e0d22 100644 --- a/doc/todo/may_be___40__again__41___to_prelink_or_somehow_avoid_all_the_failing_opens__63__.mdwn +++ b/doc/todo/may_be___40__again__41___to_prelink_or_somehow_avoid_all_the_failing_opens__63__.mdwn @@ -61,3 +61,5 @@ git annex build: 8.20200617+git192-g5849bd634-1~ndall+1 [[!meta author=yoh]] [[!tag projects/datalad]] + +> [[done]] --[[Joey]] diff --git a/doc/todo/may_be___40__again__41___to_prelink_or_somehow_avoid_all_the_failing_opens__63__/comment_19_13b21a0523b8837f4e27bb78e35ad5e0._comment b/doc/todo/may_be___40__again__41___to_prelink_or_somehow_avoid_all_the_failing_opens__63__/comment_19_13b21a0523b8837f4e27bb78e35ad5e0._comment new file mode 100644 index 0000000000..a22e029140 --- /dev/null +++ b/doc/todo/may_be___40__again__41___to_prelink_or_somehow_avoid_all_the_failing_opens__63__/comment_19_13b21a0523b8837f4e27bb78e35ad5e0._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="joey" + subject="""comment 19""" + date="2020-08-03T18:16:50Z" + content=""" +Implemented the `LD_HWCAP_MASK=0` optimisation, which left only these: + + strace -f ./git-annex version 2>&1 | grep ENOENT | grep openat + openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/tls/x86_64/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) + openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/tls/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) + openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/x86_64/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) + [pid 697752] openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/tls/x86_64/libpcre2-8.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) + [pid 697752] openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/tls/libpcre2-8.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) + [pid 697752] openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/x86_64/libpcre2-8.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) + +There are more failed opens now for locale files for commands like +grep when running it than there are for libraries. So, no need to +consider further prelinking. + +I think that rewriting runshell in C would be the +logical next choice, but dunno if it would speed it up by enough to be +worth the effort. So I'm going to close this now. +"""]] diff --git a/standalone/linux/skel/runshell b/standalone/linux/skel/runshell index 63bc277515..e18769cea8 100755 --- a/standalone/linux/skel/runshell +++ b/standalone/linux/skel/runshell @@ -241,6 +241,9 @@ else cmd=sh fi +LD_HWCAP_MASK= +export LD_HWCAP_MASK + if [ -n "${orig_IFS}" ]; then IFS="${orig_IFS}" export IFS