Skip to content

Commit

Permalink
Fixes behaviour of default stdlib when internal-build-flag is set (#2283
Browse files Browse the repository at this point in the history
)

The mechanism for using `--internal-build-flag` to set the build
directory for the default stdlib location already existed, it was just
unused (Nothing always passed in, instead of the entry point):


https://github.com/anoma/juvix/blob/11ebc4acde4d1c7e70568b35326074e5ee671a77/src/Juvix/Compiler/Concrete/Translation/FromParsed/Analysis/PathResolver.hs#L128

This PR fixes that issue, adds some smoke tests to check the behaviour
of the stdlib dependency.

* Closes #2273

The issue with what to do with relative stdlib dependency paths when
`--internal-build-flag` is set remains open:
#2274
  • Loading branch information
paulcadman authored Aug 9, 2023
1 parent e0aadef commit 7b000eb
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 30 deletions.
2 changes: 1 addition & 1 deletion app/Commands/Init.hs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ getPackage = do
_packageVersion = tversion,
_packageBuildDir = Nothing,
_packageMain = Nothing,
_packageDependencies = [defaultStdlibDep]
_packageDependencies = [defaultStdlibDep DefaultBuildDir]
}

getProjName :: forall r. (Members '[Embed IO] r) => Sem r Text
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,9 @@ mkPackageInfo ::
Sem r PackageInfo
mkPackageInfo mpackageEntry _packageRoot = do
let buildDir :: Path Abs Dir = maybe (rootBuildDir _packageRoot) (someBaseToAbs _packageRoot . (^. entryPointBuildDir)) mpackageEntry
buildDirDep :: Maybe (SomeBase Dir)
| isJust mpackageEntry = Just (Abs buildDir)
| otherwise = Nothing
buildDirDep :: BuildDir
| isJust mpackageEntry = CustomBuildDir (Abs buildDir)
| otherwise = DefaultBuildDir

_packagePackage <- maybe (readPackage _packageRoot buildDirDep) (return . (^. entryPointPackage)) mpackageEntry
let deps :: [Dependency] = _packagePackage ^. packageDependencies
Expand Down Expand Up @@ -118,14 +118,15 @@ registerDependencies' = do
| isGlobal -> do
glob <- globalRoot
let globDep = Dependency (mkPrepath (toFilePath glob))
addDependency' globDep
| otherwise -> addDependency' (Dependency (mkPrepath (toFilePath (e ^. entryPointRoot))))
addDependency' (Just e) globDep
| otherwise -> addDependency' (Just e) (Dependency (mkPrepath (toFilePath (e ^. entryPointRoot))))

addDependency' ::
(Members '[State ResolverState, Reader ResolverEnv, Files, Error Text] r) =>
Maybe EntryPoint ->
Dependency ->
Sem r ()
addDependency' = addDependencyHelper Nothing
addDependency' me = addDependencyHelper me

addDependencyHelper ::
(Members '[State ResolverState, Reader ResolverEnv, Files, Error Text] r) =>
Expand All @@ -139,7 +140,7 @@ addDependencyHelper me d = do
modify' (set (resolverPackages . at p) (Just pkgInfo))
forM_ (pkgInfo ^. packageRelativeFiles) $ \f -> do
modify' (over resolverFiles (HashMap.insertWith (<>) f (pure pkgInfo)))
forM_ (pkgInfo ^. packagePackage . packageDependencies) addDependency'
forM_ (pkgInfo ^. packagePackage . packageDependencies) (addDependency' Nothing)

currentPackage :: (Members '[State ResolverState, Reader ResolverEnv] r) => Sem r PackageInfo
currentPackage = do
Expand Down
36 changes: 23 additions & 13 deletions src/Juvix/Compiler/Pipeline/Package.hs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
module Juvix.Compiler.Pipeline.Package
( module Juvix.Compiler.Pipeline.Package.Dependency,
BuildDir (..),
RawPackage,
Package,
Package' (..),
Expand Down Expand Up @@ -95,13 +96,22 @@ instance FromJSON RawPackage where
err :: a
err = error "Failed to parse juvix.yaml"

data BuildDir
= DefaultBuildDir
| CustomBuildDir (SomeBase Dir)

resolveBuildDir :: BuildDir -> SomeBase Dir
resolveBuildDir = \case
DefaultBuildDir -> Rel (relBuildDir)
CustomBuildDir d -> d

-- | This is used when juvix.yaml exists but it is empty
emptyPackage :: Package
emptyPackage =
emptyPackage :: BuildDir -> Package
emptyPackage buildDir =
Package
{ _packageName = defaultPackageName,
_packageVersion = defaultVersion,
_packageDependencies = [defaultStdlibDep],
_packageDependencies = [defaultStdlibDep buildDir],
_packageMain = Nothing,
_packageBuildDir = Nothing
}
Expand All @@ -116,10 +126,10 @@ rawPackage pkg =
_packageMain = pkg ^. packageMain
}

processPackage :: forall r. (Members '[Error Text] r) => Maybe (SomeBase Dir) -> RawPackage -> Sem r Package
processPackage :: forall r. (Members '[Error Text] r) => BuildDir -> RawPackage -> Sem r Package
processPackage buildDir pkg = do
let _packageName = fromMaybe defaultPackageName (pkg ^. packageName)
base :: SomeBase Dir = fromMaybe (Rel relBuildDir) buildDir <///> relStdlibDir
base :: SomeBase Dir = (resolveBuildDir buildDir) <///> relStdlibDir
stdlib = Dependency (mkPrepath (fromSomeDir base))
_packageDependencies = fromMaybe [stdlib] (pkg ^. packageDependencies)
_packageVersion <- getVersion
Expand All @@ -137,8 +147,8 @@ processPackage buildDir pkg = do
Right v -> return v
Left err -> throw (pack (errorBundlePretty err))

defaultStdlibDep :: Dependency
defaultStdlibDep = Dependency (mkPrepath (toFilePath (relBuildDir <//> relStdlibDir)))
defaultStdlibDep :: BuildDir -> Dependency
defaultStdlibDep buildDir = Dependency (mkPrepath (fromSomeDir (resolveBuildDir buildDir <///> relStdlibDir)))

defaultPackageName :: Text
defaultPackageName = "my-project"
Expand All @@ -149,7 +159,7 @@ defaultVersion = SemVer 0 0 0 [] Nothing
globalPackage :: Package
globalPackage =
Package
{ _packageDependencies = [defaultStdlibDep],
{ _packageDependencies = [defaultStdlibDep DefaultBuildDir],
_packageName = "global-juvix-package",
_packageVersion = defaultVersion,
_packageMain = Nothing,
Expand All @@ -161,20 +171,20 @@ readPackage ::
forall r.
(Members '[Files, Error Text] r) =>
Path Abs Dir ->
Maybe (SomeBase Dir) ->
BuildDir ->
Sem r Package
readPackage root buildDir = do
bs <- readFileBS' yamlPath
if
| ByteString.null bs -> return emptyPackage
| ByteString.null bs -> return (emptyPackage buildDir)
| otherwise -> either (throw . pack . prettyPrintParseException) (processPackage buildDir) (decodeEither' bs)
where
yamlPath = root <//> juvixYamlFile

readPackageIO :: Path Abs Dir -> SomeBase Dir -> IO Package
readPackageIO :: Path Abs Dir -> BuildDir -> IO Package
readPackageIO root buildDir = do
let x :: Sem '[Error Text, Files, Embed IO] Package
x = readPackage root (Just buildDir)
x = readPackage root buildDir
m <- runM $ runFilesIO (runError x)
case m of
Left err -> putStrLn err >> exitFailure
Expand All @@ -191,7 +201,7 @@ readGlobalPackage :: Members '[Error Text, Files] r => Sem r Package
readGlobalPackage = do
yamlPath <- globalYaml
unlessM (fileExists' yamlPath) writeGlobalPackage
readPackage (parent yamlPath) Nothing
readPackage (parent yamlPath) DefaultBuildDir

writeGlobalPackage :: Members '[Files] r => Sem r ()
writeGlobalPackage = do
Expand Down
2 changes: 1 addition & 1 deletion src/Juvix/Compiler/Pipeline/Root.hs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ findRootAndChangeDir minputFileDir mbuildDir _rootsInvokeDir = do
let _rootsRootDir = parent yamlPath
_rootsPackageGlobal = False
_rootsBuildDir = getBuildDir mbuildDir _rootsRootDir
_rootsPackage <- readPackageIO _rootsRootDir (Abs _rootsBuildDir)
_rootsPackage <- readPackageIO _rootsRootDir (CustomBuildDir (Abs _rootsBuildDir))
return Roots {..}

getBuildDir :: Maybe (Path Abs Dir) -> Path Abs Dir -> Path Abs Dir
Expand Down
49 changes: 41 additions & 8 deletions tests/smoke/Commands/compile.smoke.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,47 @@ tests:
shell:
- bash
script: |
temp=$(mktemp -d)
cd ./examples/milestone/HelloWorld
juvix compile HelloWorld.juvix --internal-build-dir "$temp"
find "$temp" | wc -l
rm -rf "$temp"
stdout:
matches: |
\s*([2-9]|[1-9][0-9]+)
buildDir=$(mktemp -d)
rootDir=$(mktemp -d)
trap 'rm -rf -- "$buildDir"' EXIT
trap 'rm -rf -- "$rootDir"' EXIT
cp ./examples/milestone/HelloWorld/HelloWorld.juvix "$rootDir"
touch "$rootDir/juvix.yaml"
cd "$rootDir"
juvix compile HelloWorld.juvix --internal-build-dir "$buildDir"
num_files=$(ls -1qA "$buildDir" | wc -l)
if [ $num_files -le 0 ]; then
exit 1
fi
if [ -d "$rootDir/.juvix-build" ]; then
exit 1
fi
stdout: ""
exit-status: 0

- name: stdlib-in-default-build-dir
command:
shell:
- bash
script: |
rootDir=$(mktemp -d)
trap 'rm -rf -- "$rootDir"' EXIT
cp ./examples/milestone/HelloWorld/HelloWorld.juvix "$rootDir"
touch "$rootDir/juvix.yaml"
echo "dependencies: [.juvix-build/stdlib]" >> "$rootDir/juvix.yaml"
cd "$rootDir"
juvix compile HelloWorld.juvix
if [ ! -d "$rootDir/.juvix-build" ]; then
exit 1
fi
stdout: ""
exit-status: 0

- name: default-output-file-in-invoke-dir
Expand Down

0 comments on commit 7b000eb

Please sign in to comment.