#
# /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-mt          Multithread common C library:        mt/c.a
# c_app-st      Single-thread application C library: st/c_app.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
# 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
# os2           OS/2 API import library:             os2.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-import      Object files for import libraries for C runtime DLLs, .o
# obj-import    Object files for import libraries for C runtime DLLs, .obj
# o-files       Optional object files
# emxwrap       emxwrap.dll, wrap.a, and wrap.lib
# all-dos       All libraries and object files for DOS
# all-os2       All libraries, object files, and DLLs for OS/2
# omf           Build .lib and .obj files from .a and .o files
# clean         Remove files created in the build process
# cleanall      Remove target files and files created in the build process
#
##############################################################################

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

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

.SUFFIXES: .a .lib

.a.lib:
	emxomf -sl $<

.o.obj:
	emxomf -sl $<

.PHONY: all-dos all-os2 clean cleanall default emx libgcc o-import \
        obj-import c-st c-mt c_app-st c_app-mt c_dllrt-st c_dllrt-mt \
        c_dllso-st c_dllso-mt c_import-st c_import-mt c_dllnrt socket \
        graph os2 sys video moddef omflib emxwrap mkdir omf dll-int recurse \
        rec-all rec-c rec-app rec-conv rec-ctype rec-emx rec-emxload rec-gcc \
        rec-graph rec-io rec-cdll rec-malloc rec-math rec-misc rec-moddef \
        rec-nls rec-os2 rec-process rec-socket rec-startup rec-str rec-sys \
        rec-termios rec-time rec-video rec-locale rec-mbyte rec-omflib o-files



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

default .SEQUENTIAL: all-dos

all-dos .SEQUENTIAL: o-files c-st c_app-st libgcc os2 emx graph video moddef \
    omflib $(L)g.a $(L)m.a

all-os2 .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 dll-int emxwrap socket omf

omf .SEQUENTIAL: obj-files $(L)gcc.lib $(L)g.lib $(L)m.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)omflib.lib obj-import $(L)socket.lib

o-files: $(L)crt0.o $(L)dll0.o $(L)binmode.o \
        $(L)sigsysv.o $(L)sigbsd.o

obj-files: $(L)crt0.obj $(L)dll0.obj $(L)res0.obj $(L)binmode.obj \
        $(L)sigsysv.obj $(L)sigbsd.obj

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

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) DELOPT=$(DELOPT)

rec-all .SEQUENTIAL: rec-c rec-os2 rec-gcc rec-emx rec-sys rec-app rec-cdll \
                     rec-dllrt rec-dllso rec-dllnrt rec-moddef rec-omflib \
                     rec-graph rec-video rec-socket

rec-c .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-app .SETDIR=app:
	$(MAKE) $(RECURSE)

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

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

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

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

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

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

rec-emx .SETDIR=emx:
	$(MAKE) $(RECURSE)

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

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

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

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

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

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

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

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

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

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

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

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

rec-os2 .SETDIR=os2:
	$(MAKE) $(RECURSE)

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

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

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

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

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

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

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

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

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

$(L)crt0.o: startup/crt0.s
	$(ASM) -o $(L)crt0.o startup/crt0.s

$(L)dll0.o: startup/dll0.s
	$(ASM) -o $(L)dll0.o startup/dll0.s

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

$(L)sigsysv.o: process/sigsysv.c $(E)
	$(GCC) -c -o $(L)sigsysv.o process/sigsysv.c

$(L)sigbsd.o: process/sigbsd.c $(E)
	$(GCC) -c -o $(L)sigbsd.o process/sigbsd.c

$(L)crt0.obj: startup/crt0.s
	$(ASM) -DOMF -o crt0omf.o startup/crt0.s
	emxomf -m_text -ds -o $(L)crt0.obj crt0omf.o

$(L)dll0.obj: startup/dll0.s
	$(ASM) -DOMF -o dll0omf.o startup/dll0.s
	emxomf -l_text -ds -o $(L)dll0.obj dll0omf.o

$(L)res0.obj: startup/res0.s
	$(ASM) -DOMF -o res0omf.o startup/res0.s
	emxomf -l_text -ds -o $(L)res0.obj res0omf.o

$(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)appinit.o: gcc/main.c
	$(GCC) -c -o $(L)appinit.o gcc/main.c

$(L)dllinit.o: dllrt/dllinit.c
	$(GCC) -c -o $(L)dllinit.o dllrt/dllinit.c

$(L)ctor.o: startup/ctor.c
	$(GCC) -c -o $(L)ctor.o startup/ctor.c

$(L)dtor.o: startup/dtor.c
	$(GCC) -c -o $(L)dtor.o startup/dtor.c

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

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

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

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

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

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

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

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

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

c_import-st: obj-import
	$(MAKE) recurse RDIR=cdll RTARGET=import-st

c_import-mt: obj-import
	$(MAKE) recurse RDIR=cdll RTARGET=import-mt

c_dllnrt:
	$(MAKE) recurse RDIR=dllnrt RTARGET=dllnrt


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

o-import: $(L)appinit.o $(L)dllinit.o $(L)ctor.o $(L)dtor.o
obj-import: $(L)appinit.obj $(L)dllinit.obj $(L)ctor.obj $(L)dtor.obj

libgcc .SETDIR=gcc:
	$(MAKE) libgcc

os2 .SETDIR=os2:
	$(MAKE) os2

emx .SETDIR=emx:
	$(MAKE) emx

sys .SETDIR=sys:
	$(MAKE) sys

graph .SETDIR=graph:
	$(MAKE) graph

video .SETDIR=video:
	$(MAKE) video

moddef .SETDIR=moddef:
	$(MAKE) moddef

omflib .SETDIR=omflib:
	$(MAKE) omflib

socket .SETDIR=socket:
	$(MAKE) socket

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

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

$(L)m.a:
	$(AR) s $(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)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)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
$(L)appinit.obj: $(L)appinit.o
$(L)dllinit.obj: $(L)dllinit.o
$(L)ctor.obj: $(L)ctor.o
$(L)dtor.obj: $(L)dtor.o

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

dll-int .SEQUENTIAL: $(L)gcc.lib $(L)os2.lib $(L)dll0.obj \
    $(L)res0.obj $(L)emx2.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

dll-st .SEQUENTIAL: libgcc c-st c_dllrt-st emx os2 dll-st-int

dll-st-int .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

dll-mt .SEQUENTIAL: libgcc c-mt c_dllrt-mt emx os2 dll-mt-int

dll-mt-int .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

dll-fwd .SEQUENTIAL: c_import-mt emx dll-fwd-int

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

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

emxwrap-int .SETDIR=os2:
	$(MAKE) emxwrap

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

mkdir .IGNORE:
	mkdir app\mt
	mkdir app\st
	mkdir conv\mt
	mkdir conv\st
	mkdir ctype\mt
	mkdir ctype\st
	mkdir dllrt\mt
	mkdir dllrt\st
	mkdir dllso\mt
	mkdir dllso\st
	mkdir emx\mt
	mkdir emx\st
	mkdir emxload\mt
	mkdir emxload\st
	mkdir io\mt
	mkdir io\st
	mkdir locale\mt
	mkdir locale\st
	mkdir malloc\mt
	mkdir malloc\st
	mkdir math\mt
	mkdir math\st
	mkdir mbyte\mt
	mkdir mbyte\st
	mkdir misc\mt
	mkdir misc\st
	mkdir nls\mt
	mkdir nls\st
	mkdir process\mt
	mkdir process\st
	mkdir startup\mt
	mkdir startup\st
	mkdir str\mt
	mkdir str\st
	mkdir sys\mt
	mkdir sys\st
	mkdir termios\mt
	mkdir termios\st
	mkdir time\mt
	mkdir time\st
