Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes behaviour of default stdlib when internal-build-flag is set #2283

Merged
merged 5 commits into from
Aug 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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