logo       

Re: Changes to make fptools insfrastructure usable for standalone librar: msg#00025

lang.haskell.glasgow.bugs

Subject: Re: Changes to make fptools insfrastructure usable for standalone libraries


> I think the right way to fix this is to introduce a toggle that selects
> between the current behaviour and a mode which builds packages
> specifically for use with an pre-existing GHC installation. Let's call
> this "standalone package mode".

I'm attaching my current version of package.mk. Rather than add a new
variable for when we're in standalone mode, I used this test to determine
whether we were in standalone mode or not:

ifneq "$(GHC_DRIVER_DIR)" ""

This works because GHC_DRIVER_DIR is one of the variables currently used in
package.mk - not having it set is what originally caused me to fall over.


Almost all the differences between the two modes are encapsulated in a bunch
of definitions at the top which define variables used in package.mk:

ifneq "$(GHC_DRIVER_DIR)" ""

PKG_INSTALL_DIR = $(GHC_DRIVER_DIR)
PKG_INCLUDE_DIR = $(GHC_INCLUDE_DIR)
STAMP_PKG_CONF = $(GHC_DRIVER_DIR)/stamp-pkg-conf-$(PACKAGE)
PKG_PROG = $(GHC_PKG_INPLACE)
PKG_GHC = $(GHC_INPLACE)

else

PKG_INSTALL_DIR = $(shell $(GHC) "--print-libdir")
PKG_INCLUDE_DIR = $(PKG_INSTALL_DIR)/include
STAMP_PKG_CONF = $(TOP)/stamp-pkg-conf-$(PACKAGE)
PKG_PROG = $(GHC_PKG)
PKG_GHC = $(GHC)

endif

I used the PKG_ for all new variables and am tempted to rename STAMP_PKG_CONF
to fit this convention (PKG_CONF_STAMP?)


Three changes I couldn't isolate in this bit of code are:

1) mk/target.mk needs this change.

Possible fix: move the definition of PKGCONF_DEP to package.mk.
I haven't done so because I'm not sure what PKGCONF_DEP is for
- I couldn't see anything that used it in the existing system.

*** target.mk 27 Apr 2003 10:30:13 -0000 1.173
--- target.mk 21 May 2003 10:55:15 -0000
***************
*** 78,89 ****
MKDEPENDHS_OBJ_SUFFICES=o

ifneq "$(STAMP_PKG_CONF)" ""
PKGCONF_DEP = $(STAMP_PKG_CONF)
else
PKGCONF_DEP =
endif

! depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) $(STAMP_PKG_CONF)
@$(RM) .depend
@touch .depend
ifneq "$(DOC_SRCS)" ""
--- 78,93 ----
MKDEPENDHS_OBJ_SUFFICES=o

ifneq "$(STAMP_PKG_CONF)" ""
+ ifneq "$(GHC_DRIVER_DIR)" ""
PKGCONF_DEP = $(STAMP_PKG_CONF)
else
PKGCONF_DEP =
endif
+ else
+ PKGCONF_DEP =
+ endif

! depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) $(PKGCONF_DEP)
@$(RM) .depend
@touch .depend
ifneq "$(DOC_SRCS)" ""

2) The code that invoked ghc-pkg < package.conf.{inplace,installed}.

In standalone mode, we install just package.conf.installed but
in inplace mode we install package.conf.inplace too.

I don't fully grok:

a) why you install two copies
b) why you install both at boot time instead of installing one
at install time
c) why they have the same stamp file

So I'm struggling for what changes might be reasonable here.
What I have works but feels inelegant.

> You *could* put libraries in the GHC install dir, but it might be
> cleaner to put them in their own directories: /usr/lib/<yourlibrary>.
> This *should* happen automatically if you set up the mk stuff as
> described above.

At the moment, I'm continuing to put them in the ghc install directory
by putting this at the head of every Makefile (yeuch)

libdir = $(shell $(GHC) "--print-libdir")

This has the strength of including the ghc version number in the directory
name - though I guess I could use:

/usr/lib/yourlibrary/`ghc --version`

(well, almost - need to cleanup the string ghc --version returns).

[Hmmm, maybe I should leave this up to the person running configure?
To make this work, I just have to take care that I install in a subdirectory
of libdir not in libdir itself since pissing all over /usr/lib probably won't
win many friends.]


My example library Makefile now contains this header. The FPTOOLS_TOP part is
the most interesting (and, yes, it _does_ have to come after boilerplate to
avoid being overridden).

TOP = .
include $(TOP)/mk/boilerplate.mk
FPTOOLS_TOP := ../..

libdir = $(shell $(GHC) "--print-libdir")

My Makefile also takes care to define:

HIERARCHICAL_LIB = YES

(can we make hierarchical the default instead?)


--
Alastair Reid

Attachment: package.mk
Description: Text document

<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise