/* 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/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/FreeForeignObj.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... * * * ****************************************************************/ NormalLibraryTarget(HSclib,$(CLIB_OBJS)) ExtraStuffToClean($(CLIB_OBJS)) #if DoInstallGHCSystem == YES InstallLibraryTarget(HSclib,$(INSTLIBDIR_GHC)) #endif /* all .lc files, so far */ CompileCBitsly(GHC,hooks/ErrorHdr,) CompileCBitsly(GHC,hooks/FreeForeignObj,) CompileCBitsly(GHC,hooks/OutOfHeap,) CompileCBitsly(GHC,hooks/OutOfStk,) CompileCBitsly(GHC,hooks/OutOfVM,) CompileCBitsly(GHC,hooks/NoRunnableThrds,) CompileCBitsly(GHC,hooks/PatErrorHdr,) CompileCBitsly(GHC,hooks/TraceHooks,) CompileCBitsly(GHC,hooks/SizeHooks,) CompileCBitsly(GHC,hooks/InitEachPE,) CompileCBitsly(GHC,main/Mallocs,) CompileCBitsly(GHC,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 BigBuildRtsTarget(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(BigBuildRtsTarget(,$(RTS_OBJS_norm))) IfBuild_p(BigBuildRtsTarget(_p, $(RTS_OBJS_p))) IfBuild_t(BigBuildRtsTarget(_t, $(RTS_OBJS_t))) IfBuild_u(BigBuildRtsTarget(_u, $(RTS_OBJS_u))) IfBuild_mc(BigBuildRtsTarget(_mc, $(RTS_OBJS_mc))) IfBuild_mr(BigBuildRtsTarget(_mr, $(RTS_OBJS_mr))) IfBuild_mt(BigBuildRtsTarget(_mt, $(RTS_OBJS_mt))) IfBuild_mp(BigBuildRtsTarget(_mp, $(RTS_OBJS_mp))) IfBuild_mg(BigBuildRtsTarget(_mg, $(RTS_OBJS_mg))) IfBuild_2s(BigBuildRtsTarget(_2s, $(RTS_OBJS_2s))) IfBuild_1s(BigBuildRtsTarget(_1s, $(RTS_OBJS_1s))) IfBuild_du(BigBuildRtsTarget(_du, $(RTS_OBJS_du))) IfBuild_a(BigBuildRtsTarget(_a, $(RTS_OBJS_a))) IfBuild_b(BigBuildRtsTarget(_b, $(RTS_OBJS_b))) IfBuild_c(BigBuildRtsTarget(_c, $(RTS_OBJS_c))) IfBuild_d(BigBuildRtsTarget(_d, $(RTS_OBJS_d))) IfBuild_e(BigBuildRtsTarget(_e, $(RTS_OBJS_e))) IfBuild_f(BigBuildRtsTarget(_f, $(RTS_OBJS_f))) IfBuild_g(BigBuildRtsTarget(_g, $(RTS_OBJS_g))) IfBuild_h(BigBuildRtsTarget(_h, $(RTS_OBJS_h))) IfBuild_i(BigBuildRtsTarget(_i, $(RTS_OBJS_i))) IfBuild_j(BigBuildRtsTarget(_j, $(RTS_OBJS_j))) IfBuild_k(BigBuildRtsTarget(_k, $(RTS_OBJS_k))) IfBuild_l(BigBuildRtsTarget(_l, $(RTS_OBJS_l))) IfBuild_m(BigBuildRtsTarget(_m, $(RTS_OBJS_m))) IfBuild_n(BigBuildRtsTarget(_n, $(RTS_OBJS_n))) IfBuild_o(BigBuildRtsTarget(_o, $(RTS_OBJS_o))) IfBuild_A(BigBuildRtsTarget(_A, $(RTS_OBJS_A))) IfBuild_B(BigBuildRtsTarget(_B, $(RTS_OBJS_B))) /**************************************************************** * * * compile the individual RTS files * * * ****************************************************************/ #define DoRtsFile(file,isuf,way,vsuf,flags) @@\ CAT3(file.,way,o) : CAT2(file,isuf) @@\ $(RM) $@ @@\ $(GHC) -c -o CAT3(file.,way,o) $(GHCFLAGS) flags $(CAT3(GHC,_OPTS,vsuf)) CAT2(file,isuf) #define CompileRTSishly(file,isuf,flags) @@\ IfBuild_normal(DoRtsFile(file,isuf,,_norm,flags)) \ IfBuild_p(DoRtsFile(file,isuf,p_,_p, flags)) \ IfBuild_t(DoRtsFile(file,isuf,t_,_t, flags)) \ IfBuild_u(DoRtsFile(file,isuf,u_,_u, flags)) \ IfBuild_mc(DoRtsFile(file,isuf,mc_,_mc, flags)) \ IfBuild_mr(DoRtsFile(file,isuf,mr_,_mr, flags)) \ IfBuild_mt(DoRtsFile(file,isuf,mt_,_mt, flags)) \ IfBuild_mp(DoRtsFile(file,isuf,mp_,_mp, flags)) \ IfBuild_mg(DoRtsFile(file,isuf,mg_,_mg, flags)) \ IfBuild_2s(DoRtsFile(file,isuf,2s_,_2s, flags)) \ IfBuild_1s(DoRtsFile(file,isuf,1s_,_1s, flags)) \ IfBuild_du(DoRtsFile(file,isuf,du_,_du, flags)) \ IfBuild_a(DoRtsFile(file,isuf,a_,_a, flags)) \ IfBuild_b(DoRtsFile(file,isuf,b_,_b, flags)) \ IfBuild_c(DoRtsFile(file,isuf,c_,_c, flags)) \ IfBuild_d(DoRtsFile(file,isuf,d_,_d, flags)) \ IfBuild_e(DoRtsFile(file,isuf,e_,_e, flags)) \ IfBuild_f(DoRtsFile(file,isuf,f_,_f, flags)) \ IfBuild_g(DoRtsFile(file,isuf,g_,_g, flags)) \ IfBuild_h(DoRtsFile(file,isuf,h_,_h, flags)) \ IfBuild_i(DoRtsFile(file,isuf,i_,_i, flags)) \ IfBuild_j(DoRtsFile(file,isuf,j_,_j, flags)) \ IfBuild_k(DoRtsFile(file,isuf,k_,_k, flags)) \ IfBuild_l(DoRtsFile(file,isuf,l_,_l, flags)) \ IfBuild_m(DoRtsFile(file,isuf,m_,_m, flags)) \ IfBuild_n(DoRtsFile(file,isuf,n_,_n, flags)) \ IfBuild_o(DoRtsFile(file,isuf,o_,_o, flags)) \ IfBuild_A(DoRtsFile(file,isuf,A_,_A, flags)) \ IfBuild_B(DoRtsFile(file,isuf,B_,_B, flags)) /* here we go: */ CompileRTSishly(c-as-asm/CallWrap_C,.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) )