#
# /emx/src/lib/makefile
#
# This makefile has been designed for dmake 3.8.
#
# Don't forget to SET SWITCHAR=-
#
# Targets:
#
# mkdir         Create directories
# c-st          Single-thread common C library:      st/c.a
# c-st-p        Ditto, for profiling:                st/c_p.a
# c-mt          Multithread common C library:        mt/c.a
# c_alias       Aliases                              c_alias.{a,lib}
# c_static      Static modules                       c_static.{a,lib}
# c_app-st      Single-thread application C library: st/c_app.a
# c_app-st-p    Ditto, for profiling:                st/c_app_p.a
# c_app-mt      Multithread application C library:   mt/c_app.a
# c_dllrt-st    Single-thread DLL C library:         st/c_dllrt.a
# c_dllrt-mt    Multithread DLL C library:           mt/c_dllrt.a
# c_dllso-st    Single-thread DLL C library (-Zso):  st/c_dllso.lib
# c_dllso-mt    Multithread DLL C library (-Zso):    mt/c_dllso.lib
# c_import-st   Single-thread import library:        st/c_import.{a,lib}
# c_import-mt   Multithread import library:          mt/c_import.{a,lib}
# c_dllnrt      DLL without runtime environment:     c_dllnrt.lib
# libgcc        GCC helper functions:                gcc.a
# libgcc-p	Ditto, with profiling:		     gcc_p.a
# socket        Socket library:                      socket.a
# graph         Graphics library:                    graph.a
# video         Video library:                       video.a
# moddef        moddef library:                      moddef.a
# omflib        omflib library:                      omflib.a
# tmalloc       tmalloc wrapper library:             tmalloc.a
# malloc1-st	Old single-thread malloc library:    st/malloc1.a
# malloc1-mt	Old multithread malloc library:	     mt/malloc1.a
# end		etext/edata/end library for LINK386: end.lib
# os2           OS/2 API import library:             os2.a
# os2-p         Ditto, for profiling:                os2_p.a
# dll-fwd       Create forwarder DLL                 emxlibc.dll
# dll-mt        Create multithread C runtime DLL     emxlibcm.dll
# dll-st        Create single-thread C runtime DLL   emxlibcs.dll
# sys           System call emulation library:       st/sys.lib mt/sys.lib
# o-crt         Startup modules (.o)                 crt0.o dll0.o ...
# o-crt-bsd     Ditto, BSD stuff                     gcrt0.o
# o-opt         Optional object files (.o)           binmode.o sigbsd.o ...
# obj-crt       Startup modules (.obj)               crt0.obj dll0.obj ...
# obj-opt       Optional object files (.obj)         binmode.obj sigbsd.obj ...
# emxwrap       emxwrap.dll, wrap.a, and wrap.lib
# all-dos       All libraries and object files for DOS
# all-os2       Ditto, plus libraries, object files, and DLLs for OS/2
# all-dos-bsd   Like all-dos, plus BSD stuff
# all-os2-bsd   Like all-os2, plus BSD stuff
# omf           Build .lib and .obj files from .a and .o files
# trace		Build .tdf and .tff files	     emxlibc?.tdf trc00??.tff
# clean         Remove files created in the build process
# cleanall      Remove target files and files created in the build process
#
##############################################################################

.IF $(CPU)
.ELSE
CPU=386
.ENDIF

##############################################################################

GCC=gcc -O2 -Wall -mprobe -fstack-check
ASM=gcc -c -Wall -x assembler-with-cpp
AR=ar
I=/emx/include/
S=$(I)sys/
E=$(S)emx.h
L=\emx\lib\ #
DLL=\emx\dll\ #

##############################################################################

PASSDOWN=CPU=$(CPU) DELOPT=$(DELOPT)

##############################################################################

.SUFFIXES: .a .lib

.a.lib:
	emxomf -sl $<

.PHONY: all-dos all-os2 all-bsd all-dos-bsd all-os2-bsd clean cleanall \
        default emx_386 libgcc libgcc-p c_static c_alias \
        c-st c-st-p c-mt c_app-st c_app-st-p c_app-mt c_dllrt-st c_dllrt-mt \
        c_dllso-st c_dllso-mt c_import-st c_import-mt c_dllnrt \
        socket tmalloc end graph os2_386 os2_386-p sys video moddef \
	omflib emxwrap trace \
        malloc1-st malloc1-mt mkdir mkdir-cpu \
        omf dll-int o-crt o-crt-bsd o-opt obj-crt obj-opt recurse os2 os2-p \
        rec-all rec-c rec-app rec-conv rec-ctype rec-emx_386 \
        rec-emxload rec-gcc rec-graph rec-io rec-cdll rec-malloc rec-math \
        rec-misc rec-moddef rec-nls rec-os2_386 rec-process rec-socket \
        rec-startup rec-str rec-sys rec-termios rec-time rec-tmalloc \
        rec-video rec-locale rec-mbyte rec-omflib rec-end rec-malloc1



##############################################################################

default .SWAP .SEQUENTIAL: all-os2-bsd trace

os2: os2_$(CPU)

os2-p: os2_$(CPU)-p

all-dos .SEQUENTIAL .SWAP: o-crt o-opt c-st c_alias c_app-st libgcc os2_$(CPU) \
    emx_$(CPU) graph video moddef omflib $(L)g.a $(L)m.a \
    malloc1-st

all-os2 .SWAP .SEQUENTIAL: all-dos c-mt c_app-mt c_dllrt-st c_dllrt-mt \
    c_dllso-st c_dllso-mt c_import-st c_import-mt c_dllnrt \
    sys end dll-int emxwrap socket tmalloc malloc1-mt omf

all-dos-bsd .SWAP .SEQUENTIAL: all-dos o-crt-bsd

all-os2-bsd .SWAP .SEQUENTIAL: all-os2 o-crt-bsd

omf .SWAP .SEQUENTIAL: obj-crt obj-opt \
        $(L)gcc.lib $(L)g.lib $(L)m.lib $(L)c_alias.lib \
        $(L)st\c.lib $(L)st\c_app.lib $(L)st\c_dllrt.lib $(L)st\emx.lib \
        $(L)mt\c.lib $(L)mt\c_app.lib $(L)mt\c_dllrt.lib $(L)mt\emx.lib \
        $(L)os2.lib $(L)emx2.lib $(L)emxio.lib $(L)graph.lib $(L)video.lib \
        $(L)moddef.lib $(L)tmalloc.lib $(L)omflib.lib $(L)c_static.lib \
        $(L)socket.lib $(L)st\malloc1.lib $(L)mt\malloc1.lib

o-crt .SWAP .SETDIR=startup:
	$(MAKE) o-crt $(PASSDOWN)

o-crt-bsd .SWAP .SETDIR=startup:
	$(MAKE) o-crt-bsd $(PASSDOWN)

obj-crt .SWAP .SETDIR=startup:
	$(MAKE) obj-crt $(PASSDOWN)

o-opt: $(L)binmode.o $(L)sigsysv.o $(L)sigbsd.o $(L)smallcnv.o

obj-opt: $(L)binmode.obj $(L)sigsysv.obj $(L)sigbsd.obj $(L)smallcnv.obj

clean:
	$(MAKE) recurse RDIR=all RTARGET=clean $(PASSDOWN)

cleanall .IGNORE: clean
	del $(L)*.o $(DELOPT)
	del $(L)*.obj $(DELOPT)
	del $(L)*.lib $(DELOPT)
	del $(L)*.a $(DELOPT)
	del $(L)mt\*.a $(DELOPT)
	del $(L)mt\*.lib $(DELOPT)
	del $(L)st\*.a $(DELOPT)
	del $(L)st\*.lib $(DELOPT)

##############################################################################

recurse: rec-$(RDIR)

RECURSE=$(RTARGET) $(PASSDOWN)

rec-all .SWAP .SEQUENTIAL: rec-c rec-os2_$(CPU) rec-gcc rec-emx_$(CPU) rec-sys \
                     rec-alias rec-app rec-cdll rec-dllrt rec-dllso \
                     rec-dllnrt rec-moddef rec-omflib rec-graph rec-video \
                     rec-socket rec-static rec-tmalloc rec-end rec-malloc1

rec-c .SWAP .SEQUENTIAL: rec-conv rec-ctype rec-emxload rec-io \
                   rec-locale rec-malloc rec-math rec-mbyte rec-misc \
                   rec-nls rec-process rec-startup rec-str rec-termios \
                   rec-time

rec-alias .SWAP .SETDIR=alias:
	$(MAKE) $(RECURSE)

rec-app .SWAP .SETDIR=app:
	$(MAKE) $(RECURSE)

rec-cdll .SWAP .SETDIR=cdll:
	$(MAKE) $(RECURSE)

rec-conv .SWAP .SETDIR=conv:
	$(MAKE) $(RECURSE)

rec-ctype .SWAP .SETDIR=ctype:
	$(MAKE) $(RECURSE)

rec-dllnrt .SWAP .SETDIR=dllnrt:
	$(MAKE) $(RECURSE)

rec-dllrt .SWAP .SETDIR=dllrt:
	$(MAKE) $(RECURSE)

rec-dllso .SWAP .SETDIR=dllso:
	$(MAKE) $(RECURSE)

rec-emx_$(CPU) .SWAP .SETDIR=emx_$(CPU):
	$(MAKE) $(RECURSE)

rec-emxload .SWAP .SETDIR=emxload:
	$(MAKE) $(RECURSE)

rec-end .SWAP .SETDIR=end:
	$(MAKE) $(RECURSE)

rec-gcc .SWAP .SETDIR=gcc:
	$(MAKE) $(RECURSE)

rec-graph .SWAP .SETDIR=graph:
	$(MAKE) $(RECURSE)

rec-io .SWAP .SETDIR=io:
	$(MAKE) $(RECURSE)

rec-locale .SWAP .SETDIR=locale:
	$(MAKE) $(RECURSE)

rec-malloc .SWAP .SETDIR=malloc:
	$(MAKE) $(RECURSE)

rec-malloc1 .SWAP .SETDIR=malloc1:
	$(MAKE) $(RECURSE)

rec-math .SWAP .SETDIR=math:
	$(MAKE) $(RECURSE)

rec-mbyte .SWAP .SETDIR=mbyte:
	$(MAKE) $(RECURSE)

rec-moddef .SWAP .SETDIR=moddef:
	$(MAKE) $(RECURSE)

rec-static .SWAP .SETDIR=static:
	$(MAKE) $(RECURSE)

rec-tmalloc .SWAP .SETDIR=tmalloc:
	$(MAKE) $(RECURSE)

rec-omflib .SWAP .SETDIR=omflib:
	$(MAKE) $(RECURSE)

rec-misc .SWAP .SETDIR=misc:
	$(MAKE) $(RECURSE)

rec-nls .SWAP .SETDIR=nls:
	$(MAKE) $(RECURSE)

rec-os2_$(CPU) .SWAP .SETDIR=os2_$(CPU):
	$(MAKE) $(RECURSE)

rec-process .SWAP .SETDIR=process:
	$(MAKE) $(RECURSE)

rec-socket .SWAP .SETDIR=socket:
	$(MAKE) $(RECURSE)

rec-startup .SWAP .SETDIR=startup:
	$(MAKE) $(RECURSE)

rec-str .SWAP .SETDIR=str:
	$(MAKE) $(RECURSE)

rec-sys .SWAP .SETDIR=sys:
	$(MAKE) $(RECURSE)

rec-termios .SWAP .SETDIR=termios:
	$(MAKE) $(RECURSE)

rec-time .SWAP .SETDIR=time:
	$(MAKE) $(RECURSE)

rec-video .SWAP .SETDIR=video:
	$(MAKE) $(RECURSE)

##############################################################################

$(L)binmode.o: io/$(CPU)/binmode.s
	$(ASM) -o $(L)binmode.o io/$(CPU)/binmode.s

$(L)sigsysv.o: process/sigsysv.c $(S)uflags.h
	$(GCC) -c -o $(L)sigsysv.o process/sigsysv.c

$(L)sigbsd.o: process/sigbsd.c $(S)uflags.h
	$(GCC) -c -o $(L)sigbsd.o process/sigbsd.c

$(L)smallcnv.o: conv/$(CPU)/smallcnv.s
	$(ASM) -o $(L)smallcnv.o conv/$(CPU)/smallcnv.s

$(L)binmode.obj: $(L)binmode.o
	emxomf -sl $(L)binmode.o

$(L)sigbsd.obj: $(L)sigbsd.o
	emxomf -sl $(L)sigbsd.o

$(L)sigsysv.obj: $(L)sigsysv.o
	emxomf -sl $(L)sigsysv.o

$(L)smallcnv.obj: $(L)smallcnv.o
	emxomf -sl $(L)smallcnv.o

$(L)crt0.obj: obj-crt
$(L)mcrt0.obj: obj-crt
$(L)dll0.obj: obj-crt
$(L)res0.obj: obj-crt

##############################################################################

c-st .SWAP:
	$(MAKE) recurse RDIR=c RTARGET=lib-st $(PASSDOWN)

c-st-p:
	$(MAKE) recurse RDIR=c RTARGET=lib-st-p $(PASSDOWN)

c-mt .SWAP:
	$(MAKE) recurse RDIR=c RTARGET=lib-mt $(PASSDOWN)

c_alias .SWAP:
	$(MAKE) recurse RDIR=alias RTARGET=alias $(PASSDOWN)

c_app-st $(L)st\c_app.a .SWAP:
	$(MAKE) recurse RDIR=app RTARGET=lib-st $(PASSDOWN)

c_app-st-p $(L)st\c_app_p.a:
	$(MAKE) recurse RDIR=app RTARGET=lib-st-p $(PASSDOWN)

c_app-mt $(L)mt\c_app.a .SWAP:
	$(MAKE) recurse RDIR=app RTARGET=lib-mt $(PASSDOWN)

c_dllrt-st .SWAP:
	$(MAKE) recurse RDIR=dllrt RTARGET=lib-st $(PASSDOWN)

c_dllrt-mt .SWAP:
	$(MAKE) recurse RDIR=dllrt RTARGET=lib-mt $(PASSDOWN)

c_dllso-st .SWAP:
	$(MAKE) recurse RDIR=dllso RTARGET=lib-st $(PASSDOWN)

c_dllso-mt .SWAP:
	$(MAKE) recurse RDIR=dllso RTARGET=lib-mt $(PASSDOWN)

c_import-st .SWAP: c_static
	$(MAKE) recurse RDIR=cdll RTARGET=import-st $(PASSDOWN)

c_import-mt .SWAP: c_static
	$(MAKE) recurse RDIR=cdll RTARGET=import-mt $(PASSDOWN)

c_dllnrt .SWAP:
	$(MAKE) recurse RDIR=dllnrt RTARGET=dllnrt $(PASSDOWN)

c_static .SWAP:
	$(MAKE) recurse RDIR=static RTARGET=static $(PASSDOWN)


##############################################################################

libgcc .SWAP .SETDIR=gcc:
	$(MAKE) libgcc $(PASSDOWN)

libgcc-p .SWAP .SETDIR=gcc:
	$(MAKE) libgcc-p $(PASSDOWN)

os2_$(CPU) .SWAP .SETDIR=os2_$(CPU):
	$(MAKE) os2 $(PASSDOWN)

os2_$(CPU)-p .SWAP .SETDIR=os2_$(CPU):
	$(MAKE) os2-p $(PASSDOWN)

emx_$(CPU) .SWAP .SETDIR=emx_$(CPU):
	$(MAKE) emx $(PASSDOWN)

sys .SWAP .SETDIR=sys:
	$(MAKE) sys $(PASSDOWN)

graph .SWAP .SETDIR=graph:
	$(MAKE) graph $(PASSDOWN)

video .SWAP .SETDIR=video:
	$(MAKE) video $(PASSDOWN)

moddef .SWAP .SETDIR=moddef:
	$(MAKE) moddef $(PASSDOWN)

tmalloc .SWAP .SETDIR=tmalloc:
	$(MAKE) tmalloc $(PASSDOWN)

omflib .SWAP .SETDIR=omflib:
	$(MAKE) omflib $(PASSDOWN)

socket .SWAP .SETDIR=socket:
	$(MAKE) socket $(PASSDOWN)

end .SWAP .SETDIR=end:
	$(MAKE) end $(PASSDOWN)

malloc1-st $(L)st\malloc1.a:
	$(MAKE) recurse RDIR=malloc1 RTARGET=lib-st $(PASSDOWN)

malloc1-mt $(L)mt\malloc1.a:
	$(MAKE) recurse RDIR=malloc1 RTARGET=lib-mt $(PASSDOWN)


##############################################################################

$(L)g.a:
	$(AR) rs $(L)g.a

$(L)m.a:
	$(AR) rs $(L)m.a

##############################################################################

$(L)gcc.lib: $(L)gcc.a
$(L)st\c.lib: $(L)st\c.a
$(L)mt\c.lib: $(L)mt\c.a
$(L)st\c_app.lib: $(L)st\c_app.a
$(L)mt\c_app.lib: $(L)mt\c_app.a
$(L)st\c_dllrt.lib: $(L)st\c_dllrt.a
$(L)mt\c_dllrt.lib: $(L)mt\c_dllrt.a
$(L)st\emx.lib: $(L)st\emx.a
$(L)mt\emx.lib: $(L)mt\emx.a
$(L)st\malloc1.lib: $(L)st\malloc1.a
$(L)mt\malloc1.lib: $(L)mt\malloc1.a
$(L)c_alias.lib: $(L)c_alias.a
$(L)c_static.lib: $(L)c_static.a
$(L)emx2.lib: $(L)emx2.a
$(L)emxio.lib: $(L)emxio.a
$(L)graph.lib: $(L)graph.a
$(L)video.lib: $(L)video.a
$(L)moddef.lib: $(L)moddef.a
$(L)tmalloc.lib: $(L)tmalloc.a
$(L)omflib.lib: $(L)omflib.a
$(L)socket.lib: $(L)socket.a
$(L)os2.lib: $(L)os2.a
$(L)g.lib: $(L)g.a
$(L)m.lib: $(L)m.a

##############################################################################

dll-int .SWAP .SEQUENTIAL: $(L)gcc.lib $(L)os2.lib $(L)dll0.obj \
    $(L)res0.obj $(L)emx2.lib $(L)c_static.lib $(L)end.lib \
    $(L)st\c.lib $(L)st\c_dllrt.lib $(L)st\emx.lib \
    $(L)mt\c.lib $(L)mt\c_dllrt.lib $(L)mt\emx.lib
	$(MAKE) recurse RDIR=cdll RTARGET=dll-all $(PASSDOWN)

dll-st .SWAP .SEQUENTIAL: libgcc c-st c_dllrt-st emx_$(CPU) os2_$(CPU) dll-st-int

dll-st-int .SWAP .SEQUENTIAL: $(L)gcc.lib $(L)emx2.lib $(L)os2.lib $(L)dll0.obj \
    $(L)st\c.lib $(L)st\c_dllrt.lib $(L)st\emx.lib
	$(MAKE) recurse RDIR=cdll RTARGET=dll-st $(PASSDOWN)

dll-mt .SWAP .SEQUENTIAL: libgcc c-mt c_dllrt-mt emx_$(CPU) os2_$(CPU) dll-mt-int

dll-mt-int .SWAP .SEQUENTIAL: $(L)gcc.lib $(L)emx2.lib $(L)os2.lib $(L)dll0.obj \
    $(L)mt\c.lib $(L)mt\c_dllrt.lib $(L)mt\emx.lib
	$(MAKE) recurse RDIR=cdll RTARGET=dll-mt $(PASSDOWN)

dll-fwd .SWAP .SEQUENTIAL: c_import-mt emx_$(CPU) $(L)c_static.lib dll-fwd-int

dll-fwd-int: $(L)dll0.obj $(L)emx2.lib
	$(MAKE) recurse RDIR=cdll RTARGET=dll-fwd $(PASSDOWN)

emxwrap .SWAP .SEQUENTIAL: $(L)res0.obj emxwrap-int

emxwrap-int .SWAP .SETDIR=os2_$(CPU):
	$(MAKE) emxwrap $(PASSDOWN)

#
# Requires trcust.exe of os2pdp.zip
#
trace:
	$(MAKE) recurse RDIR=cdll RTARGET=trace $(PASSDOWN)

##############################################################################

mkdir .IGNORE:
	mkdir alias\$(CPU)
	mkdir app\mt_$(CPU)
	mkdir app\st_$(CPU)
	mkdir app\st_p_$(CPU)
	mkdir cdll\$(CPU)
	mkdir conv\mt_$(CPU)
	mkdir conv\st_$(CPU)
	mkdir conv\st_p_$(CPU)
	mkdir ctype\mt_$(CPU)
	mkdir ctype\st_$(CPU)
	mkdir ctype\st_p_$(CPU)
	mkdir dllnrt\$(CPU)
	mkdir dllrt\mt_$(CPU)
	mkdir dllrt\st_$(CPU)
	mkdir dllso\mt_$(CPU)
	mkdir dllso\st_$(CPU)
	mkdir emx_$(CPU)\mt
	mkdir emx_$(CPU)\st
	mkdir emxload\mt_$(CPU)
	mkdir emxload\st_$(CPU)
	mkdir emxload\st_p_$(CPU)
	mkdir gcc\st_$(CPU)
	mkdir gcc\st_p_$(CPU)
	mkdir graph\$(CPU)
	mkdir io\mt_$(CPU)
	mkdir io\st_$(CPU)
	mkdir io\st_p_$(CPU)
	mkdir locale\mt_$(CPU)
	mkdir locale\st_$(CPU)
	mkdir locale\st_p_$(CPU)
	mkdir malloc\mt_$(CPU)
	mkdir malloc\st_$(CPU)
	mkdir malloc\st_p_$(CPU)
	mkdir malloc1\mt_$(CPU)
	mkdir malloc1\st_$(CPU)
	mkdir math\mt_$(CPU)
	mkdir math\st_$(CPU)
	mkdir math\st_p_$(CPU)
	mkdir mbyte\mt_$(CPU)
	mkdir mbyte\st_$(CPU)
	mkdir mbyte\st_p_$(CPU)
	mkdir misc\mt_$(CPU)
	mkdir misc\st_$(CPU)
	mkdir misc\st_p_$(CPU)
	mkdir moddef\$(CPU)
	mkdir nls\mt_$(CPU)
	mkdir nls\st_$(CPU)
	mkdir nls\st_p_$(CPU)
	mkdir omflib\$(CPU)
	mkdir os2_$(CPU)\st
	mkdir os2_$(CPU)\st_p
	mkdir process\mt_$(CPU)
	mkdir process\st_$(CPU)
	mkdir process\st_p_$(CPU)
	mkdir socket\$(CPU)
	mkdir startup\mt_$(CPU)
	mkdir startup\st_$(CPU)
	mkdir startup\st_p_$(CPU)
	mkdir static\$(CPU)
	mkdir str\mt_$(CPU)
	mkdir str\st_$(CPU)
	mkdir str\st_p_$(CPU)
	mkdir sys\mt_$(CPU)
	mkdir sys\st_$(CPU)
	mkdir termios\mt_$(CPU)
	mkdir termios\st_$(CPU)
	mkdir termios\st_p_$(CPU)
	mkdir time\mt_$(CPU)
	mkdir time\st_$(CPU)
	mkdir time\st_p_$(CPU)
	mkdir tmalloc\$(CPU)
	mkdir video\$(CPU)
