Opened 8 years ago

Closed 8 years ago

#820 closed bug (invalid)

problem compiling a file with top level Template Haskell splice

Reported by: guest Owned by:
Priority: normal Milestone: 6.6
Component: Template Haskell Version: 6.4.2
Keywords: Cc:
Operating System: Linux Architecture: x86_64 (amd64)
Type of failure: Difficulty: Unknown
Test Case: Blocked By:
Blocking: Related Tickets:

Description (last modified by simonpj)

when compiling a file has both the following

  • a -package option that loads a package with ref to external library,
  • a top level Template Haskell splice $(...)

The compiler fails to load the library required by the package properly and yields a failed compile due to 'unknown symbol'

I have a simple example that refers to the JRegex package, which loads libpcre.so. The compile fails when compiling UseTH.hs, which refers to the package JRegex, and has a top level splice.
Regex is available with cabalized build setup at
http://repetae.net/john/computer/haskell/JRegex/
and is trivial to install.

It is simple to get around the problem, as 'make separate' does here by eliminating the dependency on the package in the file that splices but in case someone else has this problem it doesn't hurt to have it documented.

uname -a = 
Linux server2 2.6.14-1.1656_FC4 #1 Thu Jan 5 22:13:55 EST 2006 x86_64 x86_64 x86_64 GNU/Linux

ghc -v = 
Glasgow Haskell Compiler, Version 6.4.2, for Haskell 98, compiled by GHC version 6.4.2
Using package config file: /usr/local/lib/ghc-6.4.2/package.conf
Using package config file: /home/ben/.ghc/x86_64-linux-6.4.2/package.conf
Hsc static flags: -static
*** Deleting temp files
Deleting:
ghc-6.4.2: no input files
Usage: For basic information, try the `--help' option.

Files = Makefile, Regex.hs, DefineTH.hs, UseTH.hs

Makefile
--------------------------
SRCS = Regex.hs UseTH.hs DefineTH.hs

together : $(SRCS)
	ghc -v --make -package JRegex -fth -lpcre $^


separate : $(SRCS:.hs=.o) 
	ghc -v -package JRegex -package template-haskell -fth -lpcre $^ 

# eliminate -package JRegex to get TH splice to work
UseTH.o : UseTH.hs
	ghc -v -c -fth $<

%.o:	%.hs
	ghc -v -c -i. -package JRegex -fth -lpcre $^

%.hi:		%.o
		@:


.PHONY:		clean
clean: 
	rm *.hi *.o a.out

Regex.o : UseTH.hi
UseTH.o : DefineTH.hi
-----------------------------
Regex.hs
-----------------------------
module Main where

import Text.JRegex
import Data.Array
import UseTH

main = putStrLn "hello"
---------------------------------
DefineTH.hs
--------------------------------
module DefineTH 

where 
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import System

getEnvExpr :: String -> String -> ExpQ 
getEnvExpr s alt = 
    (runIO $ System.getEnv s `catch` (\e -> return alt)) >>= lift
----------------------------
UseTH.hs
------------------------------
module UseTH 
where 

import DefineTH

dir = $(getEnvExpr "HOME" "")

  • run of make together
ghc -v --make -package JRegex -fth -lpcre Regex.hs UseTH.hs DefineTH.hs
Glasgow Haskell Compiler, Version 6.4.2, for Haskell 98, compiled by GHC version 6.4.2
Using package config file: /usr/local/lib/ghc-6.4.2/package.conf
Using package config file: /home/ben/.ghc/x86_64-linux-6.4.2/package.conf
Hsc static flags: -static
*** Chasing dependencies:
Chasing modules from: Regex.hs,UseTH.hs,DefineTH.hs
Stable modules:
*** Compiling DefineTH         ( DefineTH.hs, interpreted ):
compile: input file DefineTH.hs
*** Checking old interface for DefineTH:
Compiling DefineTH         ( DefineTH.hs, DefineTH.o )
*** Parser:
*** Renamer/typechecker:
*** Desugar:
    Result size = 44
*** Simplify:
    Result size = 40
    Result size = 38
*** Tidy Core:
    Result size = 38
*** CorePrep:
    Result size = 46
*** Stg2Stg:
*** CodeGen:
*** CodeOutput:
*** Assembler
gcc -I. -c /tmp/ghc28762.s -o DefineTH.o
*** Deleting temp files
Deleting: /tmp/ghc28762.s
*** Compiling UseTH            ( UseTH.hs, interpreted ):
compile: input file UseTH.hs
*** Checking old interface for UseTH:
Compiling UseTH            ( UseTH.hs, UseTH.o )
*** Parser:
*** Renamer/typechecker:
*** Desugar:
*** Simplify:
*** CorePrep:
*** ByteCodeGen:
Loading package base-1.0 ... linking ... done.
ghc-6.4.2: /usr/local/lib/JRegex-1.0/ghc-6.4.2/HSJRegex-1.0.o: unknown symbol `pcre_version'
*** Deleting temp files
Deleting: /tmp/ghc28762.s
Warning: deleting non-existent /tmp/ghc28762.s
Loading package JRegex-1.0 ... linking ... ghc-6.4.2: unable to load package `JRegex-1.0'
make: *** [together] Error 1

--- run of make separate

ghc -v -c -i. -package JRegex -fth -lpcre DefineTH.hs
Glasgow Haskell Compiler, Version 6.4.2, for Haskell 98, compiled by GHC version 6.4.2
Using package config file: /usr/local/lib/ghc-6.4.2/package.conf
Using package config file: /home/ben/.ghc/x86_64-linux-6.4.2/package.conf
Hsc static flags: -static
*** Checking old interface for DefineTH:
*** Parser:
*** Renamer/typechecker:
*** Desugar:
    Result size = 44
*** Simplify:
    Result size = 40
    Result size = 38
*** Tidy Core:
    Result size = 38
*** CorePrep:
    Result size = 46
*** Stg2Stg:
*** CodeGen:
*** CodeOutput:
*** Assembler
gcc -I. -c /tmp/ghc28779.s -o DefineTH.o
*** Deleting temp files
Deleting: /tmp/ghc28779.s
ghc -v -c -fth UseTH.hs
Glasgow Haskell Compiler, Version 6.4.2, for Haskell 98, compiled by GHC version 6.4.2
Using package config file: /usr/local/lib/ghc-6.4.2/package.conf
Using package config file: /home/ben/.ghc/x86_64-linux-6.4.2/package.conf
Hsc static flags: -static
*** Checking old interface for UseTH:
*** Parser:
*** Renamer/typechecker:
*** Desugar:
*** Simplify:
*** CorePrep:
*** ByteCodeGen:
Loading package base-1.0 ... linking ... done.
Loading package haskell98-1.0 ... linking ... done.
Loading package template-haskell-1.0 ... linking ... done.
*** Desugar:
    Result size = 41
*** Simplify:
    Result size = 75
    Result size = 73
*** Tidy Core:
    Result size = 73
*** CorePrep:
    Result size = 73
*** Stg2Stg:
*** CodeGen:
*** CodeOutput:
*** Assembler
gcc -I. -c /tmp/ghc28785.s -o UseTH.o
*** Deleting temp files
Deleting: /tmp/ghc28785.s
ghc -v -c -i. -package JRegex -fth -lpcre Regex.hs UseTH.hi
Glasgow Haskell Compiler, Version 6.4.2, for Haskell 98, compiled by GHC version 6.4.2
Using package config file: /usr/local/lib/ghc-6.4.2/package.conf
Using package config file: /home/ben/.ghc/x86_64-linux-6.4.2/package.conf
Hsc static flags: -static
*** Checking old interface for Main:
*** Parser:
*** Renamer/typechecker:
*** Desugar:
    Result size = 10
*** Simplify:
    Result size = 10
    Result size = 8
    Result size = 8
*** Tidy Core:
    Result size = 8
*** CorePrep:
    Result size = 10
*** Stg2Stg:
*** CodeGen:
*** CodeOutput:
*** Assembler
gcc -I. -c /tmp/ghc28790.s -o Regex.o
*** Deleting temp files
Deleting: /tmp/ghc28790.s
ghc -v -package JRegex -package template-haskell -fth -lpcre Regex.o UseTH.o DefineTH.o
Glasgow Haskell Compiler, Version 6.4.2, for Haskell 98, compiled by GHC version 6.4.2
Using package config file: /usr/local/lib/ghc-6.4.2/package.conf
Using package config file: /home/ben/.ghc/x86_64-linux-6.4.2/package.conf
Hsc static flags: -static
*** Linker
gcc -v -o a.out Regex.o UseTH.o DefineTH.o -lpcre -L/usr/local/lib/JRegex-1.0/ghc-6.4.2 -L/usr/local/lib/ghc-6.4.2 -lHSJRegex-1.0 -lHStemplate-haskell -lHShaskell98 -lHSbase -lHSbase_cbits -lHSrts -lm -lgmp -ldl -u GHCziBase_Izh_static_info -u GHCziBase_Czh_static_info -u GHCziFloat_Fzh_static_info -u GHCziFloat_Dzh_static_info -u GHCziPtr_Ptr_static_info -u GHCziWord_Wzh_static_info -u GHCziInt_I8zh_static_info -u GHCziInt_I16zh_static_info -u GHCziInt_I32zh_static_info -u GHCziInt_I64zh_static_info -u GHCziWord_W8zh_static_info -u GHCziWord_W16zh_static_info -u GHCziWord_W32zh_static_info -u GHCziWord_W64zh_static_info -u GHCziStable_StablePtr_static_info -u GHCziBase_Izh_con_info -u GHCziBase_Czh_con_info -u GHCziFloat_Fzh_con_info -u GHCziFloat_Dzh_con_info -u GHCziPtr_Ptr_con_info -u GHCziPtr_FunPtr_con_info -u GHCziStable_StablePtr_con_info -u GHCziBase_False_closure -u GHCziBase_True_closure -u GHCziPack_unpackCString_closure -u GHCziIOBase_stackOverflow_closure -u GHCziIOBase_heapOverflow_closure -u GHCziIOBase_NonTermination_closure -u GHCziIOBase_BlockedOnDeadMVar_closure -u GHCziIOBase_BlockedIndefinitely_closure -u GHCziIOBase_Deadlock_closure -u GHCziIOBase_NestedAtomically_closure -u GHCziWeak_runFinalizzerBatch_closure -u __stginit_Prelude
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.0.2 20051125 (Red Hat 4.0.2-8)
 /usr/libexec/gcc/x86_64-redhat-linux/4.0.2/collect2 --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out -u GHCziBase_Izh_static_info -u GHCziBase_Czh_static_info -u GHCziFloat_Fzh_static_info -u GHCziFloat_Dzh_static_info -u GHCziPtr_Ptr_static_info -u GHCziWord_Wzh_static_info -u GHCziInt_I8zh_static_info -u GHCziInt_I16zh_static_info -u GHCziInt_I32zh_static_info -u GHCziInt_I64zh_static_info -u GHCziWord_W8zh_static_info -u GHCziWord_W16zh_static_info -u GHCziWord_W32zh_static_info -u GHCziWord_W64zh_static_info -u GHCziStable_StablePtr_static_info -u GHCziBase_Izh_con_info -u GHCziBase_Czh_con_info -u GHCziFloat_Fzh_con_info -u GHCziFloat_Dzh_con_info -u GHCziPtr_Ptr_con_info -u GHCziPtr_FunPtr_con_info -u GHCziStable_StablePtr_con_info -u GHCziBase_False_closure -u GHCziBase_True_closure -u GHCziPack_unpackCString_closure -u GHCziIOBase_stackOverflow_closure -u GHCziIOBase_heapOverflow_closure -u GHCziIOBase_NonTermination_closure -u GHCziIOBase_BlockedOnDeadMVar_closure -u GHCziIOBase_BlockedIndefinitely_closure -u GHCziIOBase_Deadlock_closure -u GHCziIOBase_NestedAtomically_closure -u GHCziWeak_runFinalizzerBatch_closure -u __stginit_Prelude /usr/lib/gcc/x86_64-redhat-linux/4.0.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.0.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.0.2/crtbegin.o -L/usr/local/lib/JRegex-1.0/ghc-6.4.2 -L/usr/local/lib/ghc-6.4.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.0.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.0.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.0.2/../../../../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.0.2/../../.. -L/lib/../lib64 -L/usr/lib/../lib64 Regex.o UseTH.o DefineTH.o -lpcre -lHSJRegex-1.0 -lHStemplate-haskell -lHShaskell98 -lHSbase -lHSbase_cbits -lHSrts -lm -lgmp -ldl -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.0.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.0.2/../../../../lib64/crtn.o
*** Deleting temp files
Deleting:

Attachments (4)

Makefile (454 bytes) - added by guest 8 years ago.
Regex.hs (95 bytes) - added by guest 8 years ago.
DefineTH.hs (227 bytes) - added by guest 8 years ago.
UseTH.hs (71 bytes) - added by guest 8 years ago.

Download all attachments as: .zip

Change History (8)

Changed 8 years ago by guest

Changed 8 years ago by guest

Changed 8 years ago by guest

Changed 8 years ago by guest

comment:1 Changed 8 years ago by Lemmih

I've been unable to reproduce this error with 6.4.2.

comment:2 Changed 8 years ago by simonmar

  • Milestone changed from 6.4.2 to 6.6

update milestone (it was 6.4.2)

comment:3 Changed 8 years ago by simonpj

  • Description modified (diff)

comment:4 Changed 8 years ago by simonmar

  • Resolution set to invalid
  • Status changed from new to closed

This looks like a problem with the JRegex package rather than a GHC bug to me. JRegex apparently depends on the pcre library, so its package description should have pcre in extra-libraries. Passing -lpcre on the command line may hide the problem for batch compilation, but GHCi and template haskell expose the error.

In fact, the darcs repository of JRegex does indeed have the right dependency, so just update JRegex.

Note: See TracTickets for help on using tickets.