Issue building with ghc-9.8.2 and packages unix, directory, filepath and os-string

Hi, I'm trying to get my program to compile with ghc-9.8.2. Raising the upper bounds of my dependencies I'm running into a compile error for the unix-2.8.5.1 package: [15 of 53] Compiling System.Posix.Env.PosixString ( /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.hs, /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.o, /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.dyn_o ) System/Posix/Env/PosixString.hsc:45:1: error: [GHC-87110] Could not load module ‘System.OsString.Internal.Types’. It is a member of the hidden package ‘os-string-2.0.3’. Perhaps you need to add ‘os-string’ to the build-depends in your .cabal file. It is a member of the hidden package ‘filepath-1.4.200.1’. Perhaps you need to add ‘filepath’ to the build-depends in your .cabal file. Use -v to see a list of the files searched for. | 45 | import System.OsString.Internal.Types | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ System/Posix/Env/PosixString.hsc:47:1: error: [GHC-61948] Could not find module ‘System.OsString.Data.ByteString.Short’. Perhaps you meant System.OsString.Data.ByteString.Short (needs flag -package-id os-string-2.0.3) System.OsPath.Data.ByteString.Short (needs flag -package-id filepath-1.4.200.1) System.OsString.Data.ByteString.Short.Word16 (needs flag -package-id os-string-2.0.3) | 47 | import qualified "os-string" System.OsString.Data.ByteString.Short as B | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ System/Posix/PosixPath/FilePath.hsc:50:1: error: [GHC-61948] Could not find module ‘System.OsString.Data.ByteString.Short’. Perhaps you meant System.OsString.Data.ByteString.Short (needs flag -package-id os-string-2.0.3) System.OsPath.Data.ByteString.Short (needs flag -package-id filepath-1.4.200.1) System.OsString.Data.ByteString.Short.Word16 (needs flag -package-id os-string-2.0.3) | 50 | import "os-string" System.OsString.Data.ByteString.Short as BSS | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ System/Posix/PosixPath/FilePath.hsc:55:1: error: [GHC-87110] Could not load module ‘System.OsString.Internal.Types’. It is a member of the hidden package ‘os-string-2.0.3’. Perhaps you need to add ‘os-string’ to the build-depends in your .cabal file. It is a member of the hidden package ‘filepath-1.4.200.1’. Perhaps you need to add ‘filepath’ to the build-depends in your .cabal file. Use -v to see a list of the files searched for. | 55 | import System.OsString.Internal.Types (PosixString(..), pattern PS) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ I can get rid of this compile error and a similar one for the directory package by setting the flag os-string in my cabal.project file: constraints: unix +os-string, directory +os-string Now I'm wondering what is the right way to handle this case? Thanks for any hints! Greetings, Daniel

Normally you do not need to set `constraints: unix +os-string, directory +os-string`. It’s better to let Cabal figure out a build plan without forcing its hand. Sharing your project would help, otherwise it’s hard to diagnose. Best regards, Andrew
On 30 May 2024, at 08:54, Daniel Trstenjak
wrote: Hi,
I'm trying to get my program to compile with ghc-9.8.2. Raising the upper bounds of my dependencies I'm running into a compile error for the unix-2.8.5.1 package:
[15 of 53] Compiling System.Posix.Env.PosixString ( /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.hs, /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.o, /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.dyn_o )
System/Posix/Env/PosixString.hsc:45:1: error: [GHC-87110] Could not load module ‘System.OsString.Internal.Types’. It is a member of the hidden package ‘os-string-2.0.3’. Perhaps you need to add ‘os-string’ to the build-depends in your .cabal file. It is a member of the hidden package ‘filepath-1.4.200.1’. Perhaps you need to add ‘filepath’ to the build-depends in your .cabal file. Use -v to see a list of the files searched for. | 45 | import System.OsString.Internal.Types | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
System/Posix/Env/PosixString.hsc:47:1: error: [GHC-61948] Could not find module ‘System.OsString.Data.ByteString.Short’. Perhaps you meant System.OsString.Data.ByteString.Short (needs flag -package-id os-string-2.0.3) System.OsPath.Data.ByteString.Short (needs flag -package-id filepath-1.4.200.1) System.OsString.Data.ByteString.Short.Word16 (needs flag -package-id os-string-2.0.3) | 47 | import qualified "os-string" System.OsString.Data.ByteString.Short as B | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
System/Posix/PosixPath/FilePath.hsc:50:1: error: [GHC-61948] Could not find module ‘System.OsString.Data.ByteString.Short’. Perhaps you meant System.OsString.Data.ByteString.Short (needs flag -package-id os-string-2.0.3) System.OsPath.Data.ByteString.Short (needs flag -package-id filepath-1.4.200.1) System.OsString.Data.ByteString.Short.Word16 (needs flag -package-id os-string-2.0.3) | 50 | import "os-string" System.OsString.Data.ByteString.Short as BSS | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
System/Posix/PosixPath/FilePath.hsc:55:1: error: [GHC-87110] Could not load module ‘System.OsString.Internal.Types’. It is a member of the hidden package ‘os-string-2.0.3’. Perhaps you need to add ‘os-string’ to the build-depends in your .cabal file. It is a member of the hidden package ‘filepath-1.4.200.1’. Perhaps you need to add ‘filepath’ to the build-depends in your .cabal file. Use -v to see a list of the files searched for. | 55 | import System.OsString.Internal.Types (PosixString(..), pattern PS) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I can get rid of this compile error and a similar one for the directory package by setting the flag os-string in my cabal.project file: constraints: unix +os-string, directory +os-string
Now I'm wondering what is the right way to handle this case? Thanks for any hints!
Greetings, Daniel _______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.

`os-string` has been split from `filepath` in filepath 1.5.0.0. If you search for "flag(os-string)" in unix' cabal file here: https://hackage.haskell.org/package/unix-2.8.5.1/unix.cabal you'll see that the package has been set up to use `os-string` if `filepath >= 1.5.0.0`, and to not depend on `os-string` otherwise. For filepath < 1.5.0.0, the modules in question are in the `filepath` package. You can get them by manually depending on `filepath` too. If you want the post-`os-string` split `filepath`, simply add a lower bound on the version of `filepath` in your thing.cabal file: `filepath
= 1.5.0.0`. As you can see, the diagnostic you got shows that you were indeed using an older `filepath` version.
- Tom On 30/05/2024 22:22, Andrew Lelechenko wrote:
Normally you do not need to set `constraints: unix +os-string, directory +os-string`. It’s better to let Cabal figure out a build plan without forcing its hand.
Sharing your project would help, otherwise it’s hard to diagnose.
Best regards, Andrew
On 30 May 2024, at 08:54, Daniel Trstenjak
wrote: Hi,
I'm trying to get my program to compile with ghc-9.8.2. Raising the upper bounds of my dependencies I'm running into a compile error for the unix-2.8.5.1 package:
[15 of 53] Compiling System.Posix.Env.PosixString ( /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.hs, /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.o, /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.dyn_o )
System/Posix/Env/PosixString.hsc:45:1: error: [GHC-87110] Could not load module ‘System.OsString.Internal.Types’. It is a member of the hidden package ‘os-string-2.0.3’. Perhaps you need to add ‘os-string’ to the build-depends in your .cabal file. It is a member of the hidden package ‘filepath-1.4.200.1’. Perhaps you need to add ‘filepath’ to the build-depends in your .cabal file. Use -v to see a list of the files searched for. | 45 | import System.OsString.Internal.Types | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
System/Posix/Env/PosixString.hsc:47:1: error: [GHC-61948] Could not find module ‘System.OsString.Data.ByteString.Short’. Perhaps you meant System.OsString.Data.ByteString.Short (needs flag -package-id os-string-2.0.3) System.OsPath.Data.ByteString.Short (needs flag -package-id filepath-1.4.200.1) System.OsString.Data.ByteString.Short.Word16 (needs flag -package-id os-string-2.0.3) | 47 | import qualified "os-string" System.OsString.Data.ByteString.Short as B | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
System/Posix/PosixPath/FilePath.hsc:50:1: error: [GHC-61948] Could not find module ‘System.OsString.Data.ByteString.Short’. Perhaps you meant System.OsString.Data.ByteString.Short (needs flag -package-id os-string-2.0.3) System.OsPath.Data.ByteString.Short (needs flag -package-id filepath-1.4.200.1) System.OsString.Data.ByteString.Short.Word16 (needs flag -package-id os-string-2.0.3) | 50 | import "os-string" System.OsString.Data.ByteString.Short as BSS | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
System/Posix/PosixPath/FilePath.hsc:55:1: error: [GHC-87110] Could not load module ‘System.OsString.Internal.Types’. It is a member of the hidden package ‘os-string-2.0.3’. Perhaps you need to add ‘os-string’ to the build-depends in your .cabal file. It is a member of the hidden package ‘filepath-1.4.200.1’. Perhaps you need to add ‘filepath’ to the build-depends in your .cabal file. Use -v to see a list of the files searched for. | 55 | import System.OsString.Internal.Types (PosixString(..), pattern PS) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I can get rid of this compile error and a similar one for the directory package by setting the flag os-string in my cabal.project file: constraints: unix +os-string, directory +os-string
Now I'm wondering what is the right way to handle this case? Thanks for any hints!
Greetings, Daniel _______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.
Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.

I'm sorry, I should have looked better at what you were actually doing -- I didn't realise you were getting these errors while building `unix` itself. Are you sure you have an unmodified copy of the `unix` package? In particular, it seems that it's missing a dependency on the `filepath` package, that should be declared on unix.cabal line 84 for your older version of `filepath`. Note that filepath 1.4.200.1 is marked deprecated on Hackage (the version number is coloured red). If you don't want to upgrade to filepath 1.5, you should probably use 1.4.300.2. - Tom On 30/05/2024 23:00, Tom Smeding wrote:
`os-string` has been split from `filepath` in filepath 1.5.0.0. If you search for "flag(os-string)" in unix' cabal file here: https://hackage.haskell.org/package/unix-2.8.5.1/unix.cabal you'll see that the package has been set up to use `os-string` if `filepath >= 1.5.0.0`, and to not depend on `os-string` otherwise.
For filepath < 1.5.0.0, the modules in question are in the `filepath` package. You can get them by manually depending on `filepath` too.
If you want the post-`os-string` split `filepath`, simply add a lower bound on the version of `filepath` in your thing.cabal file: `filepath
= 1.5.0.0`. As you can see, the diagnostic you got shows that you were indeed using an older `filepath` version.
- Tom
On 30/05/2024 22:22, Andrew Lelechenko wrote:
Normally you do not need to set `constraints: unix +os-string, directory +os-string`. It’s better to let Cabal figure out a build plan without forcing its hand.
Sharing your project would help, otherwise it’s hard to diagnose.
Best regards, Andrew
On 30 May 2024, at 08:54, Daniel Trstenjak
wrote: Hi,
I'm trying to get my program to compile with ghc-9.8.2. Raising the upper bounds of my dependencies I'm running into a compile error for the unix-2.8.5.1 package:
[15 of 53] Compiling System.Posix.Env.PosixString ( /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.hs, /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.o, /home/dan/sources/unix-2.8.5.1/dist-newstyle/build/x86_64-linux/ghc-9.8.2/unix-2.8.5.1/build/System/Posix/Env/PosixString.dyn_o )
System/Posix/Env/PosixString.hsc:45:1: error: [GHC-87110] Could not load module ‘System.OsString.Internal.Types’. It is a member of the hidden package ‘os-string-2.0.3’. Perhaps you need to add ‘os-string’ to the build-depends in your .cabal file. It is a member of the hidden package ‘filepath-1.4.200.1’. Perhaps you need to add ‘filepath’ to the build-depends in your .cabal file. Use -v to see a list of the files searched for. | 45 | import System.OsString.Internal.Types | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
System/Posix/Env/PosixString.hsc:47:1: error: [GHC-61948] Could not find module ‘System.OsString.Data.ByteString.Short’. Perhaps you meant System.OsString.Data.ByteString.Short (needs flag -package-id os-string-2.0.3) System.OsPath.Data.ByteString.Short (needs flag -package-id filepath-1.4.200.1) System.OsString.Data.ByteString.Short.Word16 (needs flag -package-id os-string-2.0.3) | 47 | import qualified "os-string" System.OsString.Data.ByteString.Short as B | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
System/Posix/PosixPath/FilePath.hsc:50:1: error: [GHC-61948] Could not find module ‘System.OsString.Data.ByteString.Short’. Perhaps you meant System.OsString.Data.ByteString.Short (needs flag -package-id os-string-2.0.3) System.OsPath.Data.ByteString.Short (needs flag -package-id filepath-1.4.200.1) System.OsString.Data.ByteString.Short.Word16 (needs flag -package-id os-string-2.0.3) | 50 | import "os-string" System.OsString.Data.ByteString.Short as BSS | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
System/Posix/PosixPath/FilePath.hsc:55:1: error: [GHC-87110] Could not load module ‘System.OsString.Internal.Types’. It is a member of the hidden package ‘os-string-2.0.3’. Perhaps you need to add ‘os-string’ to the build-depends in your .cabal file. It is a member of the hidden package ‘filepath-1.4.200.1’. Perhaps you need to add ‘filepath’ to the build-depends in your .cabal file. Use -v to see a list of the files searched for. | 55 | import System.OsString.Internal.Types (PosixString(..), pattern PS) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I can get rid of this compile error and a similar one for the directory package by setting the flag os-string in my cabal.project file: constraints: unix +os-string, directory +os-string
Now I'm wondering what is the right way to handle this case? Thanks for any hints!
Greetings, Daniel _______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.
Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.
_______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.

Sharing your project would help, otherwise it’s hard to diagnose.
The project is https://github.com/dan-t/cabal-bounds. Cloning the current version and building it with ghc-9.8.2, cabal-3.10.3.0 and ´cabal build —allow-newer´ should result in the described error. Greetings, Daniel

Hi Daniel, --allow-newer is a blunt instrument, not much surprise it fails. Use a more precise incantation: cabal build --allow-newer='cabal-bounds:*,cabal-lenses:*’ works fine for me. Best regards, Andrew
On 31 May 2024, at 14:17, Daniel Trstenjak
wrote: Sharing your project would help, otherwise it’s hard to diagnose.
The project is https://github.com/dan-t/cabal-bounds. Cloning the current version and building it with ghc-9.8.2, cabal-3.10.3.0 and ´cabal build —allow-newer´ should result in the described error.
Greetings, Daniel _______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.

Hi Andrew,
--allow-newer is a blunt instrument, not much surprise it fails. Use a more precise incantation: cabal build --allow-newer='cabal-bounds:*,cabal-lenses:*’ works fine for me.
thanks for the hint, but how can this compile error occur if cabal can resolve the dependencies? I would‘ve thought, that the dependency resolution would fail before. Greetings, Daniel

The problem is that `--allow-newer` tells cabal to ignore dependencies'
upper bounds completely. If those bounds turn out to be necessary in some
cases, the solver will produce a bad build plan. Using finer-grained
(per-dependency) `--allow-newer` can avoid this by only permitting the
solver to ignore specific constraints.
On Fri, May 31, 2024 at 4:57 PM Daniel Trstenjak
Hi Andrew,
--allow-newer is a blunt instrument, not much surprise it fails. Use a more precise incantation: cabal build --allow-newer='cabal-bounds:*,cabal-lenses:*’ works fine for me.
thanks for the hint, but how can this compile error occur if cabal can resolve the dependencies? I would‘ve thought, that the dependency resolution would fail before.
Greetings, Daniel _______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.
-- brandon s allbery kf8nh allbery.b@gmail.com
participants (4)
-
Andrew Lelechenko
-
Brandon Allbery
-
Daniel Trstenjak
-
Tom Smeding