Opened 10 years ago

Closed 10 years ago

Last modified 9 years ago

#2190 closed bug (invalid)

unionBuildInfo should not always use nub

Reported by: prj Owned by:
Priority: normal Milestone:
Component: libraries (other) Version: 6.8.2
Keywords: unionBuildInfo nub Cc: prj-site-hackage.haskell.org@…
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:

Description

In libraries/Cabal/Distribution/PackageDescription.hs, the unionBuildInfo function combines, for example, ldOptions from two BuildInfos, using nub to eliminate duplicate arguments. This is wrong for ldOptions and some other elements. For example, if ldOptions contains:

-Xlinker -R -Xlinker /dir1 -Xlinker -R -Xlinker /dir2

Then the nubbed result is:

-Xlinker -R /dir1 /dir2

which doesn't work at all. There may be some redundancy that could be eliminated, but for arguments passed to external programs, it can only be done safely by understanding the semantics of the arguments. Similarly for extraLibs, -lfoo -lbar -lfoo may be necessary if libfoo and libbar reference each other's symbols.

Using nub is wrong for at least cppOptions, ccOptions, ldOptions, and extraLibs. But I think it is necessary for some other BuildInfo components, like hsSourceDirs, so it can't be removed completely; that results in an error while building GHC:

Preprocessing library unix-2.3.0.0...
Generating Makefile unix-2.3.0.0...
Setup: makefile: can't cope with multiple hs-source-dirs yet, sorry

So combine could take an extra arguments, which would be nub in some cases or id in others.

Change History (3)

comment:1 Changed 10 years ago by igloo

difficulty: Unknown
Resolution: invalid
Status: newclosed

Thanks for the report. I've refiled it as a Cabal bug here: http://hackage.haskell.org/trac/hackage/ticket/264

comment:2 Changed 9 years ago by simonmar

Architecture: MultipleUnknown/Multiple

comment:3 Changed 9 years ago by simonmar

Operating System: MultipleUnknown/Multiple
Note: See TracTickets for help on using tickets.