# define the TMS9900 compilation tools

GAS=tms9900-as
LD=tms9900-ld
CC=tms9900-gcc

# define paths to elf2 conversion utilities

ELF2PROGRAM=elf2ea5
ELF2CART=/tools/overrides/elf2cart
C2UBIN=/tools/c2ubin/c2ubin

# make flags

MAKEFLAGS += --silent

# compiler flags

C_FLAGS=\
  -Os -fno-function-cse -fno-peephole2 -std=c99 -Wall -DBUILD_TI99 -fno-builtin-fputs -fno-builtin-fprintf
#--save-temp -Wa,-adhln -g

INC_PATH=-Iinclude -Iinclude/private -I/libti99

PROGRAM_ASM_SRC := $(wildcard *_ea5.asm)
PROGRAM_ASM_OBJ := $(patsubst %.asm,%.o,$(PROGRAM_ASM_SRC))
KERNEL_ASM_SRC  := $(wildcard unix99r3_*_cart.asm)
KERNEL_ASM_OBJ  := $(patsubst %.asm,%.o,$(KERNEL_ASM_SRC))

LIB_COMMON=$(BUILD_DIR)/libcommon.a
LIB_COMMON_C_SRCS   := $(wildcard lib/common/*.c)
LIB_COMMON_C_OBJS   := $(patsubst %.c,%.o,$(LIB_COMMON_C_SRCS))
LIB_COMMON_ASM_SRCS := $(wildcard lib/common/*.asm)
LIB_COMMON_ASM_OBJS := $(patsubst %.asm,%.o,$(LIB_COMMON_ASM_SRCS))

LIB_KERNEL=$(BUILD_DIR)/libkernel.a
LIB_KERNEL_C_SRCS   := $(wildcard lib/kernel/*.c)
LIB_KERNEL_C_OBJS   := $(patsubst %.c,%.o,$(LIB_KERNEL_C_SRCS))
LIB_KERNEL_ASM_SRCS := $(wildcard lib/kernel/*.asm)
LIB_KERNEL_ASM_OBJS := $(patsubst %.asm,%.o,$(LIB_KERNEL_ASM_SRCS))

LIB_TRAMPOLINE=$(BUILD_DIR)/libtrampoline.a
LIB_TRAMPOLINE_C_SRCS   := $(wildcard lib/trampoline/*.c)
LIB_TRAMPOLINE_C_OBJS   := $(patsubst %.c,%.o,$(LIB_TRAMPOLINE_C_SRCS))
LIB_TRAMPOLINE_ASM_SRCS := $(wildcard lib/trampoline/*.asm)
LIB_TRAMPOLINE_ASM_OBJS := $(patsubst %.asm,%.o,$(LIB_TRAMPOLINE_ASM_SRCS))

PROGRAM_LIBS=-ltrampoline -lcommon -ltrampoline -lti99 -lgcc

KERNEL_LIBS=-lkernel -lcommon -lti99 -lgcc

LIB_PATH=-L$(BUILD_DIR) -L/libti99 -L/opt/tms9900/gcc-4.4.0/lib/gcc/tms9900/4.4.0

# link flags

# define and locate the sections across the address space
# .cache    = 2000 - 245f
# .dylib    = 2460 - 24f7
# .stdfiles = 24f8 - 24fd
# .errno    = 24fe - 24ff
# .data     = 2500 - 3FFF
# .scratch  = 8320 -

PROGRAM_LD_FLAGS=\
  --section-start .text=A000 --section-start .data=2500 --section-start .cache=2000 --section-start .dylib=2460 --section-start .stdfiles=24f8 --section-start .errno=24fe --section-start .scratch_cache=8320 --section-start .scratch_speech=833c -M

KERNEL_LD_FLAGS=\
  --section-start .text=6000 --section-start .data=2500 --section-start .cache=2000 --section-start .dylib=2460 --section-start .stdfiles=24f8 --section-start .errno=24fe --section-start .scratch_cache=8320 --section-start .scratch_speech=833c -M

# define the image paths

BUILD_DIR=build
EXECUTABLES_DIR=$(BUILD_DIR)/image
EXE_BIN_DIR=$(EXECUTABLES_DIR)/bin
EXE_EXAMPLE_DIR=$(EXECUTABLES_DIR)/example
EXE_GAME_DIR=$(EXECUTABLES_DIR)/game

# define executables

ROM0=$(BUILD_DIR)/unix99r3_rom0.elf
ROM1=$(BUILD_DIR)/unix99r3_rom1.elf
ROM2=$(BUILD_DIR)/unix99r3_rom2.elf
ROM3=$(BUILD_DIR)/unix99r3_rom3.elf

adduser=$(BUILD_DIR)/adduser.elf
basic_ex=$(BUILD_DIR)/basic_ex.elf
basic=$(BUILD_DIR)/basic.elf
bitmap_1=$(BUILD_DIR)/bitmap_1.elf
bitmap_2=$(BUILD_DIR)/bitmap_2.elf
bitmap_3=$(BUILD_DIR)/bitmap_3.elf
bye=$(BUILD_DIR)/bye.elf
cat=$(BUILD_DIR)/cat.elf
catb=$(BUILD_DIR)/catb.elf
cd=$(BUILD_DIR)/cd.elf
chris=$(BUILD_DIR)/chris.elf
clear=$(BUILD_DIR)/clear.elf
color=$(BUILD_DIR)/color.elf
comp=$(BUILD_DIR)/comp.elf
cp=$(BUILD_DIR)/cp.elf
cut=$(BUILD_DIR)/cut.elf
date=$(BUILD_DIR)/date.elf
df=$(BUILD_DIR)/df.elf
diff=$(BUILD_DIR)/diff.elf
display=$(BUILD_DIR)/display.elf
double=$(BUILD_DIR)/double.elf
dsr=$(BUILD_DIR)/dsr.elf
echo=$(BUILD_DIR)/echo.elf
exit=$(BUILD_DIR)/exit.elf
file_bin=$(BUILD_DIR)/file_bin.elf
file_bin2=$(BUILD_DIR)/file_bin2.elf
file_bl=$(BUILD_DIR)/file_bl.elf
file_bseq=$(BUILD_DIR)/file_bseq.elf
file_k=$(BUILD_DIR)/file_k.elf
file_text=$(BUILD_DIR)/file_text.elf
files=$(BUILD_DIR)/files.elf
fontload=$(BUILD_DIR)/fontload.elf
free=$(BUILD_DIR)/free.elf
gets=$(BUILD_DIR)/gets.elf
grep=$(BUILD_DIR)/grep.elf
groff=$(BUILD_DIR)/groff.elf
head=$(BUILD_DIR)/head.elf
hello=$(BUILD_DIR)/hello.elf
hexdump=$(BUILD_DIR)/hexdump.elf
id=$(BUILD_DIR)/id.elf
imagedraw=$(BUILD_DIR)/imagedraw.elf
images=$(BUILD_DIR)/images.elf
launchd=$(BUILD_DIR)/launchd.elf
life=$(BUILD_DIR)/life.elf
login=$(BUILD_DIR)/login.elf
logout=$(BUILD_DIR)/logout.elf
long=$(BUILD_DIR)/long.elf
longtest=$(BUILD_DIR)/longtest.elf
lp=$(BUILD_DIR)/lp.elf
ls=$(BUILD_DIR)/ls.elf
malloc=$(BUILD_DIR)/malloc.elf
missile=$(BUILD_DIR)/missile.elf
man=$(BUILD_DIR)/man.elf
mkdir=$(BUILD_DIR)/mkdir.elf
more=$(BUILD_DIR)/more.elf
mouse=$(BUILD_DIR)/mouse.elf
ms_drv=$(BUILD_DIR)/ms_drv.elf
mv=$(BUILD_DIR)/mv.elf
pacman=$(BUILD_DIR)/pacman.elf
passwd=$(BUILD_DIR)/passwd.elf
pi=$(BUILD_DIR)/pi.elf
pio=$(BUILD_DIR)/pio.elf
pwd=$(BUILD_DIR)/pwd.elf
reboot=$(BUILD_DIR)/reboot.elf
rm=$(BUILD_DIR)/rm.elf
rmdir=$(BUILD_DIR)/rmdir.elf
rmuser=$(BUILD_DIR)/rmuser.elf
sh=$(BUILD_DIR)/sh.elf
shutdown=$(BUILD_DIR)/shutdown.elf
shmcreate=$(BUILD_DIR)/shmcreate.elf
shmreader=$(BUILD_DIR)/shmreader.elf
shmremove=$(BUILD_DIR)/shmremove.elf
shmmgr=$(BUILD_DIR)/shmmgr.elf
sort=$(BUILD_DIR)/sort.elf
sound=$(BUILD_DIR)/sound.elf
speech=$(BUILD_DIR)/speech.elf
sprite=$(BUILD_DIR)/sprite.elf
sptest=$(BUILD_DIR)/sptest.elf
sramtest=$(BUILD_DIR)/sramtest.elf
stat=$(BUILD_DIR)/stat.elf
tail=$(BUILD_DIR)/tail.elf
tee=$(BUILD_DIR)/tee.elf
test=$(BUILD_DIR)/test.elf
textfmt=$(BUILD_DIR)/textfmt.elf
tmatrix=$(BUILD_DIR)/tmatrix.elf
touch=$(BUILD_DIR)/touch.elf
uname=$(BUILD_DIR)/uname.elf
unix99logo=$(BUILD_DIR)/unix99logo.elf
vi=$(BUILD_DIR)/vi.elf
wc=$(BUILD_DIR)/wc.elf
xkb_drv=$(BUILD_DIR)/xkb_drv.elf

# define building 'all'

all: $(ROM0) $(ROM1) $(ROM2) $(ROM3) $(adduser) $(basic) $(basic_ex) $(bitmap_1) $(bitmap_2) $(bitmap_3) $(bye) $(cat) $(catb) $(cd) $(chris) $(clear) $(color) $(comp) $(cp) $(cut) $(date) $(df) $(diff) $(display) $(double) $(dsr) $(echo) $(exit) $(file_bin) $(file_bin2) $(file_bl) $(file_bseq) $(file_k) $(file_text) $(files) $(fontload) $(free) $(gets) $(grep) $(groff) $(head) $(hello) $(hexdump) $(id) $(imagedraw) $(images) $(launchd) $(life) $(login) $(logout) $(long) $(longtest) $(lp) $(ls) $(malloc) $(man) $(missile) $(mkdir) $(more) $(mouse) $(ms_drv) $(mv) $(pacman) $(passwd) $(pi) $(pio) $(pwd) $(reboot) $(rm) $(rmdir) $(rmuser) $(sh) $(shmcreate) $(shmreader) $(shmremove) $(shmmgr) $(shutdown) $(sort) $(sound) $(speech) $(sprite) $(sptest) $(sramtest) $(stat) $(tail) $(tee) $(test) $(textfmt) $(tmatrix) $(touch) $(uname) $(unix99logo) $(vi) $(wc) $(xkb_drv)

# build recipes for the libraries

$(LIB_COMMON): $(LIB_COMMON_C_OBJS) $(LIB_COMMON_ASM_OBJS)
	echo $(notdir ${@})
	$(AR) rcs $(LIB_COMMON) $(LIB_COMMON_C_OBJS) $(LIB_COMMON_ASM_OBJS)

$(LIB_KERNEL): $(LIB_KERNEL_C_OBJS) $(LIB_KERNEL_ASM_OBJS)
	echo $(notdir ${@})
	$(AR) rcs $(LIB_KERNEL) $(LIB_KERNEL_C_OBJS) $(LIB_KERNEL_ASM_OBJS)

$(LIB_TRAMPOLINE): $(LIB_TRAMPOLINE_C_OBJS) $(LIB_TRAMPOLINE_ASM_OBJS)
	echo $(notdir ${@})
	$(AR) rcs $(LIB_TRAMPOLINE) $(LIB_TRAMPOLINE_C_OBJS) $(LIB_TRAMPOLINE_ASM_OBJS)

# build recipes for the kernel rom pages

#DEFINE STANDARD KERNEL DEPENDENCIES

$(ROM0): $(KERNEL_ASM_OBJ) $(LIB_COMMON) $(LIB_KERNEL) unix99r3_romctl.o unix99r3_rom0_start.o
	echo $(@)
	$(LD) $(KERNEL_ASM_OBJ) unix99r3_romctl.o unix99r3_rom0_start.o $(LIB_PATH) $(KERNEL_LIBS) $(KERNEL_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2CART) $(@) $(subst .elf,.bin,$(@))

$(ROM1): $(KERNEL_ASM_OBJ) $(LIB_COMMON) $(LIB_KERNEL) unix99r3_romctl.o unix99r3_rom1_start.o
	echo $(@)
	$(LD) $(KERNEL_ASM_OBJ) unix99r3_romctl.o unix99r3_rom1_start.o $(LIB_PATH) $(KERNEL_LIBS) $(KERNEL_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2CART) $(@) $(subst .elf,.bin,$(@))

$(ROM2): $(KERNEL_ASM_OBJ) $(LIB_COMMON) $(LIB_KERNEL) unix99r3_romctl.o unix99r3_rom2_start.o
	echo $(@)
	$(LD) $(KERNEL_ASM_OBJ) unix99r3_romctl.o unix99r3_rom2_start.o $(LIB_PATH) $(KERNEL_LIBS) $(KERNEL_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2CART) $(@) $(subst .elf,.bin,$(@))

$(ROM3): $(KERNEL_ASM_OBJ) $(LIB_COMMON) $(LIB_KERNEL) unix99r3_romctl.o unix99r3_rom3_start.o
	echo $(@)
	$(LD) $(KERNEL_ASM_OBJ) unix99r3_romctl.o unix99r3_rom3_start.o $(LIB_PATH) $(KERNEL_LIBS) $(KERNEL_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2CART) $(@) $(subst .elf,.bin,$(@))

# build recipes for programs

$(adduser): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) adduser.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(basic): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) basic.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(basic_ex): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) basic_ex.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(bitmap_1): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) bitmap_1.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(bitmap_2): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) bitmap_2.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(bitmap_3): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) bitmap_3.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(bye): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) bye.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(cat): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) cat.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(catb): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) catb.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(cd): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) cd.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(chris): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) chris.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(clear): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) clear.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(color): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) color.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(comp): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) comp.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(cp): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) cp.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(cut): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) cut.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(date): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) date.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(df): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) df.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(diff): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) diff.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(display): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) display.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(double): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) double.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(dsr): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) dsr.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(echo): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) echo.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(exit): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) exit.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(file_bin): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) file_bin.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(file_bin2): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) file_bin2.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(file_bl): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) file_bl.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(file_bseq): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) file_bseq.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(file_k): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) file_k.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(file_text): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) file_text.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(files): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) files.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(fontload): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) fontload.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(free): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) free.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(gets): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) gets.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(grep): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) grep.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(groff): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) groff.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(head): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) head.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(hello): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) hello.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(hexdump): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) hexdump.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(id): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) id.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(imagedraw): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) imagedraw.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(images): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) images.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(launchd): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) launchd.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(life): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) life.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(login): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) login.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(logout): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) logout.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(long): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) long.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(longtest): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) longtest.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(lp): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) lp.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(ls): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) ls.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(malloc): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) malloc.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(man): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) man.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(missile): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) missile.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(mkdir): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) mkdir.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(more): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) more.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(mouse): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) mouse.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(ms_drv): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) ms_drv.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(mv): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) mv.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(pacman): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) pacman.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(passwd): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) passwd.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(pi): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) pi.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(pio): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) pio.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(pwd): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) pwd.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(reboot): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) reboot.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(rm): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) rm.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(rmdir): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) rmdir.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(rmuser): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) rmuser.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(sh): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) sh.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(shmcreate): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) shmcreate.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(shmreader): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) shmreader.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(shmremove): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) shmremove.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(shmmgr): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) shmmgr.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(shutdown): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) shutdown.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(sort): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) sort.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(sound): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) sound.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(speech): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) speech.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(sprite): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) sprite.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(sptest): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) sptest.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(sramtest): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) sramtest.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(stat): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) stat.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(tail): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) tail.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(tee): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) tee.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(test): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) test.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(textfmt): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) textfmt.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(tmatrix): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) tmatrix.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(touch): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) touch.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(uname): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) uname.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(unix99logo): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) unix99logo.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(vi): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) vi.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(wc): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) wc.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

$(xkb_drv): $(PROGRAM_ASM_OBJ) $(LIB_TRAMPOLINE) $(LIB_COMMON) xkb_drv.o
	echo ${@}
	$(LD) $(PROGRAM_ASM_OBJ) $(subst .elf,.o,$(notdir ${@})) $(LIB_PATH) $(PROGRAM_LIBS) $(PROGRAM_LD_FLAGS) -o $(@) > $(subst .elf,.map,$(@))
	$(ELF2PROGRAM) $(@) $(subst .elf,.bin,$(@))
	$(C2UBIN) -exec $(subst .elf,.bin,$(@)) $(subst .elf,.c2ubin,$(@))

# define dependency for the kernel method mappings for all trampoline code

# $(LIB_TRAMPOLINE_C_OBJS): include/private/kernel_private.h

# define build rules for C objects

%.o: %.c
	echo $<
	$(CC) $(C_FLAGS) $(INC_PATH) -c $< -o $@

# define build rules for ASM objects

%.o: %.asm
	echo $<
	$(GAS) $< -o $@

# Recipe to clean all compiled objects

clean:
	-rm *.o
	-rm lib/*/*.o
	-rm $(BUILD_DIR)/*.a
	-rm $(BUILD_DIR)/*.elf
	-rm $(BUILD_DIR)/*.bin
	-rm $(BUILD_DIR)/*.map
	-rm $(BUILD_DIR)/*.c2ubin
