diff --git a/Cabal/src/Distribution/Simple/Configure.hs b/Cabal/src/Distribution/Simple/Configure.hs index 53c3b35caa0..68a3c885ba1 100644 --- a/Cabal/src/Distribution/Simple/Configure.hs +++ b/Cabal/src/Distribution/Simple/Configure.hs @@ -2556,6 +2556,7 @@ configurePkgconfigPackages verbosity pkg_descr progdb enabled traverse_ requirePkg allpkgs mlib' <- traverse addPkgConfigBILib (library pkg_descr) libs' <- traverse addPkgConfigBILib (subLibraries pkg_descr) + flibs' <- traverse addPkgConfigBIFLib (foreignLibs pkg_descr) exes' <- traverse addPkgConfigBIExe (executables pkg_descr) tests' <- traverse addPkgConfigBITest (testSuites pkg_descr) benches' <- traverse addPkgConfigBIBench (benchmarks pkg_descr) @@ -2563,6 +2564,7 @@ configurePkgconfigPackages verbosity pkg_descr progdb enabled pkg_descr { library = mlib' , subLibraries = libs' + , foreignLibs = flibs' , executables = exes' , testSuites = tests' , benchmarks = benches' @@ -2607,6 +2609,10 @@ configurePkgconfigPackages verbosity pkg_descr progdb enabled addPkgConfigBILib = addPkgConfigBI libBuildInfo $ \lib bi -> lib{libBuildInfo = bi} + -- Adds pkgconfig dependencies to the build info for a foreign library + addPkgConfigBIFLib = addPkgConfigBI foreignLibBuildInfo $ + \flib bi -> flib{foreignLibBuildInfo = bi} + -- Adds pkgconfig dependencies to the build info for an executable addPkgConfigBIExe = addPkgConfigBI buildInfo $ \exe bi -> exe{buildInfo = bi} diff --git a/cabal-testsuite/PackageTests/PkgConfigForeignLib/cabal.project b/cabal-testsuite/PackageTests/PkgConfigForeignLib/cabal.project new file mode 100644 index 00000000000..0d7f076e888 --- /dev/null +++ b/cabal-testsuite/PackageTests/PkgConfigForeignLib/cabal.project @@ -0,0 +1 @@ +packages: *.cabal diff --git a/cabal-testsuite/PackageTests/PkgConfigForeignLib/csrc/foo.c b/cabal-testsuite/PackageTests/PkgConfigForeignLib/csrc/foo.c new file mode 100644 index 00000000000..c96980cf08a --- /dev/null +++ b/cabal-testsuite/PackageTests/PkgConfigForeignLib/csrc/foo.c @@ -0,0 +1,5 @@ +#include + +int mylib_value(void) { + return MYLIB_VALUE; +} diff --git a/cabal-testsuite/PackageTests/PkgConfigForeignLib/include/mylib.h b/cabal-testsuite/PackageTests/PkgConfigForeignLib/include/mylib.h new file mode 100644 index 00000000000..31fe2b4f58e --- /dev/null +++ b/cabal-testsuite/PackageTests/PkgConfigForeignLib/include/mylib.h @@ -0,0 +1,6 @@ +#ifndef MYLIB_H +#define MYLIB_H + +#define MYLIB_VALUE 42 + +#endif diff --git a/cabal-testsuite/PackageTests/PkgConfigForeignLib/my.cabal b/cabal-testsuite/PackageTests/PkgConfigForeignLib/my.cabal new file mode 100644 index 00000000000..6d675ad1411 --- /dev/null +++ b/cabal-testsuite/PackageTests/PkgConfigForeignLib/my.cabal @@ -0,0 +1,16 @@ +name: PkgConfigForeignLib +version: 0.1 +license: BSD3 +synopsis: Test that pkgconfig-depends cflags reach foreign-library c-sources +category: PackageTests +build-type: Simple +cabal-version: 2.0 + +foreign-library myforeignlib + type: native-shared + pkgconfig-depends: mypkg + other-modules: MyForeignLib + hs-source-dirs: src + c-sources: csrc/foo.c + build-depends: base + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/PkgConfigForeignLib/pkg-config b/cabal-testsuite/PackageTests/PkgConfigForeignLib/pkg-config new file mode 100755 index 00000000000..87de012f6e1 --- /dev/null +++ b/cabal-testsuite/PackageTests/PkgConfigForeignLib/pkg-config @@ -0,0 +1,40 @@ +#!/bin/sh + +set -eu + +# Resolve the directory containing this shim so we can point pkg-config's +# --cflags at the header shipped next to it. +dir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" + +case "$*" in + '--version') + echo 0.29.2 + ;; + + '--variable pc_path pkg-config') + echo '.' + ;; + + '--list-all') + printf 'mypkg mypkg - my test package\n' + ;; + + '--modversion mypkg') + echo 1.0 + ;; + + '--cflags mypkg') + echo "-I$dir/include" + ;; + + '--libs mypkg') + ;; + + '--libs --static mypkg') + ;; + + *) + echo >&2 "pkg-config: unrecognised arguments $* (this is an incomplete shim)" + exit 1 + ;; +esac diff --git a/cabal-testsuite/PackageTests/PkgConfigForeignLib/setup.out b/cabal-testsuite/PackageTests/PkgConfigForeignLib/setup.out new file mode 100644 index 00000000000..beb4c71ed42 --- /dev/null +++ b/cabal-testsuite/PackageTests/PkgConfigForeignLib/setup.out @@ -0,0 +1,8 @@ +# cabal v2-build +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following will be built: + - PkgConfigForeignLib-0.1 (flib:myforeignlib) (first run) +Configuring foreign library 'myforeignlib' for PkgConfigForeignLib-0.1... +Preprocessing foreign library 'myforeignlib' for PkgConfigForeignLib-0.1... +Building foreign library 'myforeignlib' for PkgConfigForeignLib-0.1... diff --git a/cabal-testsuite/PackageTests/PkgConfigForeignLib/setup.test.hs b/cabal-testsuite/PackageTests/PkgConfigForeignLib/setup.test.hs new file mode 100644 index 00000000000..46614cbd36e --- /dev/null +++ b/cabal-testsuite/PackageTests/PkgConfigForeignLib/setup.test.hs @@ -0,0 +1,8 @@ +import Test.Cabal.Prelude + +-- Test that pkgconfig-depends cflags are propagated to the C compiler +-- when compiling the c-sources of a foreign-library (see #11297). +main = cabalTest $ do + when isWindows $ skip "pkg-config shim requires sh" + cdir <- testCurrentDir <$> getTestEnv + cabal "v2-build" ["--extra-prog-path=" ++ cdir] diff --git a/cabal-testsuite/PackageTests/PkgConfigForeignLib/src/MyForeignLib.hs b/cabal-testsuite/PackageTests/PkgConfigForeignLib/src/MyForeignLib.hs new file mode 100644 index 00000000000..30f73dcfc63 --- /dev/null +++ b/cabal-testsuite/PackageTests/PkgConfigForeignLib/src/MyForeignLib.hs @@ -0,0 +1,5 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +module MyForeignLib (mylibValue) where + +foreign import ccall "mylib_value" mylibValue :: IO Int diff --git a/changelog.d/12265.md b/changelog.d/12265.md new file mode 100644 index 00000000000..e0557e2c85a --- /dev/null +++ b/changelog.d/12265.md @@ -0,0 +1,12 @@ +--- +synopsis: Apply pkgconfig-depends flags to foreign-library c-sources +packages: [Cabal] +prs: 12265 +issues: 11297 +--- + +The `pkgconfig-depends` flags (e.g. `--cflags` include directories) were not +propagated to the C compiler when compiling the `c-sources` of a +`foreign-library`, unlike for `library` and `executable` components. This is now +fixed so that C sources in foreign libraries can use headers provided by +pkg-config dependencies.