CFLAGS = -Wall -std=gnu99
CXXFLAGS = -Wall -O -std=c++11

#CC_BARE_ARM = $(HOME)/.arduino15/packages/SparkFun/tools/arm-none-eabi-gcc/8-2018-q4-major/bin/arm-none-eabi-gcc
CC_BARE_ARM = $(CC_ARM)
CC_BARE_ARM_OPTS = -Os -fdata-sections -ffunction-sections -fmessage-length=0 -fomit-frame-pointer -funsigned-char -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb
CC_ARM = arm-linux-gnueabi-gcc
CC_ARM_OPTS = -static
# This is kind of a cheat, basically to allow me to CC_ARM64=cc on my cellphone.
CC_ARM64 = aarch64-linux-gnu-gcc-12 -static

CSC = csc			# Chicken Scheme compiler

all: patron_test metahello propfont.ppm puzzle3 puzzle4 rpncalc decimaltest
ritmo: ritmo.c testritmo.c
patron_test: patron.c patron_test.c patron.h
vocoder: vocoder.c /usr/lib/i386-linux-gnu/libm.so
metahello: metahello.jar
	(echo "#!/usr/bin/java -jar"; cat $<) > $@
	chmod 755 $@
metahello.jar: tmp/dev3/MetaHello.class
	jar -cvfe metahello.jar dev3.MetaHello -C tmp .
runhellogl: hellogl
	./$<
GLC = cc $(CFLAGS) $< -lglut -lGLU -o $@
hellogl: hellogl.c
	$(GLC)
propfont.png: propfont
	time ./$< | pnmtopng > $@
bropetest: brope.ml bropetest.ml
	ocamlopt -g brope.ml bropetest.ml -o bropetest
testbrope: bropetest
	./$<
ssehi: ssehi.c
	$(CC) $(CFLAGS) $< -o $@
propfont: propfont.c
	cc -g -O -Wall -Werror -std=gnu99 propfont.c -o propfont
testpropfont: propfont
	time ./$< > propfont.ppm
xputimage: xputimage.c
	cc -Wall -Werror -std=gnu99 $< -o $@ -lX11
rasterize: rasterize.c
	cc -Wall -Werror -std=gnu99 $< -o $@ -lX11
puzzle3: puzzle3.c
	$(CC) -std=gnu99 $< -o $@
puzzle4: puzzle4.c
	$(CC) -std=gnu99 $< -o $@
rpncalc: rpncalc.c rpncalc_linux.c rpncalc.h decimal.c decimal.h
	$(CC) rpncalc.c rpncalc_linux.c decimal.c -o $@
decimaltest: decimaltest.c decimal.c decimal.h
	$(CC) decimaltest.c decimal.c -o $@
leveldb-62m: leveldb-62m.cc
	$(CXX) $(CXXFLAGS) $< -o $@ -lleveldb
fib: fib.c
	$(CC) -O5 -fomit-frame-pointer $< -o $@
zmqhello: zmqhello.c
	$(CC) -Wall -Werror -g -std=gnu99 $< -o $@ -lzmq
zmqhelloclient: zmqhelloclient.c
	$(CC) -Wall -Werror -g -std=gnu99 $< -o $@ -lzmq
zmqpushn: zmqpushn.c
	$(CC) -O -Wall -Werror -g -std=gnu99 $< -o $@ -lzmq
zmqpulln: zmqpulln.c
	$(CC) -O -Wall -Werror -g -std=gnu99 $< -o $@ -lzmq
sweetdreams-c++: sweetdreams-c++.cc
	$(CXX) -O -Wall -Werror -g -std=c++11 $< -o $@ -lm # -Weffc++
sweetdreamstest: sweetdreams-c++
	./$< | play -t raw -r 48000 -s -b 16 -L -c 2 -

# Build and run a FASL file with SBCL.  Execution takes about 9ms.
# The :output-file option is unnecessary in this case since the output
# file has the default name.
hello.fasl: hello.lisp
	sbcl --eval '(compile-file "$<" :output-file "$(basename $@)")' --eval '(quit)'
hellolisp: hello.fasl
	sbcl --noinform --eval '(load "$<")'

fibtiles: fibtiles.c ppmp6.c ppmp6.h
	$(CC) $(CFLAGS) fibtiles.c ppmp6.c -o $@
fibword: fibword.c ppmp6.c ppmp6.h
	$(CC) $(CFLAGS) fibword.c ppmp6.c -o $@
thuemorse: thuemorse.c ppmp6.c ppmp6.h
	$(CC) $(CFLAGS) thuemorse.c ppmp6.c -o $@
popcnt: popcnt.c ppmp6.c ppmp6.h
	$(CC) $(CFLAGS) popcnt.c ppmp6.c -o $@
weave: weave.c ppmp6.c ppmp6.h
	$(CC) $(CFLAGS) weave.c ppmp6.c -o $@
xshmu: xshmu.c xshmu.h
	$(CC) $(CFLAGS) -O $< -lX11 -lXext -o $@
admu: admu_tv_typewriter.c admu.c xshmu.c xshmu.h admu.h
	$(CC) $(CFLAGS) -O admu_tv_typewriter.c admu.c xshmu.c -lX11 -lXext -o $@
admu_shell: admu_shell.c admu.c xshmu.c xshmu.h admu.h
	$(CC) $(CFLAGS) -O admu_shell.c admu.c xshmu.c -lX11 -lXext -o $@
hello.jar: hello.kt
	kotlinc $< -include-runtime -d $@
kotlin-hello: hello.jar
	java -jar $<
swinghello.jar: swinghello.kt
	kotlinc $< -include-runtime -d $@
kotlin-swing-hello: swinghello.jar
	java -jar $<
java-swing-hello: HelloWorldSwing.class
	java HelloWorldSwing
%.class: %.java
	javac $<
wercaμ: wercaμ.c xshmu.c xshmu.h
	$(CC) $(CFLAGS) -O -o $@ wercaμ.c xshmu.c -lX11 -lXext
vecalpha: vecalpha.c
	$(CC) $(CFLAGS) -O -msse4.2 -o $@ $<
chifir_xshmu: chifir.c xshmu.c chifir_xshmu.c xshmu.h chifir.h
	$(CC) $(CFLAGS) -o $@ chifir.c xshmu.c chifir_xshmu.c -lX11 -lXext
objc-hello: objc-hello.m
	$(OBJC) -Wall $(shell gnustep-config --objc-flags) $< $(shell gnustep-config --base-libs) -o $@
xshmunch: xshmunch.c xshmu.c xshmu.h
	$(CC) $(CFLAGS) -o $@ xshmunch.c xshmu.c -lX11 -lXext
μpaint: μpaint.c xshmu.c xshmu.h
	$(CC) $(CFLAGS) -o $@ μpaint.c xshmu.c -lX11 -lXext
xshmu_hello: xshmu_hello.c xshmu.c xshmu.h
	$(CC) $(CFLAGS) -o $@ xshmu_hello.c xshmu.c -lX11 -lXext
tetris: tetris.c xshmu.c xshmu.h
	$(CC) $(CFLAGS) -o $@ tetris.c xshmu.c -lX11 -lXext
tetris_fb: tetris.c xshmu_fb.c xshmu.h
	$(CC) $(CFLAGS) -o $@ tetris.c xshmu_fb.c
xshmunch_fb: xshmunch.c xshmu_fb.c xshmu.h
	$(CC) $(CFLAGS) -o $@ xshmunch.c xshmu_fb.c
wercaμ_fb: wercaμ.c xshmu_fb.c xshmu.h
	$(CC) $(CFLAGS) -O -o $@ wercaμ.c xshmu_fb.c
admu_shell_fb: admu_shell.c admu.c xshmu_fb.c xshmu.h admu.h
	$(CC) $(CFLAGS) admu_shell.c admu.c xshmu_fb.c -o $@
glyphed: glyphed.c xshmu.c xshmu.h
	$(CC) $(CFLAGS) glyphed.c xshmu.c -o $@ -lX11 -lXext
oscope: oscope.c xshmu.c xshmu.h
	$(CC) $(CFLAGS) oscope.c xshmu.c -o $@ -lX11 -lXext
oscope_fb: oscope.c xshmu_fb.c xshmu.h
	$(CC) $(CFLAGS) oscope.c xshmu_fb.c -o $@
xshmucalc: xshmucalc.c rpncalc.c decimal.c xshmu.c rpncalc.h xshmu.h decimal.h
	$(CC) $(CFLAGS) -Os xshmucalc.c xshmu.c rpncalc.c decimal.c -o $@ -lX11 -lXext
xshmucalc_fb: xshmucalc.c rpncalc.c decimal.c xshmu_fb.c rpncalc.h xshmu.h decimal.h
	$(CC) $(CFLAGS) -Os xshmucalc.c xshmu_fb.c rpncalc.c decimal.c -o $@
vpng: vpng.c xshmu.c xshmu.h
	$(CC) $(CFLAGS) vpng.c xshmu.c -o $@ -lpng -lX11 -lXext
vpng_fb: vpng.c xshmu_fb.c xshmu.h
	$(CC) $(CFLAGS) vpng.c xshmu_fb.c -o $@ -lpng
makefont: makefont.c vpng.c xshmu.c xshmu.h
	$(CC) $(CFLAGS) makefont.c vpng.c xshmu.c -o $@ -lpng -lX11 -lXext
xshmu_progs: μpaint xshmunch chifir_xshmu wercaμ xshmu admu admu_shell xshmu_hello tetris tetris_fb xshmunch_fb wercaμ_fb admu_shell_fb glyphed oscope oscope_fb xshmucalc xshmucalc_fb vpng vpng_fb makefont
forkovh: forkovh.c
	$(CC) $(CFLAGS) -O $< -o $@
binout: binout.s
	cc -nostdlib -g binout.s -o binout
server: server.s
	gcc -no-pie -Wl,-z,noseparate-code -m32 -nostdlib server.s -o server.bloated
	objcopy -S -R .note.gnu.build-id server.bloated server
testexpr: expr
	./testexpr.sh "$<"
qfitzah: qfitzah.s
	gcc -Wl,-z,noseparate-code -static -g -m32 -nostdlib qfitzah.s -o qfitzah.bloated
	objcopy -S -R .note.gnu.build-id qfitzah.bloated qfitzah
dump_qfitzah: qfitzah
	while read line; do echo "$$line"; sleep 0; done < example.qf1 | ./qfitzah
	objdump -d qfitzah.bloated
	ls -l qfitzah
	size -B qfitzah
cbrttest: cbrttest.o floatcbrt.o
	$(CC) $(LDFLAGS) cbrttest.o floatcbrt.o -lm -o $@
fontrend: fontrend.c
	$(CC) $(CFLAGS) $(LDFLAGS) -I../bubbleos/yeso -L../bubbleos/yeso $< -o $@ -lyeso-xlib -lX11 -lXext
emjshi.html: emjshi.c
	time docker run --rm -v "$$PWD":/src -u "$$(id -u):$$(id -g)" emscripten/emsdk emcc -O -g $< -o $@
thumbhello: thumbhello.s
	arm-linux-gnueabi-gcc-10 $< -static -o $@

hadixmv.o: hadixmv.S
	$(CC_BARE_ARM) -c -Wall $(CC_BARE_ARM_OPTS) $<
callhadixmv: callhadixmv.c hadixmv.o
	$(CC_ARM) $(CC_ARM_OPTS) -Wall callhadixmv.c hadixmv.o -o $@

coblocks.o: coblocks.S
	$(CC_BARE_ARM) -c -Wall $(CC_BARE_ARM_OPTS) $<
callcoblocks: callcoblocks.c coblocks.o
	$(CC_ARM) $(CC_ARM_OPTS) -Wall callcoblocks.c coblocks.o -o $@

einkornix.o: einkornix.S
	$(CC_BARE_ARM) -g -c -Wall $(CC_BARE_ARM_OPTS) $<
einkornix-test: einkornix-test.c einkornix.o einkornix.h
	$(CC_ARM) $(CC_ARM_OPTS) -g -Wall einkornix-test.c einkornix.o -o $@

monokokko: monokokko.S
	$(CC_ARM) $(CC_ARM_OPTS) -g -Wall -nostdlib -static $< -o $@

jitme.o: jitme.S
	$(CC_BARE_ARM) -c -Wall $(CC_BARE_ARM_OPTS) $<
jitme.bin: jitme.o
	arm-linux-gnueabi-objcopy -O binary $< $@
disassemble-jitme.bin: jitme.bin
	arm-linux-gnueabi-objdump -b binary -mcortex-m4 -Mforce-thumb -D $<
calljitme: jitme.o calljitme.c
	$(CC_ARM) $(CC_ARM_OPTS) -Wall calljitme.c jitme.o -o $@

dumprandomcrap: randomcrap.S
	$(CC_BARE_ARM) -g -c -Wall $(CC_BARE_ARM_OPTS) -o randomcrap.o $<
	arm-linux-gnueabi-objdump -d randomcrap.o | expand
	arm-linux-gnueabi-objdump -s randomcrap.o | expand

callnullcomplr: nullcomplr
	./$<

nullcomplr: nullcomplr.c
	$(CC_ARM) $(CC_ARM_OPTS) -Wall $< -o $@

dumbjit: dumbjit.c jitstub.S
	$(CC_ARM) $(CC_ARM_OPTS) -g -Wall dumbjit.c jitstub.S -o $@

dict: dict.c
	$(CC) $(CFLAGS) -static -g $< -o $@ -lbsd

# This requires PARI/GP to be installed.
pari-hello: pari-hello.c
	$(CC) $(CFLAGS) -g $< -o $@ -lpari

armtetris: tetris.S
	$(CC_ARM) $(CC_ARM_OPTS) -g -nostdlib -static $< -o $@

findcuit: findcuit.c
	$(CC) $(CFLAGS) -O5 -fomit-frame-pointer -pthread $< -o $@

include smolhershey.mk

r3cts_test.o: r3cts_test.c r3cts.h
r3ctspeed: r3ctspeed.c
	$(CC) -O5 $(CFLAGS) $< -o $@

brutewave.o: brutewave.c
	$(CC) -c -O5 $(CFLAGS) $< -o $@

brutewave: brutewave.o
	$(CC) $(LDFLAGS) $< -lm -o $@

div0: div0.o
	$(CC) $(LDFLAGS) $< -lm -o $@

test_dumbsort: dumbsort.S test_dumbsort.c
	$(CC) -g $(LDFLAGS) $^ -o $@

test-dumbsort: test_dumbsort
	./$<
	./$< inssort
	./$< gnomesort

supermercado: supermercado.cc
	$(CXX) $(CXXFLAGS) -g -O0 -std=c++20 $< -o $@

hipermercado: hipermercado.cc
	$(CXX) $(CXXFLAGS) -g -O0 -std=c++20 $< -o $@

findcset: findcset.cc
	$(CXX) $(CXXFLAGS) -g -O0 -std=c++20 $< -o $@

ae: ae.c
	$(CC) $(CFLAGS) -O $< -o $@ -lncurses

sumnums: sumnums.c diter_sum.S
	$(CC) $(CFLAGS) -g -O $^ -o $@

demodll.exe: demodll.cs
	mcs $<

libt4d.so: t4d.c
	$(CC) $(CFLAGS) -shared $< -o $@

test-demodll: demodll.exe libt4d.so
	./$<

l2prox: l2prox.c
	$(CC) $(CFLAGS) $(LDFLAGS) $< -lm -o $@

editline: editline.c scbreak.c scbreak.h
	$(CC) $(CFLAGS) -g -O editline.c scbreak.c -o $@

docentes: docentes.cc
	$(CXX) $(CXXFLAGS) -std=c++14 $< -o $@

# See
# <https://stackoverflow.com/questions/43367427/32-bit-absolute-addresses-no-longer-allowed-in-x86-64-linux>:
# “Disable PIE mode to make 32-bit absolute addressing work”.  In this
# case -fno-pie isn’t needed because this is the linker command line;
# if we needed it, we’d need it when compiling intcountst.c to
# intcountst.o.
intcountst: intcounts.o intcountst.o
	$(CC) $(CFLAGS) $(LDFLAGS) -no-pie $^ -o $@

hadamardsin: hadamardsin.o kmregion.o
	$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@

memcpycost: memcpycost.c
	$(CC) $(CFLAGS) $(LDFLAGS) -O $^ -o $@

minop.o: minop.S
	riscv64-linux-gnu-gcc -c -o $@ $<

minop: testminop.c minop.o
	riscv64-linux-gnu-gcc -static -o $@ $^

testminop: minop
	./minoptests

kmregion_example: kmregion_example.o kmregion.o
	$(CC) -O $(CFLAGS) $(LDFLAGS) $^ -o $@

kmregion_example.o: kmregion_example.c kmregion.h
	$(CC) -O -g -c $(CFLAGS) $(LDFLAGS) $<

quicksort.o: quicksort.S
	$(CC_ARM) -c -g $<

quicksort_test: quicksort_test.c quicksort.o
	$(CC_ARM) -g -static $^ -o $@

test_quicksort: quicksort_tests quicksort_test
	./$<

kawaii: kawaii.scm
	$(CSC) $<

6rammar: 6rammar.scm
	$(CSC) $<  # may require chicken-install -s srfi-69

perstriemap: perstriemap.c kmregion.o
	$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@

linhash: linhash.c
	$(CC) $(CFLAGS) $(LDFLAGS) -O $^ -o $@

hashtrie: hashtrie.c
	$(CC) $(CFLAGS) $(LDFLAGS) -O $^ -o $@

justhash: justhash.c
	$(CC) $(CFLAGS) $(LDFLAGS) -O $^ -o $@

justcount: justcount.c
	$(CC) $(CFLAGS) $(LDFLAGS) -O $^ -o $@

tablecount: tablecount.c
	$(CC) $(CFLAGS) $(LDFLAGS) -O $^ -o $@

tablecount2: tablecount2.c count_words_asm.o
	$(CC) $(CFLAGS) $(LDFLAGS) -O $^ -o $@

imlacpress: imlacpress.c
	$(CC) $(CFLAGS) $(LDFLAGS) -Os $^ -o $@ -lz

screditc.o: screditc.c
	$(CC_ARM) -Os -mthumb -mcpu=cortex-m4 -c -g $<

scredit.o: scredit.S
	$(CC_ARM) -c -g $<

bgraify: bgraify.c
	$(CC) $(CFLAGS) $(LDFLAGS) -O $^ -o $@

iterfib.o: iterfib.S
	$(CC_ARM) -c -g $^

testiterfib: testiterfib.c iterfib.o
	$(CC_ARM) -g -static $^ -o $@

findnumtest: findnum.c findnumtest.c
	$(CC) $(CFLAGS) $(LDFLAGS) -O -Dfind=findnum $^ -o $@

testfindnum: findnumtest
	./$<

# vaddvq_u32, the horizontal vector sum operation, apparently doesn’t
# exist in 32-bit ARMs, just ARM64.  vaddq_u302 does, but it’s a
# vertical add.
neonsearchtest: neonsearch.c findnumtest.c
	$(CC_ARM64) $(CFLAGS) $(LDFLAGS) -Os $^ -o $@

testneonsearch: neonsearchtest
	./$<

syscallovh: syscallovh.c
	$(CC) $(CFLAGS) $(LDFLAGS) -O $^ -o $@

uniqueid-c++: uniqueid.cc uniqueidtest.o
	$(CXX) $(CXXFLAGS) $(LDFLAGS) -O5 $^ -o $@

uniqueid-asm: uniqueid.S uniqueidtest.o
	$(CXX) $(CXXFLAGS) $(LDFLAGS) -O5 $^ -o $@

uniqueid-comparison: uniqueid-c++ uniqueid-asm
	time ./uniqueid-c++
	time ./uniqueid-asm

pingpongpipe: pingpongpipe.c
	$(CC) $(CFLAGS) $(LDFLAGS) -O $^ -o $@

exit42: exit42.S
	$(CC) -nostdlib -static $< -o $@
