Ticket #318 (closed defect: fixed)

Opened 5 years ago

Last modified 3 years ago

Library cannnot be used when registered in-place on OS X

Reported by: guest Owned by:
Priority: normal Milestone: Cabal-1.8
Component: Cabal library Version: 1.4.0.1
Severity: normal Keywords:
Cc: johan.tibell@… Difficulty: easy (<4 hours)
GHC Version: 6.8.3 Platform: Mac OS

Description (last modified by guest) (diff)

I built and registered a library --inplace on Mac OS X 10.5.4 using cabal-install 0.5.1 and Cabal 1.4.0.1. I was unable to then use the package afterwards. Compiling my program failed at link-time with:

Linking Main ...
ld: in /... blah .../lib/dist/build/lib-0.1.a, archive has no table of contents
collect2: ld returned 1 exit status

After talking to Beelsebob and dcoutts on #haskell, I used ranlib on lib-0.1.a, and it worked.

According to dcoutts: "it's because we run ranlib when we install it, but not when we first generate it."

Attachments

in-place-ar-on-os-x.dpatch Download (72.2 KB) - added by tibbe 3 years ago.
Fixes in-place build on OS X

Change History

  Changed 5 years ago by guest

  • description modified (diff)

  Changed 5 years ago by duncan

  • difficulty changed from normal to easy (<4 hours)
  • component changed from cabal-install tool to Cabal library

Running ranlib every time is relatively expensive. We should either just do it, or require the use of install --inplace. Comments?

  Changed 4 years ago by duncan

Some OSX person needs to make a decision here. We can call ar without the q option and it'll be slower but should make the archive index. If we do it, it needs someone to test. Volunteers please.

follow-up: ↓ 5   Changed 4 years ago by guest

It turns out that cabal install --inplace doesn't run ranlib either -- the step is skipped completely in Distribution.Simple.GHC.installLib when the copyInPlace flag is set.

See also  http://hackage.haskell.org/trac/ghc/ticket/3137

in reply to: ↑ 4   Changed 4 years ago by duncan

Replying to guest:

It turns out that cabal install --inplace doesn't run ranlib either -- the step is skipped completely in Distribution.Simple.GHC.installLib when the copyInPlace flag is set.

This would be worth fixing if the decision is that running ranlib each time is too expensive. No OSX person has tried this yet or made a decision as far as I know.

I now rather expect that nobody would notice if we did just do it every time. Better than running ranlib is to call ar without the q flag. On GNU systems the q is effectively ignored anyway but on OSX it does make it quicker at the expense of not building the index.

So on the basis that a decision is better than no decision, even if as a non-OSX user I'm uninformed, how about we change the way we call ar so it always make the index and then just ask some OSX person to try it (and time it).

Still need someone to make the change and test it. Do not wait for me to do it, I do not have the time.

follow-up: ↓ 7   Changed 4 years ago by guest

Simply omitting the -q flag to ar is insufficient. According to the ar man pages, you need also to add the -s flag (to build the index). It can be a modifier, e.g. "ar -rs" says to add/replace the object file, and rebuild the index.

in reply to: ↑ 6   Changed 4 years ago by duncan

Replying to guest:

Simply omitting the -q flag to ar is insufficient. According to the ar man pages, you need also to add the -s flag (to build the index). It can be a modifier, e.g. "ar -rs" says to add/replace the object file, and rebuild the index.

OK, fine we can do that. It's the same syntax on Solaris and Linux.

  Changed 4 years ago by duncan

  • milestone set to Cabal-1.8

This is a problem for the Haskell Platform source build on OSX because we register packages inplace while building. At some point we'll do the same to allow exes to depend on the lib within the same package. So it needs fixing. Using ar without q seems like the best approach.

  Changed 4 years ago by duncan

So it looks like we should be using the flags as -r -s -c on all platforms. According to the GNU, Solaris and OSX man pages these flags are ok. The mingw version of ar also seems to support them.

The only reason to use the -q flag appears to be if we're having to call ar many times due to command line length limitations, in which case the first time we should use -q -c, the intermediate times -q and the final time -r -s.

  Changed 4 years ago by duncan

  • status changed from new to closed
  • resolution set to fixed
Sun May 31 20:34:12 BST 2009  Duncan Coutts <duncan@haskell.org>
  * Always build ar files with indexes
  Since we have to be able to use these inplace we always need
  the index it's not enough to just make the index on installing.
  This particularly affects OSX.

  Changed 4 years ago by guest

With this change, if multiple ar invocations add object files with identical names, only one of these object files is kept in the archive.

This can happen if a package has two modules with the same basename and --enable-split-objs is used.

Here is a toy script that demonstrates the problem:

# AR="/usr/bin/ar -q -c"
AR="/usr/bin/ar -r -s -c"
echo 'void f() { }' > a.c
gcc -c a.c
rm a.a
$AR a.a a.o
$AR a.a a.o
ar -s a.a
ar -t a.a

To solve this problem, we can go back to using 'ar -q' and then doing a 'ranlib' or 'ar -s' in the end. However, I'd propose that we rename the .o files to have unique names, because that has a better chance of being portable. (For linking, the name of the object file in the archive is immaterial)

The problem manifests itself in the form of link errors when using the affected package, like this one:

/opt/ghc-6.11/lib/HTTP-4000.0.7/ghc-6.11.20090605/libHSHTTP-4000.0.7.a(Headers__166.o): In function `sbwI_info':
(.text+0xbe): undefined reference to `HTTPzm4000zi0zi7_NetworkziStream_ErrorParse_con_info'

I'm using GNU ar of binutils 2.18. I'm not sure whether this is a bug in ar or not.

  Changed 4 years ago by guest

Oh and this only happens if the duplicate file name is spread over several invocations. If we do this:

AR="/usr/bin/ar -q -s -c"
echo 'void f() { }' > a.c
gcc -c a.c
cp a.o b.o
rm a.a
$AR a.a a.o b.o b.o
$AR a.a a.o
ar -s a.a
ar -t a.a

then we'll end up with a.a containing one copy of a.o and two copies of b.o

  Changed 4 years ago by guest

FTR:  http://www.opengroup.org/onlinepubs/000095399/utilities/ar.html says "It is unspecified whether multiple files in the archive may be identically named."

  Changed 4 years ago by duncan

Ok so here's a technique that should work:

  • For non-OSX, use the same behaviour as we always did (ie up to and including Cabal-1.6)
  • For OSX when we have to use ar multiple times (e.g. when doing split-objs) we call @ar -q@ for the initial calls and for the final call use @ar -q -s@.

I've had it confirmed that this works on OSX, it supports duplicates and creates the index.

Sun Jun  7 19:05:34 BST 2009  Duncan Coutts <duncan@haskell.org>
  * Use new Program.Ld and Program.Ar in GHC module

Sun Jun  7 19:02:57 BST 2009  Duncan Coutts <duncan@haskell.org>
  * Add specialised modules for handling ar and ld

Now needs testing.

  Changed 3 years ago by tibbe

  • cc johan.tibell@… added
  • status changed from closed to reopened
  • resolution fixed deleted

This does not work on in-place libraries. ar is run without the -s flag so no index is generated. Here's a snippet of the output of cabal build -v from building Cabal itself:

$ cabal build -v
Creating ./dist/setup (and its parents)
./dist/setup/setup build --verbose=2
Creating dist/build (and its parents)
Creating dist/build/autogen (and its parents)
Preprocessing library Cabal-1.9.1...
Building Cabal-1.9.1...
Building library...
Creating dist/build (and its parents)
/Users/tibell/bin/ghc --make -package-name Cabal-1.9.1 -hide-all-packages -fbuilding-cabal-package -i -idist/build -i. -idist/build/autogen -Idist/build/autogen -Idist/build -optP-DCABAL_VERSION=1,9,0 -optP-include -optPdist/build/autogen/cabal_macros.h -odir dist/build -hidir dist/build -stubdir dist/build -package-id array-0.3.0.0-dbdf73710a5bd9a534e8bcb2d8c8ee98 -package-id base-4.2.0.0-0120a3650a6376da8d1b6a4e48a2973a -package-id containers-0.3.0.0-409fe3b8f0dda25b98e03716d26be411 -package-id directory-1.0.1.0-76dcb137db629447ae580c8e076170d0 -package-id filepath-1.1.0.3-07812de93a673f50011d47451bcaac87 -package-id old-time-1.0.0.3-c6cff546303cb0a62627341768f3fe9d -package-id pretty-1.0.1.1-2bfa34c699efff7eed4d6297a2dac12d -package-id process-1.0.1.2-9a5e262f816b13040046ceaaabf515b9 -package-id unix-2.4.0.0-b7e23656587457fe3b2d4527ca7a9d1e -fwarn-tabs -Wall -fno-ignore-asserts -XCPP Distribution.Compiler Distribution.InstalledPackageInfo Distribution.License Distribution.Make Distribution.ModuleName Distribution.Package Distribution.PackageDescription Distribution.PackageDescription.Configuration Distribution.PackageDescription.Parse Distribution.PackageDescription.Check Distribution.ParseUtils Distribution.ReadE Distribution.Simple Distribution.Simple.Build Distribution.Simple.Build.Macros Distribution.Simple.Build.PathsModule Distribution.Simple.BuildPaths Distribution.Simple.Command Distribution.Simple.Compiler Distribution.Simple.Configure Distribution.Simple.GHC Distribution.Simple.LHC Distribution.Simple.Haddock Distribution.Simple.Hugs Distribution.Simple.Install Distribution.Simple.InstallDirs Distribution.Simple.JHC Distribution.Simple.LocalBuildInfo Distribution.Simple.NHC Distribution.Simple.PackageIndex Distribution.Simple.PreProcess Distribution.Simple.PreProcess.Unlit Distribution.Simple.Program Distribution.Simple.Program.Ar Distribution.Simple.Program.Builtin Distribution.Simple.Program.Db Distribution.Simple.Program.HcPkg Distribution.Simple.Program.Ld Distribution.Simple.Program.Run Distribution.Simple.Program.Script Distribution.Simple.Program.Types Distribution.Simple.Register Distribution.Simple.Setup Distribution.Simple.SrcDist Distribution.Simple.UHC Distribution.Simple.UserHooks Distribution.Simple.Utils Distribution.System Distribution.Text Distribution.Verbosity Distribution.Version Distribution.Compat.ReadP Language.Haskell.Extension Distribution.GetOpt Distribution.Compat.Exception Distribution.Compat.CopyFile Distribution.Compat.TempFile Distribution.Simple.GHC.IPI641 Distribution.Simple.GHC.IPI642
[ 1 of 59] Compiling Distribution.Simple.PreProcess.Unlit ( Distribution/Simple/PreProcess/Unlit.hs, dist/build/Distribution/Simple/PreProcess/Unlit.o )
[ 2 of 59] Compiling Distribution.GetOpt ( Distribution/GetOpt.hs, dist/build/Distribution/GetOpt.o )
[ 3 of 59] Compiling Distribution.Compat.Exception ( Distribution/Compat/Exception.hs, dist/build/Distribution/Compat/Exception.o )
[ 4 of 59] Compiling Distribution.Compat.TempFile ( Distribution/Compat/TempFile.hs, dist/build/Distribution/Compat/TempFile.o )
[ 5 of 59] Compiling Distribution.Compat.CopyFile ( Distribution/Compat/CopyFile.hs, dist/build/Distribution/Compat/CopyFile.o )
[ 6 of 59] Compiling Distribution.Compat.ReadP ( Distribution/Compat/ReadP.hs, dist/build/Distribution/Compat/ReadP.o )
[ 7 of 59] Compiling Distribution.ReadE ( Distribution/ReadE.hs, dist/build/Distribution/ReadE.o )
[ 8 of 59] Compiling Distribution.Verbosity ( Distribution/Verbosity.hs, dist/build/Distribution/Verbosity.o )
[ 9 of 59] Compiling Distribution.Text ( Distribution/Text.hs, dist/build/Distribution/Text.o )
[10 of 59] Compiling Distribution.ModuleName ( Distribution/ModuleName.hs, dist/build/Distribution/ModuleName.o )
[11 of 59] Compiling Distribution.System ( Distribution/System.hs, dist/build/Distribution/System.o )
[12 of 59] Compiling Language.Haskell.Extension ( Language/Haskell/Extension.hs, dist/build/Language/Haskell/Extension.o )
[13 of 59] Compiling Distribution.Version ( Distribution/Version.hs, dist/build/Distribution/Version.o )
[14 of 59] Compiling Distribution.License ( Distribution/License.hs, dist/build/Distribution/License.o )
[15 of 59] Compiling Distribution.Package ( Distribution/Package.hs, dist/build/Distribution/Package.o )
[16 of 59] Compiling Distribution.Simple.Utils ( Distribution/Simple/Utils.hs, dist/build/Distribution/Simple/Utils.o )
[17 of 59] Compiling Distribution.Simple.Program.Types ( Distribution/Simple/Program/Types.hs, dist/build/Distribution/Simple/Program/Types.o )
[18 of 59] Compiling Distribution.Simple.Program.Run ( Distribution/Simple/Program/Run.hs, dist/build/Distribution/Simple/Program/Run.o )
[19 of 59] Compiling Distribution.Simple.Program.Ar ( Distribution/Simple/Program/Ar.hs, dist/build/Distribution/Simple/Program/Ar.o )
[20 of 59] Compiling Distribution.Simple.Program.Ld ( Distribution/Simple/Program/Ld.hs, dist/build/Distribution/Simple/Program/Ld.o )
[21 of 59] Compiling Distribution.Simple.Program.Script ( Distribution/Simple/Program/Script.hs, dist/build/Distribution/Simple/Program/Script.o )
[22 of 59] Compiling Distribution.Simple.Program.Builtin ( Distribution/Simple/Program/Builtin.hs, dist/build/Distribution/Simple/Program/Builtin.o )
[23 of 59] Compiling Distribution.Simple.Program.Db ( Distribution/Simple/Program/Db.hs, dist/build/Distribution/Simple/Program/Db.o )
[24 of 59] Compiling Distribution.Simple.Program ( Distribution/Simple/Program.hs, dist/build/Distribution/Simple/Program.o )
[25 of 59] Compiling Distribution.Compiler ( Distribution/Compiler.hs, dist/build/Distribution/Compiler.o )
[26 of 59] Compiling Distribution.ParseUtils ( Distribution/ParseUtils.hs, dist/build/Distribution/ParseUtils.o )
[27 of 59] Compiling Distribution.InstalledPackageInfo ( Distribution/InstalledPackageInfo.hs, dist/build/Distribution/InstalledPackageInfo.o )
[28 of 59] Compiling Distribution.Simple.PackageIndex ( Distribution/Simple/PackageIndex.hs, dist/build/Distribution/Simple/PackageIndex.o )
[29 of 59] Compiling Distribution.Simple.GHC.IPI642 ( Distribution/Simple/GHC/IPI642.hs, dist/build/Distribution/Simple/GHC/IPI642.o )
[30 of 59] Compiling Distribution.Simple.GHC.IPI641 ( Distribution/Simple/GHC/IPI641.hs, dist/build/Distribution/Simple/GHC/IPI641.o )
[31 of 59] Compiling Distribution.Simple.Command ( Distribution/Simple/Command.hs, dist/build/Distribution/Simple/Command.o )
[32 of 59] Compiling Distribution.PackageDescription ( Distribution/PackageDescription.hs, dist/build/Distribution/PackageDescription.o )
[33 of 59] Compiling Distribution.PackageDescription.Configuration ( Distribution/PackageDescription/Configuration.hs, dist/build/Distribution/PackageDescription/Configuration.o )
[34 of 59] Compiling Distribution.PackageDescription.Parse ( Distribution/PackageDescription/Parse.hs, dist/build/Distribution/PackageDescription/Parse.o )
[35 of 59] Compiling Distribution.PackageDescription.Check ( Distribution/PackageDescription/Check.hs, dist/build/Distribution/PackageDescription/Check.o )
[36 of 59] Compiling Distribution.Simple.Compiler ( Distribution/Simple/Compiler.hs, dist/build/Distribution/Simple/Compiler.o )
[37 of 59] Compiling Distribution.Simple.Program.HcPkg ( Distribution/Simple/Program/HcPkg.hs, dist/build/Distribution/Simple/Program/HcPkg.o )
[38 of 59] Compiling Distribution.Simple.InstallDirs ( Distribution/Simple/InstallDirs.hs, dist/build/Distribution/Simple/InstallDirs.o )
[39 of 59] Compiling Distribution.Simple.Setup ( Distribution/Simple/Setup.hs, dist/build/Distribution/Simple/Setup.o )
[40 of 59] Compiling Distribution.Make ( Distribution/Make.hs, dist/build/Distribution/Make.o )
[41 of 59] Compiling Distribution.Simple.LocalBuildInfo ( Distribution/Simple/LocalBuildInfo.hs, dist/build/Distribution/Simple/LocalBuildInfo.o )
[42 of 59] Compiling Distribution.Simple.BuildPaths ( Distribution/Simple/BuildPaths.hs, dist/build/Distribution/Simple/BuildPaths.o )
[43 of 59] Compiling Distribution.Simple.PreProcess ( Distribution/Simple/PreProcess.hs, dist/build/Distribution/Simple/PreProcess.o )
[44 of 59] Compiling Distribution.Simple.UserHooks ( Distribution/Simple/UserHooks.hs, dist/build/Distribution/Simple/UserHooks.o )
[45 of 59] Compiling Distribution.Simple.SrcDist ( Distribution/Simple/SrcDist.hs, dist/build/Distribution/Simple/SrcDist.o )
[46 of 59] Compiling Distribution.Simple.JHC ( Distribution/Simple/JHC.hs, dist/build/Distribution/Simple/JHC.o )
[47 of 59] Compiling Distribution.Simple.NHC ( Distribution/Simple/NHC.hs, dist/build/Distribution/Simple/NHC.o )
[48 of 59] Compiling Distribution.Simple.Hugs ( Distribution/Simple/Hugs.hs, dist/build/Distribution/Simple/Hugs.o )
[49 of 59] Compiling Distribution.Simple.UHC ( Distribution/Simple/UHC.hs, dist/build/Distribution/Simple/UHC.o )
[50 of 59] Compiling Distribution.Simple.Build.Macros ( Distribution/Simple/Build/Macros.hs, dist/build/Distribution/Simple/Build/Macros.o )
[51 of 59] Compiling Distribution.Simple.Build.PathsModule ( Distribution/Simple/Build/PathsModule.hs, dist/build/Distribution/Simple/Build/PathsModule.o )
[52 of 59] Compiling Distribution.Simple.GHC ( Distribution/Simple/GHC.hs, dist/build/Distribution/Simple/GHC.o )
[53 of 59] Compiling Distribution.Simple.LHC ( Distribution/Simple/LHC.hs, dist/build/Distribution/Simple/LHC.o )

Distribution/Simple/LHC.hs:88:0:
    Warning: The import of `PackageName'
             from module `Distribution.Package' is redundant

Distribution/Simple/LHC.hs:261:0:
    Warning: Defined but not used: `removeMingwIncludeDir'
[54 of 59] Compiling Distribution.Simple.Register ( Distribution/Simple/Register.hs, dist/build/Distribution/Simple/Register.o )
[55 of 59] Compiling Distribution.Simple.Build ( Distribution/Simple/Build.hs, dist/build/Distribution/Simple/Build.o )
[56 of 59] Compiling Distribution.Simple.Haddock ( Distribution/Simple/Haddock.hs, dist/build/Distribution/Simple/Haddock.o )
[57 of 59] Compiling Distribution.Simple.Configure ( Distribution/Simple/Configure.hs, dist/build/Distribution/Simple/Configure.o )
[58 of 59] Compiling Distribution.Simple.Install ( Distribution/Simple/Install.hs, dist/build/Distribution/Simple/Install.o )
[59 of 59] Compiling Distribution.Simple ( Distribution/Simple.hs, dist/build/Distribution/Simple.o )
Linking...
/usr/bin/ar -r dist/build/libHSCabal-1.9.1.a dist/build/Distribution/Compiler.o dist/build/Distribution/InstalledPackageInfo.o dist/build/Distribution/License.o dist/build/Distribution/Make.o dist/build/Distribution/ModuleName.o dist/build/Distribution/Package.o dist/build/Distribution/PackageDescription.o dist/build/Distribution/PackageDescription/Configuration.o dist/build/Distribution/PackageDescription/Parse.o dist/build/Distribution/PackageDescription/Check.o dist/build/Distribution/ParseUtils.o dist/build/Distribution/ReadE.o dist/build/Distribution/Simple.o dist/build/Distribution/Simple/Build.o dist/build/Distribution/Simple/Build/Macros.o dist/build/Distribution/Simple/Build/PathsModule.o dist/build/Distribution/Simple/BuildPaths.o dist/build/Distribution/Simple/Command.o dist/build/Distribution/Simple/Compiler.o dist/build/Distribution/Simple/Configure.o dist/build/Distribution/Simple/GHC.o dist/build/Distribution/Simple/LHC.o dist/build/Distribution/Simple/Haddock.o dist/build/Distribution/Simple/Hugs.o dist/build/Distribution/Simple/Install.o dist/build/Distribution/Simple/InstallDirs.o dist/build/Distribution/Simple/JHC.o dist/build/Distribution/Simple/LocalBuildInfo.o dist/build/Distribution/Simple/NHC.o dist/build/Distribution/Simple/PackageIndex.o dist/build/Distribution/Simple/PreProcess.o dist/build/Distribution/Simple/PreProcess/Unlit.o dist/build/Distribution/Simple/Program.o dist/build/Distribution/Simple/Program/Ar.o dist/build/Distribution/Simple/Program/Builtin.o dist/build/Distribution/Simple/Program/Db.o dist/build/Distribution/Simple/Program/HcPkg.o dist/build/Distribution/Simple/Program/Ld.o dist/build/Distribution/Simple/Program/Run.o dist/build/Distribution/Simple/Program/Script.o dist/build/Distribution/Simple/Program/Types.o dist/build/Distribution/Simple/Register.o dist/build/Distribution/Simple/Setup.o dist/build/Distribution/Simple/SrcDist.o dist/build/Distribution/Simple/UHC.o dist/build/Distribution/Simple/UserHooks.o dist/build/Distribution/Simple/Utils.o dist/build/Distribution/System.o dist/build/Distribution/Text.o dist/build/Distribution/Verbosity.o dist/build/Distribution/Version.o dist/build/Distribution/Compat/ReadP.o dist/build/Language/Haskell/Extension.o dist/build/Distribution/GetOpt.o dist/build/Distribution/Compat/Exception.o dist/build/Distribution/Compat/CopyFile.o dist/build/Distribution/Compat/TempFile.o dist/build/Distribution/Simple/GHC/IPI641.o dist/build/Distribution/Simple/GHC/IPI642.o
ar: creating archive dist/build/libHSCabal-1.9.1.a
/usr/bin/ld -x -r -o dist/build/HSCabal-1.9.1.o dist/build/Distribution/Compiler.o dist/build/Distribution/InstalledPackageInfo.o dist/build/Distribution/License.o dist/build/Distribution/Make.o dist/build/Distribution/ModuleName.o dist/build/Distribution/Package.o dist/build/Distribution/PackageDescription.o dist/build/Distribution/PackageDescription/Configuration.o dist/build/Distribution/PackageDescription/Parse.o dist/build/Distribution/PackageDescription/Check.o dist/build/Distribution/ParseUtils.o dist/build/Distribution/ReadE.o dist/build/Distribution/Simple.o dist/build/Distribution/Simple/Build.o dist/build/Distribution/Simple/Build/Macros.o dist/build/Distribution/Simple/Build/PathsModule.o dist/build/Distribution/Simple/BuildPaths.o dist/build/Distribution/Simple/Command.o dist/build/Distribution/Simple/Compiler.o dist/build/Distribution/Simple/Configure.o dist/build/Distribution/Simple/GHC.o dist/build/Distribution/Simple/LHC.o dist/build/Distribution/Simple/Haddock.o dist/build/Distribution/Simple/Hugs.o dist/build/Distribution/Simple/Install.o dist/build/Distribution/Simple/InstallDirs.o dist/build/Distribution/Simple/JHC.o dist/build/Distribution/Simple/LocalBuildInfo.o dist/build/Distribution/Simple/NHC.o dist/build/Distribution/Simple/PackageIndex.o dist/build/Distribution/Simple/PreProcess.o dist/build/Distribution/Simple/PreProcess/Unlit.o dist/build/Distribution/Simple/Program.o dist/build/Distribution/Simple/Program/Ar.o dist/build/Distribution/Simple/Program/Builtin.o dist/build/Distribution/Simple/Program/Db.o dist/build/Distribution/Simple/Program/HcPkg.o dist/build/Distribution/Simple/Program/Ld.o dist/build/Distribution/Simple/Program/Run.o dist/build/Distribution/Simple/Program/Script.o dist/build/Distribution/Simple/Program/Types.o dist/build/Distribution/Simple/Register.o dist/build/Distribution/Simple/Setup.o dist/build/Distribution/Simple/SrcDist.o dist/build/Distribution/Simple/UHC.o dist/build/Distribution/Simple/UserHooks.o dist/build/Distribution/Simple/Utils.o dist/build/Distribution/System.o dist/build/Distribution/Text.o dist/build/Distribution/Verbosity.o dist/build/Distribution/Version.o dist/build/Distribution/Compat/ReadP.o dist/build/Language/Haskell/Extension.o dist/build/Distribution/GetOpt.o dist/build/Distribution/Compat/Exception.o dist/build/Distribution/Compat/CopyFile.o dist/build/Distribution/Compat/TempFile.o dist/build/Distribution/Simple/GHC/IPI641.o dist/build/Distribution/Simple/GHC/IPI642.o
Registering Cabal-1.9.1...
/Users/tibell/bin/ghc-pkg update - --global --user --package-conf=dist/package.conf.inplace

  Changed 3 years ago by tibbe

The attached patch should fix the problem. I verified that passing -s works even if there are two .o files with the same name on the command line:

$ mkdir foo
$ cd foo
$ cat > a.c
int foo(void) {
    return 0;
}
$ gcc -c a.c
$ cd ..
$ mkdir bar
$ cd bar
$ cat > a.c
int bar(void) {
    return 1;
}
$ gcc -c a.c
$ cd ..
$ ar -r -s blah.a foo/a.o bar/a.o
$ ar -t blah.a
__.SYMDEF SORTED
a.o
a.o

Changed 3 years ago by tibbe

Fixes in-place build on OS X

  Changed 3 years ago by duncan

  • status changed from reopened to closed
  • resolution set to fixed

Hopefully fixed again

Thu May 27 22:11:04 BST 2010  Johan Tibell <johan.tibell@gmail.com>
  * Make ar create index for in-place libraries when building
  Should fix ticket #318
Note: See TracTickets for help on using tickets.