
Jason Pepas wrote:
Jason Pepas wrote:
Jason Pepas wrote:
/lusr/bin/ghc -#include cutils.h -DSTAGE=1 -package-name ghc-6.10.1
Um, scratch that. I've apparently become confused as to which release I was actually building.
-jason
So I've run into a (legitimate) issue with building 6.8.3.
Initiall I was getting things like this:
build error: ../compiler/ghc-inplace -optc-O -optc-Wall -optc-W -optc-Wstrict-prototypes -optc-Wmissing-prototypes -optc-Wmissing-declarations -optc-Winline -optc-Waggregate-return -optc-I../includes -optc-I. -optc-Iparallel -optc-Ism -optc-DCOMPILING_RTS -optc-g -optc-O0 -optc-I../gmp/gmpbuild -optc-fno-strict-aliasing -H16m -O -package-name rts -static -I../gmp/gmpbuild -I. -#include HCIncludes.h -dcmm-lint -hisuf debug_hi -hcsuf debug_hc -osuf debug_o -optc-DDEBUG -c ProfHeap.c -o ProfHeap.debug_o
Printer.c:962:17: error: bfd.h: No such file or directory
this was being caused by not being able to find binutils-related headers. similar errors occured after not being able to find readline headers. (these were in a non-standard location).
I got around this by exporting some env vars:
export CPPFLAGS="-I/lusr/gnu/include -I/lusr/include" export LDFLAGS="-L/lusr/lib -L/lusr/gnu/lib"
however, that still didn't solve the problem, and eventually I resorted to "grafting" (copying via symlinks) the include files into the build-dir/includes directory.
that worked until I ran into this:
checking for readline in -lreadline... yes checking for rl_readline_version... yes checking for rl_begin_undo_group... yes checking for rl_erase_empty_line... yes checking for rl_free_undo_list... yes checking for rl_completion_word_break_hook in -lreadline... yes configure: creating ./config.status config.status: creating readline.buildinfo config.status: creating include/HsReadlineConfig.h if ifBuildable/ifBuildable readline; then \ cd readline && \ cmp -s ../Makefile.local Makefile.local || cp ../Makefile.local .; \ mv GNUmakefile GNUmakefile.tmp; \ setup/Setup makefile -f GNUmakefile; \ cmp -s GNUmakefile GNUmakefile.tmp && mv GNUmakefile.tmp GNUmakefile; \ make -wr --jobserver-fds=3,4 -j && \ setup/Setup register --inplace; \ fi mv: cannot stat `GNUmakefile': No such file or directory Preprocessing library readline-1.0.1.0... /lusr/gnu/bin/ld: cannot find -lreadline collect2: ld returned 1 exit status linking dist/build/System/Console/Readline_hsc_make.o failed command was: gcc -lreadline -lncurses dist/build/System/Console/Readline_hsc_make.o -o dist/build/System/Console/Readline_hsc_make make[2]: Entering directory `/v/filer4b/cvsbuild/CVSBUILD/ghc-6.8.3-linux-i686/ghc/libraries/readline' make[2]: *** No targets specified and no makefile found. Stop. make[2]: Leaving directory `/v/filer4b/cvsbuild/CVSBUILD/ghc-6.8.3-linux-i686/ghc/libraries/readline' make[1]: *** [make.library.readline] Error 2 make[1]: Leaving directory `/v/filer4b/cvsbuild/CVSBUILD/ghc-6.8.3-linux-i686/ghc/libraries' make: *** [stage1] Error 2
specifically, what is failing is the "setup/Setup makefile -f GNUmakefile" command.
bash-3.2$ setup/Setup makefile -f GNUmakefile Preprocessing library readline-1.0.1.0... /lusr/gnu/bin/ld: cannot find -lreadline collect2: ld returned 1 exit status linking dist/build/System/Console/Readline_hsc_make.o failed command was: gcc -lreadline -lncurses dist/build/System/Console/Readline_hsc_make.o -o dist/build/System/Console/Readline_hsc_make
however, if you cd into build-dir/libraries/readline and run this manually:
./configure --with-readline-includes=/lusr/gnu/include --with-readline-libraries=/lusr/gnu/lib
you can then run the "setup/Setup makefile -f GNUmakefile" and it works.
so I thought I'd try simply modifying the libraries/Makefile:
bash-3.2$ diff -urN libraries/Makefile.orig libraries/Makefile --- libraries/Makefile.orig 2009-04-06 14:36:44.000000000 -0500 +++ libraries/Makefile 2009-04-06 15:29:14.000000000 -0500 @@ -277,9 +277,11 @@ if ifBuildable/ifBuildable $*; then \ cd $* && \ cmp -s ../Makefile.local Makefile.local || cp ../Makefile.local .; \ - mv GNUmakefile GNUmakefile.tmp; \ + if [ -e GNUmakefile ] ; then mv GNUmakefile GNUmakefile.tmp ; fi ;\ + if [ "$*" = "readline" ] ; then ./configure --with-readline-includes=/lusr/gnu/include --with-readline-libraries=/lusr/gnu/lib ; fi ; \ setup/Setup makefile -f GNUmakefile; \ cmp -s GNUmakefile GNUmakefile.tmp && mv GNUmakefile.tmp GNUmakefile; \ + echo $(MAKE) $(MFLAGS) && \ $(MAKE) $(MFLAGS) && \ setup/Setup register --inplace; \ fi
but that doesn't work:
Preprocessing library readline-1.0.1.0... Generating Makefile readline-1.0.1.0... make -wr make[2]: Entering directory `/v/filer4b/cvsbuild/CVSBUILD/ghc-6.8.3-linux-i686/ghc/libraries/readline' make[2]: Nothing to be done for `all'. make[2]: Leaving directory `/v/filer4b/cvsbuild/CVSBUILD/ghc-6.8.3-linux-i686/ghc/libraries/readline' Registering readline-1.0.1.0... Reading package info from "dist/inplace-pkg-config" ... done. Unable to rename "/lusr/opt/ghc-6.8.3/lib/ghc-6.8.3/package.conf" to "/lusr/opt/ghc-6.8.3/lib/ghc-6.8.3/package.conf.old" Saving old package config file... ghc-pkg.bin: /lusr/opt/ghc-6.8.3/lib/ghc-6.8.3/package.conf: renameFile: permission denied (Permission denied) make[1]: *** [make.library.readline] Error 1 make[1]: Leaving directory `/v/filer4b/cvsbuild/CVSBUILD/ghc-6.8.3-linux-i686/ghc/libraries' make: *** [stage1] Error 2
At this point I think this has gotten a little too hack-ish, so I thought I'd ask the mailing list what for proper way of telling ghc where your readline installation lives?
I think the problem you're describing never got fixed: see http://hackage.haskell.org/trac/ghc/ticket/2970 and then we decided to replace readline with editline (bad mistake) and later decided to adopt haskeline instead. I believe some OSs (e.g. FreeBSD) that put readline outside the standard locations have their own hacks to get around this. Cheers, Simon