Files
Cody Boone Ferguson 5455784566 Truly complete 2024/ferguson1 and litmus test
The truly complete part is a reference to commit
ad622a5354. This also means that prog.c
need never be updated again, which was the entire point of that commit
that fell just short of the mark.

Fixed links in obfuscation.html.

Added litmus test to explain how I actually tested the program with all
the jumps.

Fixed typo in data file that I discovered during the above litmus test.

Fixed other files as well.

The .entry.json had a minor mod too, to better reflect what a file
actually is.

Rebuilt obfuscation.html and index.html.

Added target to Makefile which was also used during testing (this might
be explained in the obfuscation.html).
2025-08-18 08:50:37 -07:00

431 lines
13 KiB
Makefile

#!/usr/bin/env make
#
# 2024/ferguson1
#############################
# shell used by this Makefile
#############################
SHELL= bash
#######################
# common tool locations
#######################
include ../../var.mk
#####################
# C compiler settings
#####################
# Common C compiler warnings to silence
#
# Example: CSILENCE= -Wno-poison-system-directories
#
CSILENCE= -Wno-strict-prototypes -Wno-implicit-fallthrough -Wno-misleading-indentation
# Attempt to silence unknown warning options
#
CUNKNOWN= -Wno-unknown-warning-option
# Common C compiler warning flags
#
# NOTE: The addition of -pedantic to CWARN is a challenge that
# You may wish to avoid if it proves too problematic.
# There is NO penalty for removing -pedantic from CWARN.
#
CWARN= -Wall -Wextra -pedantic ${CSILENCE} ${CUNKNOWN}
# Compiler standard
#
CSTD= -std=gnu17
# Compiler bit architecture
#
# Example for 32-bitness: ARCH= -m32
# Example for 64-bitness: ARCH= -m64
#
# NOTE: Normally one should NOT specify a specific architecture.
#
ARCH=
# Defines that are needed to compile
#
# The DATA define not here is primarily for portability with emojis so it's
# defined in the respective rules. It amounts to either "data" or "data.asc" (or
# "data.scrnshot") and is a data file to open.
#
CDEFINE= -DBLOCKSIZE=1663
# Include files that are needed to compile
#
# Example: CINCLUDE= -include stdio.h
#
CINCLUDE=
# Other flags to pass to the C compiler
#
# Example: COTHER= -fno-math-errno
#
COTHER=
# Optimization
#
# NOTE: Feel free to change the level of compiler optimization.
# The "-O3" is just a friendly default you might wish to try.
#
# Example: OPT= -O0 -g
#
OPT= -O3
# Default flags for ANSI C compilation
#
CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${COTHER} ${OPT}
# Libraries needed to build
#
# Example: LDFLAGS= -lncurses -lm
#
LDFLAGS=
# C compiler to use
#
# NOTE: The IOCCC Judges recommend you leave CC as just "cc"
# and NOT set it to clang, or gcc, or something else
# unless you have a STRONG reason to do so.
#
# Setting CC to something other than "cc" makes your
# code less portable to those who do not have your
# particular C compiler. **hint**
#
# If you want to test your code with a particular C compiler,
# use the make command line. For example:
#
# make all CC=clang
# make all CC=gcc
#
CC= cc
# Compiler add-ons or replacements for clang only
#
ifeq "$(findstring $(CLANG),${CC})" "$(CLANG)"
#
# NOTE: This code is only invoked when CC is "clang"
# such as when you use the make command line:
#
# make all CC=clang
#
CSILENCE+= -Wno-missing-prototypes -Wno-poison-system-directories -Wno-switch-default \
-Wno-format-nonliteral -Wno-implicit-fallthrough \
-Wno-misleading-indentation -Wno-missing-variable-declarations \
-Wno-shorten-64-to-32 -Wno-unreachable-code -Wno-unsafe-buffer-usage
#
CWARN+= -Weverything
#
endif
# Specific add-ons or replacements for gcc only
#
ifeq "$(findstring $(GCC),${CC})" "$(GCC)"
#
# NOTE: This code is only invoked when CC is "gcc"
# such as when you use the make command line:
#
# make all CC=gcc
#
CSILENCE+=
#
CWARN+=
#
endif
###########################################
# Special Makefile variables for this entry
###########################################
ENTRY= prog
PROG= ${ENTRY}
#
OBJ= ${PROG}.o
TARGET= ${PROG} ${PROG}.asc ${PROG}.scrnshot
# .alt is as above more events
#
ALT_OBJ= ${PROG}.alt.o ${PROG}.alt.asc.o ${PROG}.alt.scrnshot.o \
${PROG}.alt2.o ${PROG}.alt2.asc.o ${PROG}.alt2.scrnshot.o
ALT_TARGET= ${PROG}.alt ${PROG}.alt.asc ${PROG}.alt.scrnshot \
${PROG}.alt2 ${PROG}.alt2.asc ${PROG}.alt2.scrnshot
# The following notes were provided by the author in his Makefile:
#
# Don't include data, data.asc or data.scrnshot.
# The data rule (although it's better to use makedata the data rule might work -
# or it might not) is needed.
#
# The build of the programs use make padding however.
#
# I discuss the data files in obfuscation.md in more detail and I also mention
# them in remarks.md (to do with troubleshooting and notes to the judges).
#
# As I noted in the remarks.md you should always make sure to rebuild them if
# there is some kind of error: basically a pre-process for the code. No issues
# have occurred since I added the build of the data files in the build of the
# program but it is theoretically possible.
#
# It isn't always necessary to build the data files but when developing it was
# VERY necessary hence all the protections in place (and the discussion in the
# remarks.md). In any event the data files are built at build time so they
# should not be in this variable.
#
# Observe too that the rules to compile programs do NOT depend on the data rule
# and also do not depend on DATA (most anyway if not all). This is to help
# prevent the programs being compiled every time the data files are updated.
#
DATA= data.src data.asc.src data.scrnshot.src
#################
# build the entry
#################
all: data ${TARGET}
@${TRUE}
.PHONY: all alt data everything clean clobber test
# how to compile
#
${PROG}: ${PROG}.c
${MAKE} padding
${CC} ${CFLAGS} -DDATA='"data"' ${PROG}.c -o $@ ${LDFLAGS}
# test rule to make sure that no string in the data files are >= the blocksize
# and the ASCII only data file does not have multibyte characters (or at least
# 2, 3 or 4 bytes - unsure if more bytes in a single character is possible).
#
# The compilation rules use this to make sure there are no problems and it will
# exit non-zero if there is any issue thus preventing the build of the specific
# program.
#
test: lencount mbcheck
@./lencount -t -i data.src
@./lencount -t -i data.asc.src
@./lencount -t -i data.scrnshot.src
@./mbcheck
# ASCII only version of entry code, hence why the DATA macro is defined
# here, not in CDEFINE.
#
${PROG}.asc: ${PROG}.c
${MAKE} padding
${CC} ${CFLAGS} -DDATA='"data.asc"' ${PROG}.c -o $@ ${LDFLAGS}
# screenshot friendly version
#
${PROG}.scrnshot: ${PROG}.c
${MAKE} padding
${CC} ${CFLAGS} -DDATA='"data.scrnshot"' ${PROG}.c -o $@ ${LDFLAGS}
# for testing purposes of prog.gotos.c - part of the enhanced litmus test
${PROG}.gotos: ${PROG}.gotos.c
${MAKE} padding
${CC} ${CFLAGS} -DDATA='"data"' ${PROG}.gotos.c -o $@ ${LDFLAGS}
# this tool creates the data files (emoji and ASCII only versions).
#
# The warnings disabled are unfortunate. One is actually an extra sanity check
# in case the exit(1); call was removed by mistake.
#
addpadding: addpadding.c
${CC} ${CFLAGS} -Wno-unreachable-code-break -Wno-sign-conversion addpadding.c -o $@ ${LDFLAGS}
# this tool is the first step in helping some of the other tools work, as a
# pre-processor. This tool is used in the makedata.sh script which is also a
# pre-processor and must happen if the data source files are updated (which
# should really only be done by me, the author, as I'm the only one who knows
# precisely how it works and how perilous it can be to edit).
#
bytecount: bytecount.c
${CC} ${CFLAGS} -Wno-unreachable-code-break bytecount.c -o $@ ${LDFLAGS}
# this tool helped verify the locations of strings were correct (locations
# are based on the blocksize). The bytecount also helped.
#
bytetest: bytetest.c
${CC} ${CFLAGS} bytetest.c -o $@ ${LDFLAGS}
# similar to bytecount but it doesn't print out the location and it also parses
# the file without caring about the NUL bytes (see if you can figure that out)
#
byteread: byteread.c
${CC} ${CFLAGS} byteread.c -o $@ ${LDFLAGS}
# this tool was earlier used to help in identifying any emojis in the ASCII only
# version that might have slipped through (however, mbcheck is a better one: this tool is still
# useful however). Mostly provided for the judges but I, the author, included
# most of the tools (most of which are meant only for the judges as well).
#
bytecheck: bytecheck.c
${CC} ${CFLAGS} -Wno-unreachable-code-break bytecheck.c -o $@ ${LDFLAGS}
# by default this checks for multibyte characters (well 2, 3, 4) in the ASCII
# data source file, reporting if any are found. If any are found it will report
# which string so it can be fixed. This is used as part of the build process,
# and if any are found it will fail to compile (or it should).
#
mbcheck: mbcheck.c
${CC} ${CFLAGS} -Wno-unreachable-code-break mbcheck.c -o $@ ${LDFLAGS}
# prints the strings in the data file for visual inspection. This could be
# useful to check if your system supports all the emojis, although obviously
# you'll need some sort of scrollback (or use less, perhaps with -r/-R - or
# possibly redirect to a file if that is equivalent but if it is you could just
# look at the strings.*loc.txt files).
#
printer: printer.c
${CC} ${CFLAGS} -Wno-unreachable-code-break printer.c -o $@ ${LDFLAGS}
# counts number of strings in data file and returns the longest one. Used in
# calculating the blocksize (originally). It also warns about strings that are
# >= the BLOCKSIZE in length. >= because we need the NUL byte too! With -t it
# exits 666 if the blocksize is breached by a string.
#
lencount: lencount.c
${CC} ${CFLAGS} -Wno-unreachable-code-break lencount.c -o $@ ${LDFLAGS}
# The author provided these notes in his Makefile:
#
# IMPORTANT NOTES FOR THE JUDGES.
#
# The makedata.sh script will generate files that are needed by some of the
# extra tools that I had to write and those tools should in general not be
# needed by most. I include them to be complete and so you can see my very
# thorough and careful design.
#
# The addpadding.c is necessary but it does not depend on makedata.sh and in
# fact makedata.sh uses it.
#
# The addpadding tool ALWAYS updates all three data files, assuming the source
# files exist of course; if they don't then obviously there is an error but as I
# provide them this should not happen unless the Devil has visited you in the
# night (in which case you might want to be worried, very worried, that
# something might happen! :-) - maybe declare it a winner to satisfy the Devil?
# :-) Okay joking aside you get the idea: this should not happen as the source
# files and this tool are included.
#
# When in doubt, make sure the right data file is used (the different compiled
# binaries based on the DATA macro) and that it was created by addpadding.c! And
# do make sure you use the right version of addpadding.c - this submission does
# NOT encrypt the data and the other one does! In fact there is an explicit
# comment in addpadding.c about this.
#
padding: addpadding test
@echo "Creating data file..."
./addpadding
@echo "Done."
# The author provided these remarks in his Makefile:
#
# see remarks.md for more details. This script is mostly useful for the some of
# the other tools but it can be used for prog.c and prog.alt.c (and prog.alt2.c
# which is the originally submitted code but with a minor bug fix - prog.alt.c
# was already taken) indirectly as it also does build the data files from the
# source files.
#
# An example use of when I personally use this rule: when I actually make an
# edit to the data source files. As you will probably have noticed the printer.c
# and bytetest.c tools depend on V.c and makedata.sh creates it so I have those
# tools use that script too.
#
makedata: makedata.sh
./makedata.sh
# alternative executable
#
alt: data ${ALT_TARGET}
@${TRUE}
# Devil's Cut: extra events that couldn't fit in the prog.c (alas!)
#
# As noted the DATA macro is for portability.
#
${PROG}.alt: ${PROG}.alt.c
${MAKE} padding
${CC} ${CFLAGS} -DDATA='"data"' ${PROG}.alt.c -o $@ ${LDFLAGS}
# ASCII only version of alt code (Devil's Cut above). This is why indeed the
# DATA variable is not in the CDEFINE - the .asc versions use the data.asc file.
#
${PROG}.alt.asc: ${PROG}.alt.c
${MAKE} padding
${CC} ${CFLAGS} -DDATA='"data.asc"' ${PROG}.alt.c -o $@ ${LDFLAGS}
# screenshot friendly version of alt code
#
${PROG}.alt.scrnshot: ${PROG}.alt.c
${MAKE} padding
${CC} ${CFLAGS} -DDATA='"data.scrnshot"' ${PROG}.alt.c -o $@ ${LDFLAGS}
# For practical reasons, the author submitted code that was not as full of gotos
# as he had in mind. After the win he decided to add it to the repo. But since
# there was already an alt.c file this original code, which has a minor bug fix,
# is in .alt2.c.
#
# Original submitted code with a minor bug fix
#
${PROG}.alt2: ${PROG}.alt2.c
${MAKE} padding
${CC} ${CFLAGS} -DDATA='"data"' ${PROG}.alt2.c -o $@ ${LDFLAGS}
# Original submitted code with a minor bug fix - ASCII only version
#
${PROG}.alt2.asc: ${PROG}.alt2.c
${MAKE} padding
${CC} ${CFLAGS} -DDATA='"data.asc"' ${PROG}.alt2.c -o $@ ${LDFLAGS}
# Original submitted code with a minor bug fix - screenshot friendly version
#
${PROG}.alt2.scrnshot: ${PROG}.alt2.c
${MAKE} padding
${CC} ${CFLAGS} -DDATA='"data.scrnshot"' ${PROG}.alt2.c -o $@ ${LDFLAGS}
# data files
#
data: ${DATA}
@${TRUE}
# both all and alt
#
everything: all alt
@${TRUE}
###############
# utility rules
###############
#
clean:
${RM} -f ${OBJ} ${ALT_OBJ}
clobber: clean
${RM} -f ${TARGET} ${ALT_TARGET}
${RM} -rf *.dSYM
${RM} -rf ${TARGET} addpadding bytetest byteread bytecount printer lencount bytecheck mbcheck data data.asc data.scrnshot
######################################
# optional include of 1337 hacker rulz
######################################
-include 1337.mk ../1337.mk ../../1337.mk