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

Package global build-depends should apply constraints to all components #3404

Closed
ezyang opened this issue May 5, 2016 · 5 comments
Closed

Comments

@ezyang
Copy link
Contributor

ezyang commented May 5, 2016

A common complaint is that there is no capacity for shared Cabal fields between components, c.f. #1949 and #2832. build-depends in particular is a common complaint, since a common Cabal idiom is to rebuild the same source files as part of multiple components.

I think there is at least a partial solution to this problem: top-level build-depends should be brought back, with the following semantics:

  1. If I write p >= 3 in the top-level build depends, IF we would have solved for a version of p, then we apply the constraint that its version is >=3
  2. Top-level build depends do not affect visibility of packages in components; so you still have to write build-depends: p inside any component that wants to use p.

In effect, we can centralize version bounds in one part of the Cabal file, while having fine granularity for specifying what components need what dependencies (so that the library doesn't need to depend on the package test suite). Of course the old syntax is still supported, so components can add their own bounds (toggled if the component is enabled.)

What do people think about this?

@mgsloan
Copy link
Collaborator

mgsloan commented May 5, 2016

Why not make the inclusion of a package in a component be implicit? This is how hpack works, and it works very well indeed. Why try to reduce the number of deps for non-library components? AFAIK the only downside of more deps is potential module name ambiguity.

@ezyang
Copy link
Contributor Author

ezyang commented May 5, 2016

I guess that's OK. Then this is a special case of #2832 (instead of putting a build-depends in all, just put it at the top-level).

(The reason why I didn't propose this originally was that I thought that if you have multiple test suite stanzas, you might want to specify a common bound for e.g. HUnit on all the test suites, without bringing in the dependency on the library which shouldn't depend on HUnit. But I guess this is a very weak reasoning.)

@mgsloan
Copy link
Collaborator

mgsloan commented May 5, 2016

Yup, I think it's best to err on the side of concision, particularly if a bit of boilerplate can be used for those less common cases.

@23Skidoo
Copy link
Member

23Skidoo commented May 6, 2016

Yes, I think it would be better to just implement #2832. I like the common stanza proposal a bit more than a top-level build-depends since it's more explicit and general. Another idea that we maybe can steal from hpack is populating other-modules automagically from hs-source-dirs.

@23Skidoo 23Skidoo added this to the Cabal 1.26 milestone May 6, 2016
@ezyang
Copy link
Contributor Author

ezyang commented May 6, 2016

OK, closing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants