Skip to content

Commit

Permalink
Add a test to check that extra-prog-path is honoured for local packages
Browse files Browse the repository at this point in the history
Whilst fixing #10692, I realised there was also this bug where
extra-prog-path would not be honoured for specific packages.

The idea behind extra-prog-path is that each local package can use a
different version of a preprocessor if desired.
  • Loading branch information
mpickering authored and sheaf committed Jan 15, 2025
1 parent bb4ae8b commit 6141c49
Show file tree
Hide file tree
Showing 11 changed files with 76 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
packages: client
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
This file is deliberately an invalid .x file,
to ensure that we pick up the local alex script rather than
any system-wide alex executable.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name: client
version: 0.1.0.0
synopsis: Checks build-tool-depends are put in PATH
license: BSD3
category: Testing
build-type: Simple
cabal-version: >=1.10

executable hello-world
main-is: Hello.hs
build-depends: base
default-language: Haskell2010
3 changes: 3 additions & 0 deletions cabal-testsuite/PackageTests/ExtraProgPathLocal/scripts/alex
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#! /usr/bin/env bash

echo "I am not the alex you are looking for"
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
path = "FINDSH/sh.exe"
args = "SCRIPTSDIR/alex"
4 changes: 4 additions & 0 deletions cabal-testsuite/PackageTests/ExtraProgPathLocal/scripts2/alex
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#! /usr/bin/env bash

echo "I am the alex you are looking for"
echo "module Main where main = print ()" > $3
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
path = "FINDSH/sh.exe"
args = "SCRIPTS2DIR/alex"
10 changes: 10 additions & 0 deletions cabal-testsuite/PackageTests/ExtraProgPathLocal/setup.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# cabal v2-build
Configuration is affected by the following files:
- cabal.project
Resolving dependencies...
Build profile: -w ghc-<GHCVER> -O1
In order, the following will be built:
- client-0.1.0.0 (exe:hello-world) (first run)
Configuring executable 'hello-world' for client-0.1.0.0...
Preprocessing executable 'hello-world' for client-0.1.0.0...
Building executable 'hello-world' for client-0.1.0.0...
39 changes: 39 additions & 0 deletions cabal-testsuite/PackageTests/ExtraProgPathLocal/setup.test.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import Test.Cabal.Prelude
import System.Directory

-- Test package-local extra-prog-path works.
main = cabalTest $ do
env <- getTestEnv
let
testDir = testCurrentDir env
tmpDir = testTmpDir env
scripts1 = tmpDir </> "scripts"
scripts2 = tmpDir </> "scripts2"

-------------------------
-- Workaround for the fact that, on Windows, Cabal will only look for
-- .exe files to satisfy executable dependencs. So we have to create
-- shim alex.exe files (the good one in 'scripts2', the bad one in 'scripts')
-- with the logic below.
when isWindows $ do
mb_sh <- fmap takeDirectory <$> liftIO (findExecutable "sh")
case mb_sh of
Nothing -> skip "no sh"
Just sh -> do
let escape = concatMap (\c -> case c of '\\' -> "\\\\\\\\"; x -> [x])
void $ shell "sed" [ "-i", "-e", "s/FINDSH/" <> escape sh <> "/g", escape (scripts1 </> "alex.shim"), escape (scripts2 </> "alex.shim") ]
void $ shell "sed" [ "-i", "-e", "s/SCRIPTSDIR/" <> escape scripts1 <> "/g", escape (scripts1 </> "alex.shim") ]
void $ shell "sed" [ "-i", "-e", "s/SCRIPTS2DIR/" <> escape scripts2 <> "/g", escape (scripts2 </> "alex.shim") ]

-- End of Windows workarounds
------------------------------

-- Add the 'scripts' directory to PATH, and add the 'scripts2' directory
-- to extra-prog-path.
--
-- This checks that the executables in extra-prog-path take priority over
-- those in PATH: 'scripts/alex' will fail, while 'scripts2/alex' will succeed.

liftIO $ appendFile (testDir </> "cabal.project") $
"\npackage client\n extra-prog-path:" ++ scripts2
addToPath scripts1 $ cabal "v2-build" ["client"]

0 comments on commit 6141c49

Please sign in to comment.