From 2b27cc164ae5a978a8abd9966d04af74628a5396 Mon Sep 17 00:00:00 2001
From: Ben Gamari <ben@smart-cactus.org>
Date: Mon, 11 Nov 2019 18:49:09 -0500
Subject: [PATCH] Properly account for libdw paths in make build system

Should finally fix #17255.
---
 hadrian/src/Settings/Packages.hs | 7 +++++--
 mk/config.mk.in                  | 1 +
 rts/ghc.mk                       | 2 ++
 rts/package.conf.in              | 7 ++++++-
 4 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/hadrian/src/Settings/Packages.hs b/hadrian/src/Settings/Packages.hs
index 4d399ca9f0e..b0e012d31e6 100644
--- a/hadrian/src/Settings/Packages.hs
+++ b/hadrian/src/Settings/Packages.hs
@@ -207,6 +207,7 @@ rtsPackageArgs = package rts ? do
           [ arg "-Irts"
           , arg $ "-I" ++ path
           , flag WithLibdw ? if not (null libdwIncludeDir) then arg ("-I" ++ libdwIncludeDir) else mempty
+          , flag WithLibdw ? if not (null libdwLibraryDir) then arg ("-L" ++ libdwLibraryDir) else mempty
           , arg $ "-DRtsWay=\"rts_" ++ show way ++ "\""
           -- Set the namespace for the rts fs functions
           , arg $ "-DFS_NAMESPACE=rts"
@@ -222,6 +223,7 @@ rtsPackageArgs = package rts ? do
     let cArgs = mconcat
           [ rtsWarnings
           , flag UseSystemFfi ? arg ("-I" ++ ffiIncludeDir)
+          , flag WithLibdw ? arg ("-I" ++ libdwIncludeDir)
           , arg "-fomit-frame-pointer"
           -- RTS *must* be compiled with optimisations. The INLINE_HEADER macro
           -- requires that functions are inlined to work as expected. Inlining
@@ -319,13 +321,14 @@ rtsPackageArgs = package rts ? do
         , builder (Ghc CompileCWithGhc) ? map ("-optc" ++) <$> cArgs
         , builder Ghc ? ghcArgs
 
-          , builder HsCpp ? pure
+        , builder HsCpp ? pure
           [ "-DTOP="             ++ show top
           , "-DFFI_INCLUDE_DIR=" ++ show ffiIncludeDir
           , "-DFFI_LIB_DIR="     ++ show ffiLibraryDir
           , "-DFFI_LIB="         ++ show libffiName
-          , "-DLIBDW_LIB_DIR="     ++ show libdwLibraryDir ]
+          , "-DLIBDW_LIB_DIR="   ++ show libdwLibraryDir ]
 
+        , builder HsCpp ? flag WithLibdw ? arg "-DUSE_LIBDW"
         , builder HsCpp ? flag HaveLibMingwEx ? arg "-DHAVE_LIBMINGWEX" ]
 
 -- Compile various performance-critical pieces *without* -fPIC -dynamic
diff --git a/mk/config.mk.in b/mk/config.mk.in
index eff6b366e95..41cd71ca1fc 100644
--- a/mk/config.mk.in
+++ b/mk/config.mk.in
@@ -363,6 +363,7 @@ UseSystemLibFFI=@UseSystemLibFFI@
 FFILibDir=@FFILibDir@
 FFIIncludeDir=@FFIIncludeDir@
 
+UseLibdw=@UseLibdw@
 LibdwLibDir=@LibdwLibDir@
 LibdwIncludeDir=@LibdwIncludeDir@
 
diff --git a/rts/ghc.mk b/rts/ghc.mk
index f25f2f9b756..dfff8df796b 100644
--- a/rts/ghc.mk
+++ b/rts/ghc.mk
@@ -544,8 +544,10 @@ rts_PACKAGE_CPP_OPTS += '-DFFI_LIB="C$(LIBFFI_NAME)"'
 endif
 
 ifeq "$(UseLibdw)" "YES"
+rts_PACKAGE_CPP_OPTS += -DLIBDW_INCLUDE_DIR=$(LibdwIncludeDir)
 rts_PACKAGE_CPP_OPTS += -DLIBDW_LIB_DIR=$(LibdwLibDir)
 else
+rts_PACKAGE_CPP_OPTS += -DLIBDW_INCLUDE_DIR=
 rts_PACKAGE_CPP_OPTS += -DLIBDW_LIB_DIR=
 endif
 
diff --git a/rts/package.conf.in b/rts/package.conf.in
index 93b664ae61b..e4cb159cb8d 100644
--- a/rts/package.conf.in
+++ b/rts/package.conf.in
@@ -67,7 +67,12 @@ extra-libraries:
 #if defined(INSTALLING)
 include-dirs:           INCLUDE_DIR FFI_INCLUDE_DIR
 #else /* !INSTALLING */
-include-dirs:           TOP"/rts/dist/build" TOP"/includes" TOP"/includes/dist-derivedconstants/header" FFI_INCLUDE_DIR TOP"/includes/dist-install/build"
+include-dirs:           TOP"/rts/dist/build"
+                        TOP"/includes"
+                        TOP"/includes/dist-derivedconstants/header"
+                        FFI_INCLUDE_DIR
+                        LIBDW_INCLUDE_DIR
+                        TOP"/includes/dist-install/build"
 #endif
 
 includes:               Stg.h
-- 
GitLab