Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add extraLibDirs to runtime lib search paths of library #9554

Merged
merged 1 commit into from
Jan 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cabal/src/Distribution/Simple/GHC/BuildGeneric.hs
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ gbuild verbosity numJobs pkg_descr lbi bm clbi = do
}
dynLinkerOpts =
mempty
{ ghcOptRPaths = rpaths
{ ghcOptRPaths = rpaths <> toNubListR (extraLibDirs bnfo)
, ghcOptInputFiles =
toNubListR
[tmpDir </> x | x <- cLikeObjs ++ cxxObjs ++ cmmObjs ++ asmObjs]
Expand Down
2 changes: 1 addition & 1 deletion Cabal/src/Distribution/Simple/GHC/BuildOrRepl.hs
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
, ghcOptLinkFrameworks = toNubListR $ PD.frameworks libBi
, ghcOptLinkFrameworkDirs =
toNubListR $ PD.extraFrameworkDirs libBi
, ghcOptRPaths = rpaths
, ghcOptRPaths = rpaths <> toNubListR (extraLibDirs libBi)
}
ghcStaticLinkArgs =
mempty
Expand Down
5 changes: 1 addition & 4 deletions Cabal/src/Distribution/Simple/Program/GHC.hs
Original file line number Diff line number Diff line change
Expand Up @@ -778,10 +778,7 @@ renderGhcOptions comp _platform@(Platform _arch os) opts
else []
, ["-no-hs-main" | flagBool ghcOptLinkNoHsMain]
, ["-dynload deploy" | not (null (flags ghcOptRPaths))]
, concat
[ ["-optl-Wl,-rpath," ++ dir]
| dir <- flags ghcOptRPaths
]
, ["-optl-Wl,-rpath," ++ dir | dir <- flags ghcOptRPaths]
, flags ghcOptLinkModDefFiles
, -------------
-- Packages
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import Hello
hello
:q
6 changes: 6 additions & 0 deletions cabal-testsuite/PackageTests/LinkerOptions/T7339/clib/lib.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#include <stdio.h>

void hello_world(void) {
printf("hello world!");
}

3 changes: 3 additions & 0 deletions cabal-testsuite/PackageTests/LinkerOptions/T7339/lib/Hello.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module Hello (hello) where

foreign import ccall "hello_world" hello :: IO ()
2 changes: 2 additions & 0 deletions cabal-testsuite/PackageTests/LinkerOptions/T7339/lib/Setup.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import Distribution.Simple
main = defaultMain
11 changes: 11 additions & 0 deletions cabal-testsuite/PackageTests/LinkerOptions/T7339/lib/T7339.cabal
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
cabal-version: >=1.10
name: T7339
version: 1.0
build-type: Simple

library
build-depends: base
exposed-modules: Hello
default-language: Haskell2010
extra-libraries: hello

6 changes: 6 additions & 0 deletions cabal-testsuite/PackageTests/LinkerOptions/T7339/setup.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Setup configure
# Setup build
Preprocessing library for T7339-1.0...
Building library for T7339-1.0...
# Setup register
Registering library for T7339-1.0...
67 changes: 67 additions & 0 deletions cabal-testsuite/PackageTests/LinkerOptions/T7339/setup.test.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
-- Test for #19350, #7339 originally by @bgamari
-- =============================================
--
-- The plan
-- ---------
-- We build a C shared library (`libhello`, contained in ./clib) and then build
-- a Haskell library (`T19350-lib`, in ./lib) which depends upon it via `foreign
-- import`. We make sure that the libhello shared object can only be found via
-- the extra-lib-dirs from the package database registration (which we do by
-- moving libhello.so from its original place).
--
-- Finally, we enter GHCi, load the Haskell library, and try to use it to call
-- into libhello.

import System.Directory
import Distribution.System
import Test.Cabal.Prelude


main = setupTest $ do

skipIfWindows
skipUnlessGhcVersion ">= 8.4"

withPackageDb $ do
cwd <- takeDirectory . testCurrentDir <$> getTestEnv
plat <- testPlatform <$> getTestEnv
let libExt = case plat of
Platform _ OSX -> "dylib"
Platform _ Windows -> "dll"
Platform _ _other -> "so"


-- Link a C program against the library
_ <- runProgramM ghcProgram
[ "-fPIC", "-c", "clib/lib.c"
, "-o", "clib/lib.o" ]
Nothing
_ <- runProgramM ghcProgram
[ "-shared", "-no-hs-main", "clib/lib.o"
, "-o", "clib/libhello" <.> libExt ]
Nothing

withDirectory "lib" $ do
setup "configure" ["-v0"
, "--extra-lib-dirs=" ++ (cwd </> "clib")
, "--extra-lib-dirs=" ++ (cwd </> "clib-install")
, "--disable-library-vanilla"
, "--enable-shared"]
setup "build" []
setup "register" ["--inplace"]

-- Move libhello from its original place to ensure it isn't found via RPATH
liftIO $ do
createDirectoryIfMissing False (cwd </> "clib-install")
copyFile (cwd </> "clib/libhello" <.> libExt) ( cwd </> "clib-install/libhello" <.> libExt)
removeFile (cwd </> "clib/libhello" <.> libExt)

pkgDb <- testPackageDbDir <$> getTestEnv
ghciScript <- liftIO $ readFile (cwd </> "T19350.script")
_ <- runProgramM ghcProgram
[ "--interactive"
, "-package", "T7339"
, "-package-db", pkgDb
] (Just ghciScript)

return ()
Loading