diff --git a/Cabal/Distribution/PackageDescription.hs b/Cabal/Distribution/PackageDescription.hs index 871c92c3746735eabad5cf3820f665cc46e4eb66..47d321814a7eb59548b10ea69332daa1bdfc8fb9 100644 --- a/Cabal/Distribution/PackageDescription.hs +++ b/Cabal/Distribution/PackageDescription.hs @@ -77,6 +77,7 @@ module Distribution.PackageDescription ( allLanguages, allExtensions, usedExtensions, + usesTemplateHaskellOrQQ, hcOptions, hcProfOptions, hcSharedOptions, diff --git a/Cabal/Distribution/Simple/GHC.hs b/Cabal/Distribution/Simple/GHC.hs index 455cfed3e1bfd0ba941d81904919056667f0c26f..e74ba6bae0e56cce8b2190a3f491e4421fad8d0d 100644 --- a/Cabal/Distribution/Simple/GHC.hs +++ b/Cabal/Distribution/Simple/GHC.hs @@ -535,7 +535,7 @@ buildOrReplLib forRepl verbosity numJobs pkg_descr lbi lib clbi = do let isGhcDynamic = isDynamic comp dynamicTooSupported = supportsDynamicToo comp - doingTH = EnableExtension TemplateHaskell `elem` allExtensions libBi + doingTH = usesTemplateHaskellOrQQ libBi forceVanillaLib = doingTH && not isGhcDynamic forceSharedLib = doingTH && isGhcDynamic -- TH always needs default libs, even when building for profiling @@ -1184,7 +1184,7 @@ gbuild verbosity numJobs pkg_descr lbi bm clbi = do -- by the compiler. -- With dynamic-by-default GHC the TH object files loaded at compile-time -- need to be .dyn_o instead of .o. - doingTH = EnableExtension TemplateHaskell `elem` allExtensions bnfo + doingTH = usesTemplateHaskellOrQQ bnfo -- Should we use -dynamic-too instead of compiling twice? useDynToo = dynamicTooSupported && isGhcDynamic && doingTH && withStaticExe diff --git a/Cabal/Distribution/Simple/GHCJS.hs b/Cabal/Distribution/Simple/GHCJS.hs index ce204c0390f65d3c4386aa42d4d83628952d4b87..e06a8fe78a684a914d03cd04dff709006955d6f6 100644 --- a/Cabal/Distribution/Simple/GHCJS.hs +++ b/Cabal/Distribution/Simple/GHCJS.hs @@ -46,7 +46,6 @@ import Distribution.Verbosity import Distribution.Utils.NubList import Distribution.Text import Distribution.Types.UnitId -import Language.Haskell.Extension import qualified Data.Map as Map import System.Directory ( doesFileExist ) @@ -289,7 +288,7 @@ buildOrReplLib forRepl verbosity numJobs pkg_descr lbi lib clbi = do libBi = libBuildInfo lib isGhcjsDynamic = isDynamic comp dynamicTooSupported = supportsDynamicToo comp - doingTH = EnableExtension TemplateHaskell `elem` allExtensions libBi + doingTH = usesTemplateHaskellOrQQ libBi forceVanillaLib = doingTH && not isGhcjsDynamic forceSharedLib = doingTH && isGhcjsDynamic -- TH always needs default libs, even when building for profiling @@ -624,7 +623,7 @@ buildOrReplExe forRepl verbosity numJobs _pkg_descr lbi -- by the compiler. -- With dynamic-by-default GHC the TH object files loaded at compile-time -- need to be .dyn_o instead of .o. - doingTH = EnableExtension TemplateHaskell `elem` allExtensions exeBi + doingTH = usesTemplateHaskellOrQQ exeBi -- Should we use -dynamic-too instead of compiling twice? useDynToo = dynamicTooSupported && isGhcjsDynamic && doingTH && withStaticExe && null (ghcjsSharedOptions exeBi) diff --git a/Cabal/Distribution/Simple/LHC.hs b/Cabal/Distribution/Simple/LHC.hs index 9451831ffd85e2f746e0598972fd641f59b7af2e..ea3df7cc8e70a4019ea78a392c72d6699eae0b67 100644 --- a/Cabal/Distribution/Simple/LHC.hs +++ b/Cabal/Distribution/Simple/LHC.hs @@ -306,7 +306,7 @@ buildLib verbosity pkg_descr lbi lib clbi = do (compiler lbi) (withProfLib lbi) (libBuildInfo lib) let libTargetDir = pref - forceVanillaLib = EnableExtension TemplateHaskell `elem` allExtensions libBi + forceVanillaLib = usesTemplateHaskellOrQQ libBi -- TH always needs vanilla libs, even when building for profiling createDirectoryIfMissingVerbose verbosity True libTargetDir @@ -515,7 +515,7 @@ buildExe verbosity _pkg_descr lbi -- with profiling. This is because the code that TH needs to -- run at compile time needs to be the vanilla ABI so it can -- be loaded up and run by the compiler. - when (withProfExe lbi && EnableExtension TemplateHaskell `elem` allExtensions exeBi) + when (withProfExe lbi && usesTemplateHaskellOrQQ exeBi) (runGhcProg $ lhcWrap (binArgs False False)) runGhcProg (binArgs True (withProfExe lbi)) diff --git a/Cabal/Distribution/Types/BuildInfo.hs b/Cabal/Distribution/Types/BuildInfo.hs index 635834a8fb51eb627e040139e53bf26be8e1b14e..111ade8e4fbff3d91f99dd6b4193544942f47fbe 100644 --- a/Cabal/Distribution/Types/BuildInfo.hs +++ b/Cabal/Distribution/Types/BuildInfo.hs @@ -8,6 +8,7 @@ module Distribution.Types.BuildInfo ( allLanguages, allExtensions, usedExtensions, + usesTemplateHaskellOrQQ, hcOptions, hcProfOptions, @@ -180,6 +181,14 @@ usedExtensions :: BuildInfo -> [Extension] usedExtensions bi = oldExtensions bi ++ defaultExtensions bi +-- | Whether any modules in this component use Template Haskell or +-- Quasi Quotes +usesTemplateHaskellOrQQ :: BuildInfo -> Bool +usesTemplateHaskellOrQQ bi = any p (allExtensions bi) + where + p ex = ex `elem` + [EnableExtension TemplateHaskell, EnableExtension QuasiQuotes] + -- |Select options for a particular Haskell compiler. hcOptions :: CompilerFlavor -> BuildInfo -> [String] hcOptions = lookupHcOptions options diff --git a/Cabal/Language/Haskell/Extension.hs b/Cabal/Language/Haskell/Extension.hs index eacf0a2e76d1a272f4fe272f534969c4527db5a2..8f2358593eecb8dc2f7758caf5082d961315f874 100644 --- a/Cabal/Language/Haskell/Extension.hs +++ b/Cabal/Language/Haskell/Extension.hs @@ -777,7 +777,7 @@ data KnownExtension = -- code will compile with the new planned desugaring of fail. | MonadFailDesugaring - -- | A subset of @TemplateHaskell@ including only quasi-quoting. + -- | A subset of @TemplateHaskell@ including only quoting. | TemplateHaskellQuotes -- | Allows use of the @#label@ syntax. diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Exe.hs b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Exe.hs new file mode 100644 index 0000000000000000000000000000000000000000..7565ea2cab959b06df60671efa58fe4d64c4fbf2 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Exe.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE QuasiQuotes #-} +module Main where + +import QQ + +main = putStrLn [myq|hello|] diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Lib.hs b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Lib.hs new file mode 100644 index 0000000000000000000000000000000000000000..340f6dbd34c211d2985934c0e924e028c8c03492 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Lib.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE QuasiQuotes #-} +module Lib where + +import QQ + +val = [myq|hello|] diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/QQ.hs b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/QQ.hs new file mode 100644 index 0000000000000000000000000000000000000000..bd2fc6c4fc947a41c7ef86e3af70b25f19d73e93 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/QQ.hs @@ -0,0 +1,6 @@ +module QQ where + +import Language.Haskell.TH +import Language.Haskell.TH.Quote + +myq = QuasiQuoter { quoteExp = \s -> litE $ stringL $ s ++ " world"} diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/my.cabal b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/my.cabal new file mode 100644 index 0000000000000000000000000000000000000000..72fd9fca30856f89e549bf2c121f549f7da079f8 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/my.cabal @@ -0,0 +1,15 @@ +Name: quasiQuotes +Version: 0.1 +Build-Type: Simple +Cabal-Version: >= 1.2 + +Library + Exposed-Modules: Lib + Other-Modules: QQ + Build-Depends: base, template-haskell + Extensions: QuasiQuotes + +Executable main + Main-is: Exe.hs + Build-Depends: base, template-haskell + Extensions: QuasiQuotes diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.cabal.out b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.cabal.out new file mode 100644 index 0000000000000000000000000000000000000000..0f5c034c61cd0d6ed307e6a7962c299e4018757b --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.cabal.out @@ -0,0 +1,8 @@ +# Setup configure +Resolving dependencies... +Configuring quasiQuotes-0.1... +# Setup build +Preprocessing executable 'main' for quasiQuotes-0.1.. +Building executable 'main' for quasiQuotes-0.1.. +Preprocessing library for quasiQuotes-0.1.. +Building library for quasiQuotes-0.1.. diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.out b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.out new file mode 100644 index 0000000000000000000000000000000000000000..5fb92491c45bf2f4fc574a20fc70204ac48b2359 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.out @@ -0,0 +1,7 @@ +# Setup configure +Configuring quasiQuotes-0.1... +# Setup build +Preprocessing executable 'main' for quasiQuotes-0.1.. +Building executable 'main' for quasiQuotes-0.1.. +Preprocessing library for quasiQuotes-0.1.. +Building library for quasiQuotes-0.1.. diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.test.hs b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.test.hs new file mode 100644 index 0000000000000000000000000000000000000000..e35b9b695065f3e43497737af94bca53c08ee26d --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude +-- Test building a dynamic library/executable which uses QuasiQuotes +main = setupAndCabalTest $ do + skipUnless =<< hasSharedLibraries + setup_build ["--enable-shared", "--enable-executable-dynamic"] diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Exe.hs b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Exe.hs new file mode 100644 index 0000000000000000000000000000000000000000..7565ea2cab959b06df60671efa58fe4d64c4fbf2 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Exe.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE QuasiQuotes #-} +module Main where + +import QQ + +main = putStrLn [myq|hello|] diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Lib.hs b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Lib.hs new file mode 100644 index 0000000000000000000000000000000000000000..340f6dbd34c211d2985934c0e924e028c8c03492 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Lib.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE QuasiQuotes #-} +module Lib where + +import QQ + +val = [myq|hello|] diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/QQ.hs b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/QQ.hs new file mode 100644 index 0000000000000000000000000000000000000000..bd2fc6c4fc947a41c7ef86e3af70b25f19d73e93 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/QQ.hs @@ -0,0 +1,6 @@ +module QQ where + +import Language.Haskell.TH +import Language.Haskell.TH.Quote + +myq = QuasiQuoter { quoteExp = \s -> litE $ stringL $ s ++ " world"} diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/my.cabal b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/my.cabal new file mode 100644 index 0000000000000000000000000000000000000000..72fd9fca30856f89e549bf2c121f549f7da079f8 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/my.cabal @@ -0,0 +1,15 @@ +Name: quasiQuotes +Version: 0.1 +Build-Type: Simple +Cabal-Version: >= 1.2 + +Library + Exposed-Modules: Lib + Other-Modules: QQ + Build-Depends: base, template-haskell + Extensions: QuasiQuotes + +Executable main + Main-is: Exe.hs + Build-Depends: base, template-haskell + Extensions: QuasiQuotes diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.cabal.out b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.cabal.out new file mode 100644 index 0000000000000000000000000000000000000000..0f5c034c61cd0d6ed307e6a7962c299e4018757b --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.cabal.out @@ -0,0 +1,8 @@ +# Setup configure +Resolving dependencies... +Configuring quasiQuotes-0.1... +# Setup build +Preprocessing executable 'main' for quasiQuotes-0.1.. +Building executable 'main' for quasiQuotes-0.1.. +Preprocessing library for quasiQuotes-0.1.. +Building library for quasiQuotes-0.1.. diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.out b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.out new file mode 100644 index 0000000000000000000000000000000000000000..5fb92491c45bf2f4fc574a20fc70204ac48b2359 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.out @@ -0,0 +1,7 @@ +# Setup configure +Configuring quasiQuotes-0.1... +# Setup build +Preprocessing executable 'main' for quasiQuotes-0.1.. +Building executable 'main' for quasiQuotes-0.1.. +Preprocessing library for quasiQuotes-0.1.. +Building library for quasiQuotes-0.1.. diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.test.hs b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.test.hs new file mode 100644 index 0000000000000000000000000000000000000000..d555b26c2facdd96a8cdeb93e213358a4dbe6788 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.test.hs @@ -0,0 +1,7 @@ +import Test.Cabal.Prelude +-- Test building a profiled library/executable which uses QuasiQuotes +-- (setup has to build the non-profiled version first) +main = setupAndCabalTest $ do + skipUnless =<< hasProfiledLibraries + setup_build ["--enable-library-profiling", + "--enable-profiling"] diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Exe.hs b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Exe.hs new file mode 100644 index 0000000000000000000000000000000000000000..7565ea2cab959b06df60671efa58fe4d64c4fbf2 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Exe.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE QuasiQuotes #-} +module Main where + +import QQ + +main = putStrLn [myq|hello|] diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Lib.hs b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Lib.hs new file mode 100644 index 0000000000000000000000000000000000000000..340f6dbd34c211d2985934c0e924e028c8c03492 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Lib.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE QuasiQuotes #-} +module Lib where + +import QQ + +val = [myq|hello|] diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/QQ.hs b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/QQ.hs new file mode 100644 index 0000000000000000000000000000000000000000..bd2fc6c4fc947a41c7ef86e3af70b25f19d73e93 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/QQ.hs @@ -0,0 +1,6 @@ +module QQ where + +import Language.Haskell.TH +import Language.Haskell.TH.Quote + +myq = QuasiQuoter { quoteExp = \s -> litE $ stringL $ s ++ " world"} diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/my.cabal b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/my.cabal new file mode 100644 index 0000000000000000000000000000000000000000..72fd9fca30856f89e549bf2c121f549f7da079f8 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/my.cabal @@ -0,0 +1,15 @@ +Name: quasiQuotes +Version: 0.1 +Build-Type: Simple +Cabal-Version: >= 1.2 + +Library + Exposed-Modules: Lib + Other-Modules: QQ + Build-Depends: base, template-haskell + Extensions: QuasiQuotes + +Executable main + Main-is: Exe.hs + Build-Depends: base, template-haskell + Extensions: QuasiQuotes diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.cabal.out b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.cabal.out new file mode 100644 index 0000000000000000000000000000000000000000..0f5c034c61cd0d6ed307e6a7962c299e4018757b --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.cabal.out @@ -0,0 +1,8 @@ +# Setup configure +Resolving dependencies... +Configuring quasiQuotes-0.1... +# Setup build +Preprocessing executable 'main' for quasiQuotes-0.1.. +Building executable 'main' for quasiQuotes-0.1.. +Preprocessing library for quasiQuotes-0.1.. +Building library for quasiQuotes-0.1.. diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.out b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.out new file mode 100644 index 0000000000000000000000000000000000000000..5fb92491c45bf2f4fc574a20fc70204ac48b2359 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.out @@ -0,0 +1,7 @@ +# Setup configure +Configuring quasiQuotes-0.1... +# Setup build +Preprocessing executable 'main' for quasiQuotes-0.1.. +Building executable 'main' for quasiQuotes-0.1.. +Preprocessing library for quasiQuotes-0.1.. +Building library for quasiQuotes-0.1.. diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.test.hs b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.test.hs new file mode 100644 index 0000000000000000000000000000000000000000..df61a665bca98531fe555f208ea52b86c06523e6 --- /dev/null +++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.test.hs @@ -0,0 +1,3 @@ +import Test.Cabal.Prelude +-- Test building a vanilla library/executable which uses QuasiQuotes +main = setupAndCabalTest $ setup_build []