HGL with GHC in Win32

Alastair Reid reid@cs.utah.edu
23 Jun 2002 03:05:50 +0100


>   Shouldn't all those IORefs (e.g., for the list of windows) be
> MVars in the GHC version?

We did that for the X11 version - I guess the Win32 version has fallen
behind.  What really needs done though is to introduce a single
semaphore to control all access to all parts of the HGL data
structures - atomically accessing each part of the data structures
doesn't necessarily protect all the system invariants.

>   For a start, what about NoInline pragmas for global IORefs?

Yes, that should be done.  (Hmmm, maybe we should push harder on a
portable language extension for defining global, mutable, monomorphic
IORefs.)

> Unless there are any other suggestions, I could give the green card
> --safe-code a try.  But why doesn't the green card input use
> %safecode to eliminate that potential error source?-) 

Because I wrote the Win32 bindings for Hugs where %safecode and %code
mean the same thing.  Really, GreenCard should be changed so that %code 
is safe by default and you have to write %unsafecode to get the faster
version.  (That's the way it is in the ffi.)

> And how would cross-ffi garbage-collection issues affect window
> parameters at startup?

Not sure what you mean - I can't think of any new issues in GC which
aren't present in Hugs.

> Anyway, is there a useable win32 green card input package hanging
> around somewhere (the link to glasgow is dead it seems; CVS has
> moved the gc-sources aside and has never been very modular - is
> there a way for me to take the win32/gc-src/ directory from CVS and
> make it, without having to prepare the various other parts of
> fptools that fptools-Makefiles tend to depend on so merrily?-(.

I'm attaching a crudely hacked up version of hugs.mk which generates
the necessary .hs files.

To invoke it:

  cd hslibs/win32
  rm *.hs *stub*
  make -f hugs.mk GC="green-card --target=ghc" GCDIR=../../green-card GC_INCLUDES="--include-dir ../../green-card/lib/ghc" gen_hss -k

It will fail when building Win32Dialogue.hs hence the use of -k.  I
looked at this just long enough to persuade myself that there was no
easy fix (apart from deleting gc-src/Win32Dialogue.gc) but that the
error was harmless (Win32.hs doesn't import Win32Dialogue).

I could have changed the file further to set the target and greencard
directories more quietly - but maybe you want to change the target
(ffi?) or use a different greencard so it seemed easier to specify
them on the command line.

I have not tried compiling the generated files - my windows machine
isn't used to being used for development and needs a bit of
sweet-talking before it's willing to contemplate the idea.

You'll need a different Makefile to compile the generated files - the
compilation stuff that's there at the moment is for use with
Hugs/GreenCard not GHC/FFI or GHC/GreenCard.


-- 
Alastair Reid   
alastair@reid-consulting-uk.ltd.uk  
http://www.reid-consulting-uk.ltd.uk/alastair/







################################################################
# Makefile for Win32 library
#
# This Makefile only works with GNUMake.  If you feel like supplying
# us with a more portable Makefile, we'll be happy to distribute it
# as well.
################################################################

# This goes first to make it the default
default		: all

# All generated C files #include errors.h to get consistent error messages
$(DLLS)		: errors.h

GUILIBS		= kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib comctl32.lib winmm.lib advapi32.lib


# Describe how your system is configured here

ROOT		= $(HOME)
HUGSDIR 	= $(ROOT)/hugs
GCDIR		= $(ROOT)/fptools/green-card
RUNHUGS		= $(ROOT)/hugs/runhugs
CPP		= gcc -P -E -x c -traditional

# GC	    	= $(ROOT)/green-card.exe --target Hugs
GC	    	= $(RUNHUGS) -F"$(CPP)" -h1m $(GCDIR)/src/GreenCard.lhs --target Hugs
GC_INCLUDES 	= --include-dir $(GCDIR)/lib/hugs
GCPP_FLAGS	= -DTARGET_HUGS

# Where to find GreenCard.h - in the Hugs source code
INCLUDES	= -i $(HUGSDIR)/src

################################################################
# Explicit dependencies
################################################################

Win32Window.dll: WndProc.c

################################################################
# Standard rules from here on
################################################################

RAW_GCS		= $(wildcard gc-src/*.gc)
GCS		= $(notdir $(RAW_GCS))
DLLS 		= $(addsuffix .dll, $(basename $(GCS)))
GEN_HSS  	= $(addsuffix .hs,  $(basename $(GCS)))
GEN_CFILES 	= $(addsuffix .c,   $(basename $(GCS)))

gen_hss:	$(GCS) $(GEN_HSS)

all:		gen_hss $(DLLS) 

.SUFFIXES	:
.SUFFIXES	: .pgc .gc .hs .dll .c

%.gc		: gc-src/%.gc
		$(CPP) $(GCPP_FLAGS) $< | perl -pe 's#\\n#\n#g' >$*.gc
%.hs %.c	: %.gc
		$(CPP) $(GCPP_FLAGS) $< | perl -pe 's#\\n#\n#g' >$*.gc
		$(GC) $(GC_INCLUDES) -i . $*.gc
%.dll		: %.c
		cl /nologo /LD /MD $(INCLUDES) $(GUILIBS) $(GCPP_FLAGS) -DSTRICT -o $@ $*.c
%.obj		: %.c
		cl /nologo $(INCLUDES) $(GCPP_FLAGS) -DSTRICT -o $@ $*.c

# Cleanliness is next to dependencies

clean		:
		rm -f *.obj *.exp *.lib 
		rm -f *.hi
		rm -f $(GEN_CFILES) $(GEN_HSS) $(DLLS)

# Dependencies

$(GCS)		: $(PGCS)
depends.mk	::
		perl mkGCDep *.gc >depends.mk

include depends.mk

################################################################
# End of Makefile
################################################################