[project @ 1998-11-26 09:17:22 by sof]
[ghc-hetmet.git] / ghc / runtime / Makefile
1 #-----------------------------------------------------------------------------
2 # $Id: Makefile,v 1.12 1998/08/15 14:06:48 sof Exp $
3
4 #  This is the Makefile for the runtime-system stuff.
5 #  This stuff is written in C (and cannot be written in Haskell).
6 #
7 #  Things are organised into exactly one level of subdirs.
8 #
9 #  At the moment, there are a few such subdirs:
10 #       c-as-asm        -- mini-interpreter & register hackery
11 #       gum             -- GUM-specific stuff
12 #       main            -- "main", associated startup stuff, & MISC things
13 #       prims           -- code for primitives that must be written in C
14 #       profiling       -- cost-centre profiling
15 #       storage         -- the storage manager(s)
16 #
17 #  We create two libraries.  One, libHSrts<tag>.a, is built separately
18 #  for each "way".  The other, libHSclib.a is built once: it is just
19 #  .lc files that end up the same no matter what, i.e. completely
20 #  ordinary C.
21
22 #  Other sorta independent, compile-once subdirs are:
23
24 #       gmp             -- GNU multi-precision library (for Integer)
25
26 #-----------------------------------------------------------------------------
27
28 TOP=..
29 DoingRTS=YES
30 include $(TOP)/mk/boilerplate.mk
31
32 WAYS=$(GhcLibWays)
33
34 #
35 # A general rule for the grand mk setup is that in a build tree, only
36 # directories that don't have any subdirs containing Makefiles are built
37 # all the different `ways' when doing `make all'. 
38 #
39 # The directory structure for the RTS is a bit at odds to the general
40 # scheme of things, with the GNU gmp library in gmp/ and a way-independent
41 # archive libHSclib.a beside all the way-archives for the RTS proper.
42 #
43 # So to avoid having to redo building the way-proof pieces each time
44 # the Makefile is invoked with a different setting of $(way), SUBDIRS
45 # is only set if $(way) isn't set. 
46 #
47
48 SUBDIRS = gmp
49
50 #-----------------------------------------------------------------------------
51 # knock the "clib" (completely ordinary C, compiled once)
52 # stuff over the head first...
53 #
54 # Write out the rule for libHSclib explicitly, as it is special
55 #  (not to be built n different ways)
56 #
57 SRCS_CLIB_LC  = $(wildcard hooks/*.lc) main/Mallocs.lc
58 LIBOBJS_clib  = $(SRCS_CLIB_LC:.lc=.o)
59
60 all :: libHSclib.a
61
62 libHSclib.a :: $(LIBOBJS_clib)
63         @$(RM) $@
64         $(AR) $(AR_OPTS) $@ $(LIBOBJS_clib)
65         $(RANLIB) $@
66
67 #
68 # Stuff to clean out, only on way `normal'
69 #
70 ifeq "$(way)" ""
71 MOSTLY_CLEAN_FILES += libHSclib.a $(LIBOBJS_clib)
72 CLEAN_FILES        += $(SRCS_CLIB_LC:.lc=.c)
73 endif
74
75 #
76 # Add libHSclib to the install library variable *only*
77 # if we're doing `make install' the `normal' way - don't want
78 # to install the same library for each different way.
79 #
80 ifeq "$(way)" ""
81 INSTALL_LIBS += libHSclib.a
82 endif
83
84 #------------------------------------------------------------------
85 #
86 # Run-time system parts that are `way' sensitive, you have to build
87 # a copy of libHSrts for each different ways.
88 #
89
90 SRCS_RTS_LH = $(wildcard storage/*.lh)
91
92 SRCS_RTS_LC = $(wildcard c-as-asm/*.lc) \
93         gum/GlobAddr.lc                 \
94         gum/HLComms.lc                  \
95         gum/Hash.lc                     \
96         gum/LLComms.lc                  \
97         gum/Pack.lc                     \
98         gum/ParInit.lc                  \
99         gum/RBH.lc                      \
100         gum/Sparks.lc                   \
101         gum/Unpack.lc                   \
102         main/GranSim.lc                 \
103         main/Itimer.lc                  \
104         main/Ticky.lc                   \
105         main/SMRep.lc                   \
106         main/Select.lc                  \
107         main/Signals.lc                 \
108         main/StgOverflow.lc             \
109         main/Threads.lc                 \
110         main/RtsFlags.lc                \
111         main/main.lc                    \
112         prims/PrimArith.lc              \
113         prims/LongLong.lc               \
114         prims/PrimMisc.lc               \
115         profiling/CostCentre.lc         \
116         profiling/Hashing.lc            \
117         profiling/HeapProfile.lc        \
118         profiling/Indexing.lc           \
119         profiling/Timer.lc              \
120         storage/SM1s.lc                 \
121         storage/SM2s.lc                 \
122         storage/SMap.lc                 \
123         storage/SMcheck.lc              \
124         storage/SMcompacting.lc         \
125         storage/SMcopying.lc            \
126         storage/SMdu.lc                 \
127         storage/SMevac.lc               \
128         storage/SMextn.lc               \
129         storage/SMinit.lc               \
130         storage/SMmarking.lc            \
131         storage/SMscan.lc               \
132         storage/SMscav.lc               \
133         storage/SMstacks.lc             \
134         storage/SMstatic.lc             \
135         storage/SMstats.lc              \
136         storage/mprotect.lc
137
138 #
139 # LATER: Include Patrick's generational collector
140 # that's almost-but-not-quite there: storage/SMgen.lc
141 #
142
143 SRCS_RTS_LHC = $(wildcard main/*.lhc c-as-asm/*.lhc storage/*.lhc gum/*.lhc)
144
145 HEADER_FILES = $(SRCS_RTS_LH:.lh=.h)
146
147 C_SRCS = $(SRCS_RTS_LC:.lc=.c) $(SRCS_RTS_LHC:.lhc=.hc) $(SRCS_CLIB_LC:.lc=.c) $(HEADER_FILES)
148
149 # To avoid having to redo these each time.
150 .PRECIOUS : %.$(way_)hc
151
152 #
153 # Clean out header files when doing way `normal'
154 #
155 ifeq "$(way)" ""
156 CLEAN_FILES += $(H_FILES) $(C_SRCS)
157 endif
158
159 #-----------------------------------------------------------------------------
160 # creating and installing libHSrts.a (in its many flavors)
161 #
162 LIBRARY = libHSrts$(_way).a
163 LIBOBJS = $(patsubst %.lc,%.$(way_)o,$(SRCS_RTS_LC)) \
164           $(patsubst %.lhc,%.$(way_)o,$(SRCS_RTS_LHC))
165
166 SRC_HC_OPTS += -I$(GHC_INCLUDE_DIR) $(GCap) $(GC2s) $(GC1s) -O -optc-DIN_GHC_RTS=1 -I$(GHC_RUNTIME_DIR)/storage 
167
168 #
169 # Note: _have_ to drop the -optc prefix for the GC-type opts (e.g. -optc-DGCap), since
170 # -o<foo> is interpreted by mkdependC as meaning use <foo> as suffix.
171 #
172 # Hack: Include -D for all the different collectors to be sure we gather all the deps.
173 #
174 SRC_MKDEPENDC_OPTS += -I$(GHC_INCLUDE_DIR) -DGCap -DGC1s -DGC2s
175
176 #-----------------------------------------------------------------------------
177 # file-specific options 
178 c-as-asm/PerformIO_HC_OPTS = -optc-DIN_GHC_RTS=1
179 gum/FetchMe_HC_OPTS        = -optc-DIN_GHC_RTS=1
180 main/StgStartup_HC_OPTS    = -optc-DIN_GHC_RTS=1
181 main/StgThreads_HC_OPTS    = -optc-DIN_GHC_RTS=1
182 main/StgUpdate_HC_OPTS     = -optc-DIN_GHC_RTS=1
183 storage/SMmark_HC_OPTS     = -optc-DIN_GHC_RTS=1 -optc-DMARK_REG_MAP
184
185 #-----------------------------------------------------------------------------
186 #
187 # Compiling the individual files
188 #
189 # Rules for building various types of objects from C files,
190 # override the default suffix rule here, as we want to use
191 # ../driver/ghc (a better C compiler :-) to compile the
192 # different RTS pieces
193 #
194 CC=$(HC) $(HC_OPTS) $($*_HC_OPTS)
195
196 #-----------------------------------------------------------------------------
197 # the TopClosure
198 #
199 # Hook it into the list of files to generate dependencies for
200 #
201 C_SRCS += main/TopClosure.c
202
203 #
204 # The TopClosure is not part of libHSrts, so we add an extra all::
205 # target to make sure it is built (TopClosure is way-proof):
206 #
207 ifeq "$(way)" ""
208 all :: main/TopClosure.o
209
210 CLEAN_FILES  += main/TopClosure.o
211 #
212 # The driver expects to find it in lib/
213 #
214 INSTALL_LIBS += main/TopClosure.o
215 endif
216
217 #-----------------------------------------------------------------------------
218 #
219 # Files to install
220 #
221 # Just libHSrts is installed uniformly across ways
222 #
223 INSTALL_LIBS += $(LIBRARY)
224
225
226 #-----------------------------------------------------------------------------
227 #
228 # Building the GUM SysMan
229 #
230
231 ifeq "$(way)" "mp"
232 all :: gum/SysMan
233
234 ifdef solaris2_TARGET_OS
235 __socket_libs = -lsocket -lnsl
236 else
237 __socket_libs =
238 endif
239
240 gum/SysMan : gum/SysMan.mp_o gum/LLComms.mp_o main/Mallocs.o hooks/OutOfVM.o
241         $(RM) $@
242         gcc -o $@ gum/SysMan.mp_o gum/LLComms.mp_o main/Mallocs.o hooks/OutOfVM.o -L$$PVM_ROOT/lib/$$PVM_ARCH -lpvm3 -lgpvm3 $(__socket_libs)
243
244 CLEAN_FILES  += gum/SysMan.mp_o gum/SysMan
245 INSTALL_LIBEXECS += gum/SysMan
246 endif
247
248 include $(TOP)/mk/target.mk