/* This is the Jmakefile for the runtime-system stuff. This stuff is written in C (and cannot be written in Haskell). Things are organised into exactly one level of subdirs. At the moment, there are a few such subdirs: c-as-asm -- mini-interpreter & register hackery gum -- GUM-specific stuff main -- "main", associated startup stuff, & MISC things prims -- code for primitives that must be written in C profiling -- cost-centre profiling storage -- the storage manager(s) We create two libraries. One, libHSrts.a, is built separately for each "build". The other, libHSclib.a is built once: it is just .lc files that end up the same no matter what, i.e. completely ordinary C. Other sorta independent, compile-once subdirs are: gmp -- GNU multi-precision library (for Integer) */ #define IHaveSubdirs SUBDIRS = gmp /**************************************************************** * * * Jmakefile preamble-y things * * * ****************************************************************/ GhcDriverNeededHere(depend all) /* we use its C-compiling know-how */ EtagsNeededHere(tags) UnlitNeededHere(depend) /**************************************************************** * * * options used for compiling/etc. things * * * ****************************************************************/ /* If you use EXTRA_HC_OPTS on the command line (which you shouldn't, strictly speaking), it will probably work -- it is pinned onto GHC_OPTS, just for fun. */ GHC_OPTS = $(EXTRA_HC_OPTS) /* per-build options: shared with libraries */ #define rts_or_lib(r,l) r #include "../mkworld/GHC_OPTS" MKDEPENDC_OPTS= \ -I$(TOP_PWD)/$(CURRENT_DIR)/$(GHC_INCLUDES) /**************************************************************** * * * what it is we are compiling; * * these are long and tedious lists, but c'est la guerre * * * ****************************************************************/ RTS_LH = \ storage/SMmarkDefs.lh \ storage/SMcopying.lh \ storage/SMcompacting.lh \ storage/SMextn.lh \ storage/SMinternal.lh RTS_LC = \ c-as-asm/CallWrap_C.lc \ c-as-asm/FreeMallocPtr.lc \ c-as-asm/HpOverflow.lc \ c-as-asm/StablePtr.lc \ c-as-asm/StablePtrOps.lc \ c-as-asm/StgDebug.lc \ c-as-asm/StgMiniInt.lc \ gum/GlobAddr.lc \ gum/HLComms.lc \ gum/Hash.lc \ gum/LLComms.lc \ gum/Pack.lc \ gum/ParInit.lc \ gum/RBH.lc \ gum/Sparks.lc \ gum/Unpack.lc \ main/GranSim.lc \ main/Itimer.lc \ main/Ticky.lc \ main/SMRep.lc \ main/Select.lc \ main/Signals.lc \ main/StgOverflow.lc \ main/Threads.lc \ main/RtsFlags.lc \ main/main.lc \ prims/PrimArith.lc \ prims/PrimMisc.lc \ profiling/CostCentre.lc \ profiling/Hashing.lc \ profiling/HeapProfile.lc \ profiling/Indexing.lc \ profiling/Timer.lc \ storage/SM1s.lc \ storage/SM2s.lc \ storage/SMap.lc \ storage/SMcheck.lc \ storage/SMcompacting.lc \ storage/SMcopying.lc \ storage/SMdu.lc \ storage/SMevac.lc \ storage/SMextn.lc \ storage/SMinit.lc /*could clib except for GCdu option! */ \ storage/SMmarking.lc \ storage/SMscan.lc \ storage/SMscav.lc \ storage/SMstacks.lc \ storage/SMstatic.lc \ storage/SMstats.lc /*could clib except GCap affects printing*/ \ storage/mprotect.lc /*LATER?: storage/SMgen.lc */ RTS_LHC = \ main/StgStartup.lhc \ main/StgUpdate.lhc \ main/StgThreads.lhc \ c-as-asm/PerformIO.lhc \ storage/SMmark.lhc \ gum/FetchMe.lhc CLIB_LC = \ hooks/ErrorHdr.lc \ hooks/OutOfHeap.lc \ hooks/OutOfStk.lc \ hooks/OutOfVM.lc \ hooks/NoRunnableThrds.lc \ hooks/PatErrorHdr.lc \ hooks/TraceHooks.lc \ hooks/SizeHooks.lc \ hooks/InitEachPE.lc \ main/Mallocs.lc H_FILES = $(RTS_LH:.lh=.h) C_FILES = $(RTS_LC:.lc=.c) $(RTS_LHC:.lhc=.hc) $(CLIB_LC:.lc=.c) /* Header files */ all depend :: $(H_FILES) ExtraStuffToClean ( $(C_FILES) ) /* Literate-pgmming suffix rules used herein */ UnlitSuffixRule(.lhc,.hc) UnlitSuffixRule(.lc,.c) UnlitSuffixRule(.lh,.h) /**************************************************************** * * * interesting collections of .o files * * * ****************************************************************/ RTS_OBJS_norm = $(RTS_LC:.lc=.o) $(RTS_LHC:.lhc=.o) RTS_OBJS_p = $(RTS_LC:.lc=.p_o) $(RTS_LHC:.lhc=.p_o) RTS_OBJS_t = $(RTS_LC:.lc=.t_o) $(RTS_LHC:.lhc=.t_o) RTS_OBJS_u = $(RTS_LC:.lc=.u_o) $(RTS_LHC:.lhc=.u_o) RTS_OBJS_mc = $(RTS_LC:.lc=.mc_o) $(RTS_LHC:.lhc=.mc_o) RTS_OBJS_mr = $(RTS_LC:.lc=.mr_o) $(RTS_LHC:.lhc=.mr_o) RTS_OBJS_mt = $(RTS_LC:.lc=.mt_o) $(RTS_LHC:.lhc=.mt_o) RTS_OBJS_mp = $(RTS_LC:.lc=.mp_o) $(RTS_LHC:.lhc=.mp_o) RTS_OBJS_mg = $(RTS_LC:.lc=.mg_o) $(RTS_LHC:.lhc=.mg_o) RTS_OBJS_2s = $(RTS_LC:.lc=.2s_o) $(RTS_LHC:.lhc=.2s_o) RTS_OBJS_1s = $(RTS_LC:.lc=.1s_o) $(RTS_LHC:.lhc=.1s_o) RTS_OBJS_du = $(RTS_LC:.lc=.du_o) $(RTS_LHC:.lhc=.du_o) RTS_OBJS_a = $(RTS_LC:.lc=.a_o) $(RTS_LHC:.lhc=.a_o) RTS_OBJS_b = $(RTS_LC:.lc=.b_o) $(RTS_LHC:.lhc=.b_o) RTS_OBJS_c = $(RTS_LC:.lc=.c_o) $(RTS_LHC:.lhc=.c_o) RTS_OBJS_d = $(RTS_LC:.lc=.d_o) $(RTS_LHC:.lhc=.d_o) RTS_OBJS_e = $(RTS_LC:.lc=.e_o) $(RTS_LHC:.lhc=.e_o) RTS_OBJS_f = $(RTS_LC:.lc=.f_o) $(RTS_LHC:.lhc=.f_o) RTS_OBJS_g = $(RTS_LC:.lc=.g_o) $(RTS_LHC:.lhc=.g_o) RTS_OBJS_h = $(RTS_LC:.lc=.h_o) $(RTS_LHC:.lhc=.h_o) RTS_OBJS_i = $(RTS_LC:.lc=.i_o) $(RTS_LHC:.lhc=.i_o) RTS_OBJS_j = $(RTS_LC:.lc=.j_o) $(RTS_LHC:.lhc=.j_o) RTS_OBJS_k = $(RTS_LC:.lc=.k_o) $(RTS_LHC:.lhc=.k_o) RTS_OBJS_l = $(RTS_LC:.lc=.l_o) $(RTS_LHC:.lhc=.l_o) RTS_OBJS_m = $(RTS_LC:.lc=.m_o) $(RTS_LHC:.lhc=.m_o) RTS_OBJS_n = $(RTS_LC:.lc=.n_o) $(RTS_LHC:.lhc=.n_o) RTS_OBJS_o = $(RTS_LC:.lc=.o_o) $(RTS_LHC:.lhc=.o_o) RTS_OBJS_A = $(RTS_LC:.lc=.A_o) $(RTS_LHC:.lhc=.A_o) RTS_OBJS_B = $(RTS_LC:.lc=.B_o) $(RTS_LHC:.lhc=.B_o) CLIB_OBJS = $(CLIB_LC:.lc=.o) /**************************************************************** * * * knock the "clib" (completely ordinary C, compiled once) * * stuff over the head first... * * * ****************************************************************/ #define CompileClibishly(file,flags) @@\ CAT2(file,.o) : CAT2(file,.c) @@\ $(RM) $@ @@\ $(GHC) -c -o CAT2(file,.o) $(GHCFLAGS) flags CAT2(file,.c) NormalLibraryTarget(HSclib,$(CLIB_OBJS)) ExtraStuffToClean($(CLIB_OBJS)) #if DoInstallGHCSystem == YES InstallLibraryTarget(HSclib,$(INSTLIBDIR_GHC)) #endif /* all .lc files, so far */ CompileClibishly(hooks/ErrorHdr,) CompileClibishly(hooks/OutOfHeap,) CompileClibishly(hooks/OutOfStk,) CompileClibishly(hooks/OutOfVM,) CompileClibishly(hooks/NoRunnableThrds,) CompileClibishly(hooks/PatErrorHdr,) CompileClibishly(hooks/TraceHooks,) CompileClibishly(hooks/SizeHooks,) CompileClibishly(hooks/InitEachPE,) CompileClibishly(main/Mallocs,) CompileClibishly(main/TopClosure,) ExtraStuffToClean(main/TopClosure.o) all :: main/TopClosure.o install :: main/TopClosure.o $(INSTALL) -c $(INSTLIBFLAGS) main/TopClosure.o $(INSTLIBDIR_GHC)/TopClosure.o #if Build_mp == YES # if solaris2_TARGET_OS # define __socket_libs -lsocket -lnsl # else # define __socket_libs /*none*/ # endif AllTarget(gum/SysMan) gum/SysMan : gum/SysMan_mp.o gum/LLComms_mp.o main/Mallocs.o hooks/OutOfVM.o $(RM) $@ $(CC) -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 ExtraStuffToClean(gum/SysMan_mp.o gum/SysMan) # if DoInstallGHCSystem == YES install :: gum/SysMan $(INSTALL) -c $(INSTBINFLAGS) gum/SysMan $(INSTLIBDIR_GHC)/SysMan # endif #endif /**************************************************************** * * * special local make-world macros * * * ****************************************************************/ /* to build and install the per-build rts stuff */ #ifndef SpecialGhcRtsLibTarget #define SpecialGhcRtsLibTarget(tag,objs) @@\ AllTarget(CAT3(libHSrts,tag,.a)) @@\ ExtraStuffToClean(objs CAT3(libHSrts,tag,.a)) @@\ CAT3(libHSrts,tag,.a):: $(H_FILES) objs @@\ $(RM) $@ @@\ $(AR) $@ objs @@\ $(RANLIB) $@ #endif /* SpecialGhcRtsLibTarget */ #ifndef SpecialGhcRtsLibInstallTarget #if DoInstallGHCSystem == YES #define SpecialGhcRtsLibInstallTarget(tag) @@\ install :: CAT3(libHSrts,tag,.a) @@\ $(INSTALL) $(INSTLIBFLAGS) \ @@\ CAT3(libHSrts,tag,.a) \ @@\ $(INSTLIBDIR_GHC)/CAT3(libHSrts,tag,.a) @@\ $(RANLIB) $(INSTLIBDIR_GHC)/CAT3(libHSrts,tag,.a) #else /* ! DoInstallGHC... */ #define SpecialGhcRtsLibInstallTarget(tag) /*nothing*/ #endif /* ! DoInstallGHC... */ #endif /* SpecialGhcRtsLibInstallTarget */ #define BigBuildTarget(tag,objs) \ SpecialGhcRtsLibTarget(tag,objs) @@\ SpecialGhcRtsLibInstallTarget(tag) /**************************************************************** * * * creating and installing libHSrts.a (in its many flavors) * * * ****************************************************************/ #if DoInstallGHCSystem == YES MakeDirectories(install, $(INSTLIBDIR_GHC)) #endif /* DoInstallGHCSystem */ IfBuild_normal(BigBuildTarget(,$(RTS_OBJS_norm))) IfBuild_p(BigBuildTarget(_p, $(RTS_OBJS_p))) IfBuild_t(BigBuildTarget(_t, $(RTS_OBJS_t))) IfBuild_u(BigBuildTarget(_u, $(RTS_OBJS_u))) IfBuild_mc(BigBuildTarget(_mc, $(RTS_OBJS_mc))) IfBuild_mr(BigBuildTarget(_mr, $(RTS_OBJS_mr))) IfBuild_mt(BigBuildTarget(_mt, $(RTS_OBJS_mt))) IfBuild_mp(BigBuildTarget(_mp, $(RTS_OBJS_mp))) IfBuild_mg(BigBuildTarget(_mg, $(RTS_OBJS_mg))) IfBuild_2s(BigBuildTarget(_2s, $(RTS_OBJS_2s))) IfBuild_1s(BigBuildTarget(_1s, $(RTS_OBJS_1s))) IfBuild_du(BigBuildTarget(_du, $(RTS_OBJS_du))) IfBuild_a(BigBuildTarget(_a, $(RTS_OBJS_a))) IfBuild_b(BigBuildTarget(_b, $(RTS_OBJS_b))) IfBuild_c(BigBuildTarget(_c, $(RTS_OBJS_c))) IfBuild_d(BigBuildTarget(_d, $(RTS_OBJS_d))) IfBuild_e(BigBuildTarget(_e, $(RTS_OBJS_e))) IfBuild_f(BigBuildTarget(_f, $(RTS_OBJS_f))) IfBuild_g(BigBuildTarget(_g, $(RTS_OBJS_g))) IfBuild_h(BigBuildTarget(_h, $(RTS_OBJS_h))) IfBuild_i(BigBuildTarget(_i, $(RTS_OBJS_i))) IfBuild_j(BigBuildTarget(_j, $(RTS_OBJS_j))) IfBuild_k(BigBuildTarget(_k, $(RTS_OBJS_k))) IfBuild_l(BigBuildTarget(_l, $(RTS_OBJS_l))) IfBuild_m(BigBuildTarget(_m, $(RTS_OBJS_m))) IfBuild_n(BigBuildTarget(_n, $(RTS_OBJS_n))) IfBuild_o(BigBuildTarget(_o, $(RTS_OBJS_o))) IfBuild_A(BigBuildTarget(_A, $(RTS_OBJS_A))) IfBuild_B(BigBuildTarget(_B, $(RTS_OBJS_B))) /**************************************************************** * * * compile the individual RTS files * * * ****************************************************************/ #define DoRtsFile(file,isuf,way,flags) @@\ CAT3(file.,way,o) : CAT2(file,isuf) @@\ $(RM) $@ @@\ $(GHC) -c -o CAT3(file.,way,o) $(GHCFLAGS) flags $(CAT4(GHC,_,way,OPTS)) CAT2(file,isuf) #define CompileRTSishly(file,isuf,flags) @@\ IfBuild_normal(DoRtsFile(file,isuf,,flags)) \ IfBuild_p(DoRtsFile(file,isuf,p_, flags)) \ IfBuild_t(DoRtsFile(file,isuf,t_, flags)) \ IfBuild_u(DoRtsFile(file,isuf,u_, flags)) \ IfBuild_mc(DoRtsFile(file,isuf,mc_, flags)) \ IfBuild_mr(DoRtsFile(file,isuf,mr_, flags)) \ IfBuild_mt(DoRtsFile(file,isuf,mt_, flags)) \ IfBuild_mp(DoRtsFile(file,isuf,mp_, flags)) \ IfBuild_mg(DoRtsFile(file,isuf,mg_, flags)) \ IfBuild_2s(DoRtsFile(file,isuf,2s_, flags)) \ IfBuild_1s(DoRtsFile(file,isuf,1s_, flags)) \ IfBuild_du(DoRtsFile(file,isuf,du_, flags)) \ IfBuild_a(DoRtsFile(file,isuf,a_, flags)) \ IfBuild_b(DoRtsFile(file,isuf,b_, flags)) \ IfBuild_c(DoRtsFile(file,isuf,c_, flags)) \ IfBuild_d(DoRtsFile(file,isuf,d_, flags)) \ IfBuild_e(DoRtsFile(file,isuf,e_, flags)) \ IfBuild_f(DoRtsFile(file,isuf,f_, flags)) \ IfBuild_g(DoRtsFile(file,isuf,g_, flags)) \ IfBuild_h(DoRtsFile(file,isuf,h_, flags)) \ IfBuild_i(DoRtsFile(file,isuf,i_, flags)) \ IfBuild_j(DoRtsFile(file,isuf,j_, flags)) \ IfBuild_k(DoRtsFile(file,isuf,k_, flags)) \ IfBuild_l(DoRtsFile(file,isuf,l_, flags)) \ IfBuild_m(DoRtsFile(file,isuf,m_, flags)) \ IfBuild_n(DoRtsFile(file,isuf,n_, flags)) \ IfBuild_o(DoRtsFile(file,isuf,o_, flags)) \ IfBuild_A(DoRtsFile(file,isuf,A_, flags)) \ IfBuild_B(DoRtsFile(file,isuf,B_, flags)) /* here we go: */ CompileRTSishly(c-as-asm/CallWrap_C,.c,) CompileRTSishly(c-as-asm/FreeMallocPtr,.c,) CompileRTSishly(c-as-asm/HpOverflow,.c,) CompileRTSishly(c-as-asm/PerformIO,.hc,-optc-DIN_GHC_RTS=1) CompileRTSishly(c-as-asm/StablePtr,.c,) CompileRTSishly(c-as-asm/StablePtrOps,.c,) CompileRTSishly(c-as-asm/StgDebug,.c,) CompileRTSishly(c-as-asm/StgMiniInt,.c,) CompileRTSishly(gum/FetchMe,.hc,-optc-DIN_GHC_RTS=1) CompileRTSishly(gum/GlobAddr,.c,) CompileRTSishly(gum/HLComms,.c,) CompileRTSishly(gum/Hash,.c,) CompileRTSishly(gum/LLComms,.c,) CompileRTSishly(gum/Pack,.c,) CompileRTSishly(gum/ParInit,.c,) CompileRTSishly(gum/RBH,.c,) CompileRTSishly(gum/Sparks,.c,) CompileRTSishly(gum/SysMan,.c,) /* NB: not in library */ CompileRTSishly(gum/Unpack,.c,) CompileRTSishly(main/GranSim,.c,) CompileRTSishly(main/Itimer,.c,) CompileRTSishly(main/Ticky,.c,) CompileRTSishly(main/SMRep,.c,) CompileRTSishly(main/Select,.c,) CompileRTSishly(main/Signals,.c,) CompileRTSishly(main/StgOverflow,.c,) CompileRTSishly(main/StgStartup,.hc,-optc-DIN_GHC_RTS=1) CompileRTSishly(main/StgThreads,.hc,-optc-DIN_GHC_RTS=1) CompileRTSishly(main/StgUpdate,.hc,-optc-DIN_GHC_RTS=1) CompileRTSishly(main/Threads,.c,) CompileRTSishly(main/RtsFlags,.c,) CompileRTSishly(main/main,.c,) CompileRTSishly(profiling/CostCentre,.c,) CompileRTSishly(profiling/Hashing,.c,) CompileRTSishly(profiling/HeapProfile,.c,) CompileRTSishly(profiling/Indexing,.c,) CompileRTSishly(profiling/Timer,.c,) CompileRTSishly(prims/PrimArith,.c,) CompileRTSishly(prims/PrimMisc,.c,) CompileRTSishly(storage/SM1s,.c,) CompileRTSishly(storage/SM2s,.c,) CompileRTSishly(storage/SMap,.c,) CompileRTSishly(storage/SMcheck,.c,) CompileRTSishly(storage/SMcompacting,.c,) CompileRTSishly(storage/SMcopying,.c,) CompileRTSishly(storage/SMdu,.c,) CompileRTSishly(storage/SMevac,.c,) CompileRTSishly(storage/SMextn,.c,) CompileRTSishly(storage/SMgen,.c,) CompileRTSishly(storage/SMinit,.c,) CompileRTSishly(storage/SMmark,.hc,-optc-DIN_GHC_RTS=1 -optc-DMARK_REG_MAP) CompileRTSishly(storage/SMmarking,.c,) CompileRTSishly(storage/SMscan,.c,) CompileRTSishly(storage/SMscav,.c,) CompileRTSishly(storage/SMstacks,.c,) CompileRTSishly(storage/SMstatic,.c,) CompileRTSishly(storage/SMstats,.c,) CompileRTSishly(storage/mprotect,.c,) /**************************************************************** * * * misc "make" targets -- depend, clean, tags * * * ****************************************************************/ ClearTagsFile() /* this is not the way we should do this [WDP [lazy] 94/09] */ CTagsTarget( $(RTS_LC) $($RTS_LHC) $(CLIB_LC) ) CTagsTarget( gmp/[a-z]*.c ) CDependTarget( $(RTS_LC) $($RTS_LHC) $(CLIB_LC) )