fix Makefile README.md for 2001/herrmann2

This commit is contained in:
Landon Curt Noll committed 2023-03-17 15:20:06 -07:00
1 parent bad0cd868f
commit 83ff856bc9
2 files changed
+401 -308

No files matched your search

+261 -169
View File
@@ -1,18 +1,9 @@
#!/usr/bin/env make
#
# IOCCC 2001 entry Makefile
# IOCCC 2001 winning entry - herrmann2
################################################################################
#
# An Historical Makefile NOTE:
#
# The orig.Makefile, if it exits, is the original Makefile before this IOCCC
# year directory was reworked so that entries are in separate directories.
# This also applies to any orig.ansi.mk and orig.common.mk files.
#
# Several Makefiles were modified / formed in 2022, and as such it may have
# elements that are not historically compatible with way entries were built.
#
# Regarding individual entries:
#
# IOCCC winning entry code may not work on your system. Even with standards,
@@ -45,192 +36,293 @@
# See: http://creativecommons.org/licenses/by-sa/3.0/
SHELL= /bin/sh
CAT= cat
RM= rm
SED= sed
TRUE= true
#CINCLUDE= -I ${HOMEBREW_PREFIX}/include/SDL2
# optimization
#############################
# shell used by this Makefile
#############################
#
# Most compiles will safely use -O2. Some can use only -O.
# A few compilers have broken optimizers and thus you may
# not want anything.
SHELL= bash
#######################
# common tool locations
#######################
#
include ../../var.mk
# Set X11_LIBDIR to the directory where the X11 library resides
#
#X11_LIBDIR= /usr/X11R6/lib
#X11_LIBDIR= /usr/X11/lib
X11_LIBDIR= /opt/X11/lib
# Set X11_INCLUDEDIR to the directory where the X11 include files reside
#
#X11_INCDIR= /usr/X11R6/include
#X11_INCDIR= /usr/X11/include
X11_INCDIR= /opt/X11/include
# Common C compiler warnings to silence
#
#CSILENCE=
CSILENCE= -Wno-implicit-int -Wno-incompatible-pointer-types -Wno-int-to-pointer-cast \
-Wno-parentheses -Wno-shift-op-parentheses -Wno-tautological-compare \
-Wno-unused-comparison -Wno-unused-value
# Common C compiler warning flags
#
#CWARN= ${CSILENCE}
#CWARN= -Wall ${CSILENCE}
CWARN= -Wall -Wextra ${CSILENCE}
#CWARN= -Wall -Wextra -pedantic ${CSILENCE}
# Compiler standard
#
#CSTD=
#CSTD= -ansi
CSTD= -std=gnu99
# Compiler bit architecture
#
# Some entries require 32-bitness:
# ARCH= -m32
#
# Some entries require 64-bitness:
# ARCH= -m64
#
# By default we assume nothing:
#
ARCH=
# Defines that are needed to compile
#
CDEFINE=
#CDEFINE= -DIOCCC
# Include files that are needed to compile
#
#CINCLUDE=
#CINCLUDE= -include stdlib.h
#CINCLUDE= -include stdio.h
CINCLUDE= -include stdlib.h -include stdio.h -include time.h -include unistd.h
#CINCLUDE= -I ${X11_INCDIR} -I ${X11_INCDIR}/X11
#CINCLUDE= `${SDL2_CONFIG} --cflags`
# Optimization
#
# Most compiles will safely use -O2. Some can use only -O1 or -O.
# A few compilers have broken optimizers or this entry make break
# under those buggy optimizers and thus you may not want anything.
# Reasonable compilers will allow for -O3.
#
#OPT=
#OPT= -O
OPT= -O2
#OPT= -O1
#OPT= -O2
OPT= -O3
# flags for ANSI compiles
# Default flags for ANSI C compilation
#
# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode,
# others such as gcc may want -ansi, others (Compaq Tru64 Unix)
# want -std1, and others may want nothing at all.
# Adjust the CFLAGS line as needed.
#
# NOTE: Some compilers cannot optimize, or optimize some entries
# incorrectly. You might want to turn on -O to see if your
# compiler can handle them.
#
#
#CFLAGS= -Xa ${OPT}
#CFLAGS= -std1 $(OPT)
CFLAGS= -ansi ${OPT}
CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT}
# NOTE: On some systems, the library path does not include the location
# of the X11 libraries. You might need to use a -L/path/to/X11/lib/dir
# in order to compile with these libs.
# Libraries needed to build
#
X11CCFLAGS= -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I/usr/include/X11
#X11CCFLAGS=
X11LDFLAGS= -L/usr/X11R6/lib -Wl,-R/usr/X11R6/lib
#X11LDFLAGS=
LIBS=
#LIBS= -lm
#LIBS= -L ${X11_LIBDIR} -lX11
#LIBS= `${SDL2_CONFIG} --libs`
# ANSI compiler
#
# Set CC to the name of your ANSI compiler.
#
# Some entries seem to need gcc. If you have gcc, set
# both CC and MAY_NEED_GCC to gcc.
#
# If you do not have gcc, set CC to the name of your ANSI compiler, and
# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just :
# to disable such programs.
# C compiler to use
#
CC= cc
MAY_NEED_GCC= gcc
#CC=clang
#CC=gcc
# winners that compile under ANSI C
# Compiler add-ons or replacements for clang only
#
WINNERS= anonymous bellard bellard.otccex cheong coupard \
ctk dgbeards herrmann1 herrmann2 jason kev ollinger rosten \
schweikh westley williams
ALT_NAMES= westley.orig
DATA_FILES= anonymous_files bellard_files herrmann1_files herrmann2_files
all: ${WINNERS}
# Most likely to amaze
ifeq ($(CC),clang)
#
anonymous: anonymous.c
magic='${MAY_NEED_GCC} -O1'; \
X='-DA(X)=#X'; \
warning='-pedantic -Dprocessor'; \
$$magic $$warning -Dmagic= $$X "-DX=A($$magic \"$$X\")" \
-o anonymous anonymous.c
anonymous_files: anonymous.ten.c
# Best abuse of the rules
CSILENCE+= -Wno-comma -Wno-extra-semi -Wno-missing-variable-declarations \
-Wno-pedantic -Wno-pointer-arith -Wno-poison-system-directories
#
bellard: bellard.c
${CC} -rdynamic ${CFLAGS} bellard.c -o bellard -ldl
bellard_files: bellard.otccex.c
# Best short program
CWARN+= -Weverything
#
cheong: cheong.c
${CC} ${CFLAGS} cheong.c -o cheong
endif
# Most obfuscated sound
# Specific add-ons or replacements for gcc only
#
coupard: coupard.c
${CC} ${CFLAGS} -o coupard coupard.c
# Worst Driver
ifeq ($(CC),gcc)
#
ctk: ctk.c
${CC} ${CFLAGS} -o ctk ctk.c
# Worst AI
#CSILENCE+=
#
dgbeards: dgbeards.c
${CC} ${CFLAGS} -DE=break -DF=char -DK=case -DP=int -DR=return \
-DI=0xFFFF dgbeards.c -o dgbeards
# Best abuse of the C preprocessor
#CWARN+=
#
herrmann1: herrmann1.c herrmann1.sh
@echo "NOTE: $@ must be built/run using the script $@.sh"
${SHELL} ./herrmann1.sh
endif
herrmann1_files: herrmann1.gcd herrmann1.sh herrmann1.times2
# Most eye-crossing
##############################
# Special flags for this entry
##############################
#
# This entry requires the GCC -include feature.
ENTRY= herrmann2
PROG= ${ENTRY}
#
herrmann2: herrmann2.c
${MAY_NEED_GCC} ${CFLAGS} herrmann2.c -o herrmann2 \
-include /usr/include/stdlib.h -include /usr/include/stdio.h \
-include /usr/include/time.h -include /usr/include/unistd.h
herrmann2_files: herrmann2.cup herrmann2.ioccc
# Best Of Show
OBJ= ${PROG}.o
DATA= herrmann2.cup herrmann2.ioccc
TARGET= ${PROG}
#
jason: jason.c
${CC} ${CFLAGS} -o jason jason.c
ALT_OBJ=
ALT_TARGET=
# Best Curses Game
#################
# build the entry
#################
#
kev: kev.c
${CC} ${CFLAGS} -DPORT=5455 -DSPEED=50 -o kev kev.c \
-lcurses -ltermcap \
-Dl_="socket(il.sin_family=AF_INET,SOCK_STREAM,0)"
# Best primal ASCII graphics
#
ollinger: ollinger.c
${CC} ${CFLAGS} ollinger.c -o ollinger
# Best abuse of the user
#
rosten: rosten.c
${CC} ${CFLAGS} rosten.c ${X11CCFLAGS} ${X11LDFLAGS} -pedantic -lX11 \
-o rosten
# Best one-liner
#
schweikh: schweikh.c
${CC} ${CFLAGS} schweikh.c -o schweikh
# Best position-independant code
#
westley: westley.c
${CC} ${CFLAGS} westley.c -o westley
westley.orig: westley.orig.c
${CC} ${CFLAGS} westley.orig.c -o westley.orig
# Best position-independant code
#
williams: williams.c
${CC} williams.c ${X11CCFLAGS} ${X11LDFLAGS} -lX11 -o williams
everything: ${WINNERS} ${ALT_NAMES} ${DATA_FILES}
love:
@echo 'not war?'
haste:
${MAKE} waste
waste:
@echo 'waste'
clean:
${RM} -f *.o a.out core ${WINNERS}
clobber: clean
${RM} -f ${WINNERS}
${RM} -f ${ALT_NAMES}
nuke: clobber
all: data ${TARGET}
@${TRUE}
install: all
${CAT} ${WINNERS} ${ALT_NAMES} > /dev/null
.PHONY: all alt data everything clean clobber install \
love haste waste maker easter_egg sandwich \
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
${CC} ${CFLAGS} $< -o $@ ${LIBS}
# alternative executable
#
alt: data ${ALT_TARGET}
@${TRUE}
# data files
#
data: ${DATA}
@${TRUE}
# both all and alt
#
everything: all alt
###############
# utility rules
###############
#
clean:
${RM} -f ${OBJ} ${ALT_OBJ}
@-if [ -f indent.c ]; then \
echo ${RM} -f indent.c; \
${RM} -f indent.c; \
fi
clobber: clean
${RM} -f ${TARGET} ${ALT_TARGET}
@-if [ -e sandwich ]; then \
${RM} -f sandwich; \
echo 'ate sandwich'; \
fi
install:
@echo "Dr. Spock says that is not logical!"
@${TRUE}
# you may be able to misunderstand the source by reading indent.c
#
indent.c: ${PROG}.c
@if which "${GINDENT}" >/dev/null 2>&1; then \
echo ${RM} -f $@; \
${RM} -f $@; \
echo "${GINDENT} < $< > $@"; \
${GINDENT} < $< > $@; \
elif which "${INDENT}" >/dev/null 2>&1; then \
echo ${RM} -f $@; \
${RM} -f $@; \
echo "${INDENT} < $< > $@"; \
${INDENT} < $< > $@; \
else \
echo "no intent tool found, ident $< yourself, sorry"; \
echo "exit 1"; \
exit 1; \
fi
##################
# 133t hacker rulz
##################
#
love:
@echo 'not war?'
@${TRUE}
haste:
$(MAKE) waste
@${TRUE}
waste:
@echo 'haste'
@${TRUE}
maker:
@echo 'Participate in a maker faire'
@${TRUE}
easter_egg:
@echo "you expected to often misunderstand this $${RANDOM} magic"
@echo "chongo '<was here>' /\\oo/\\"
@echo "Eggy"
sandwich: easter_egg
@if [ `id -u` -eq 0 ]; then \
echo 'Okay.'; \
echo "$${RANDOM}`date +%s`$${RANDOM}" > $@; \
else \
echo 'What? Make it yourself.'; \
exit 1; \
fi
# Understand the history of the Homebrew Computer Club
# as well as the West Coast Computer Faire and
# you might be confused different. :-)
#
supernova: sandwich
@-if [ -r .code_anal ]; then \
${RM} -f .code_anal_v6; \
else \
echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \
fi
@echo "A $@ helps ${MAKE} the elements that help form planets"
@${TRUE}
deep_magic: supernova
@-if [ -r .code_anal ]; then \
ccode_analysis --deep_magic 7889066cdbdf09b0408021754586e895be641cc9be29e7eafd3ca65359541f17 \
--FNV1a_hash_512_bit -v2 "${PROG}" "${PROG}.c"; \
else \
echo "Wrong! Do it again!"; \
sleep 2; \
echo "Wrong! Do it again!"; \
sleep 2; \
echo "Wrong! Do it again!"; \
fi
@${TRUE}
magic: deep_magic
@-if [ -r .code_anal ]; then \
ccode_analysis --level 20003 --mode 5717175 --FNV1a_hash_512_bit -v2 "${PROG}" "${PROG}.c"; \
else \
echo "If you don't eat yer meat, you can't have any pudding!"; \
echo "How can you have any pudding if you don't eat yer meat?!"; \
fi
@${TRUE}
# The IOCCC resident astronomer states
#
charon: magic
@echo "$@ is a dwarf planet"
@echo "dwarf is a type of planet"
@echo "therefore IAU, $@ is a planet"
pluto: charon
${MAKE} charon
@echo "$@ is a dwarf planet"
@echo "dwarf is a type of planet"
@echo "therefore, $@ is a planet"
@echo "having lots of planets is good feature because supernovae can help ${MAKE} a lot of them"
+140 -139
View File
@@ -1,4 +1,4 @@
Most eye-crossing:
# Most eye-crossing:
Immanuel Herrmann
University of Freiburg, Germany
@@ -8,93 +8,98 @@ Most eye-crossing:
http://pcpool.mathematik.uni-freiburg.de/~immi/
# To build:
Judges' Comments:
```sh
make
```
To build:
### To run:
make herrmann2
```sh
./herrmann2
```
Try:
### Try:
./herrmann2 < herrmann2.ioccc
./herrmann2 < herrmann2.cup
```sh
./herrmann2 < herrmann2.ioccc
./herrmann2 < herrmann2.cup
```
Be careful when staring at the source code - your eyes might cross, but
if you concentrate on your focus you will find illumination!
## Judges' comments:
Be careful when staring at the source code - your eyes might cross, but
if you concentrate on your focus you will find illumination!
## Author's comments:
You probably know those "magic eye" 3D pictures - pictures looking
like random noise, but when you look "through" the paper, you
either get a three dimensional picture or a head-ache. With this
program, you can create your own 3D pictures in ascii art. And
yes, the program itself is such a 3D picture.
Selected Author's Comments:
### How to use it
You probably know those "magic eye" 3D pictures - pictures looking
like random noise, but when you look "through" the paper, you
either get a three dimensional picture or a head-ache. With this
program, you can create your own 3D pictures in ascii art. And
yes, the program itself is such a 3D picture.
1. Create a file which describes the desired 3D picture. The file
must be a block of lowercase letters the size of the desired
picture. The letters specify the depth of the corresponding pixel:
"a" means close to the paper, "z" means far away. The info files
are examples. Be aware that the size of the picture is restricted
to about 9k.
2. Pipe your picture into the program. The output will be your
3D picture, constructed of random characters (with ascii code between
32 and 126). For example, type
How to use it
=============
```sh
./herrmann2 < herrmann2.ioccc
```
1. Create a file which describes the desired 3D picture. The file
must be a block of lowercase letters the size of the desired
picture. The letters specify the depth of the corresponding pixel:
"a" means close to the paper, "z" means far away. The info files
are examples. Be aware that the size of the picture is restricted
to about 9k.
3. If you want to control the characters used in the output (for
example if your picture is to consist only of digits), pass them
as the first argument. In this case, each time the program needs a
new random character, it will take the next one from the
argument. When it arrives at the end of the argument, it will
start over at the beginning. Example:
2. Pipe your picture into the program. The output will be your
3D picture, constructed of random characters (with ascii code between
32 and 126). For example, type
./herrmann2 "234 84 045 5 6765 7487 65190 84 656 254 12 43931 818 0 6542\
341 45 567 76967 7244 606 976567 895 81898 095 68678 1843 4650547\
565980691 389 04974" < herrmann2.ioccc
./herrmann2 < herrmann2.ioccc
### Some hints to get better results
- Due to the way these 3D pictures work, the left part of the
picture won't look really 3D, so don't put things too much on
the left. The reason is that for each letter in the source file,
a character for the right eye is printed. The 3D effect appears
when the left eye sees the same character more to the left. This
is of course impossible on the left border of the picture.
3. If you want to control the characters used in the output (for
example if your picture is to consist only of digits), pass them
as the first argument. In this case, each time the program needs a
new random character, it will take the next one from the
argument. When it arrives at the end of the argument, it will
start over at the beginning. Example:
- Don't use too different depths and don't use the depths very
close to the paper (beginning of the alphabet). This would make
it more difficult to see the picture.
./herrmann2 "234 84 045 5 6765 7487 65190 84 656 254 12 43931 818 0 6542\
341 45 567 76967 7244 606 976567 895 81898 095 68678 1843 4650547\
565980691 389 04974" < herrmann2.ioccc
- When passing an argument, don't use a too short one; the
repeating pattern which arises from the repetition of the argument
could interfere with the repeating pattern which creates the 3D
effect.
### Extra-Features
Some hints to get better results
--------------------------------
- The program is able to handle all common kinds of line breaks:
Unix, Dos and Mac. To get an output with a certain kind of line
breaks, simply use the same kind of line breaks in the input
file.
- Due to the way these 3D pictures work, the left part of the
picture won't look really 3D, so don't put things too much on
the left. The reason is that for each letter in the source file,
a character for the right eye is printed. The 3D effect appears
when the left eye sees the same character more to the left. This
is of course impossible on the left border of the picture.
- Don't use too different depths and don't use the depths very
close to the paper (beginning of the alphabet). This would make
it more difficult to see the picture.
- When passing an argument, don't use a too short one; the
repeating pattern which arises from the repetition of the argument
could interfere with the repeating pattern which creates the 3D
effect.
Extra-Features
==============
- The program is able to handle all common kinds of line breaks:
Unix, Dos and Mac. To get an output with a certain kind of line
breaks, simply use the same kind of line breaks in the input
file.
- As the source code is a 3D picture itself, the easiest way to
get it (if you lost it or if you don't have it already) is to use
the program itself on the right picture and with the right
argument:
- As the source code is a 3D picture itself, the easiest way to
get it (if you lost it or if you don't have it already) is to use
the program itself on the right picture and with the right
argument:
```sh
./herrmann2 \
'char*d,A[9876];e;b;*ad,a,c; tw,ndr,T; wri; ;*h; _,ar ;on;'\
' ;l ;i(V)man,n {-!har ; =Aadre(0,&e,o||n -- +,o4,=9,l=b=8,'\
@@ -104,92 +109,88 @@ Selected Author's Comments:
'i+(o)+b)),!write,(=_((-b+*h)(1,A+b,!!((((-+, a >T^l,( o-95=+))w?'\
'++ &&r:b<<2+a +w) ((!main(n*n,V) , +-) ),l)),w= +T-->o +o+;{ &!'\
'a;}return _+= ' < herrmann2.ioccc
```
- If I had submitted the program last year, I would have said that
it has exactly the maximum allowed length: 1536 characters. Now
let's say it's a way of protesting against the inflation in
program length.
- If I had submitted the program last year, I would have said that
it has exactly the maximum allowed length: 1536 characters. Now
let's say it's a way of protesting against the inflation in
program length.
- The size of the source 3D picture has been chosen carefully: as
big as possible, but small enough to be viewed without problems
on normal-sized terminals.
- The size of the source 3D picture has been chosen carefully: as
big as possible, but small enough to be viewed without problems
on normal-sized terminals.
### Why this program should win
Why this program should win
===========================
- The layout is of a completely new kind. And it describes what
the program does more precisely than any comment could.
- The layout is of a completely new kind. And it describes what
the program does more precisely than any comment could.
- I don't think there has ever been an ioccc program with so
severe layout constraints. Once the 3D picture has been fixed,
only a sixth of the characters can be chosen freely! (457 of
1840, to be exact.) In contrast, in palindrome programs, for
example, half of the characters can be chosen freely.
- I don't think there has ever been an ioccc program with so
severe layout constraints. Once the 3D picture has been fixed,
only a sixth of the characters can be chosen freely! (457 of
1840, to be exact.) In contrast, in palindrome programs, for
example, half of the characters can be chosen freely.
- I did not cheat by using comments or -D options - something
I've seen even some palindrome programs do. In fact, at my first
attempt at writing the program I became convinced that it
isn't possible without cheating. But then I found out that with
comments or defines, it would become trivial, so I had to try
harder...
- I did not cheat by using comments or -D options - something
I've seen even some palindrome programs do. In fact, at my first
attempt at writing the program I became convinced that it
isn't possible without cheating. But then I found out that with
comments or defines, it would become trivial, so I had to try
harder...
- If you don't believe the constraints are hard, try to write just
one single line which satisfies them. (To be able to make one
function call, for example, you have to fill an entire line with
stuff doing mostly nothing.)
- If you don't believe the constraints are hard, try to write just
one single line which satisfies them. (To be able to make one
function call, for example, you have to fill an entire line with
stuff doing mostly nothing.)
- Just in case this is not enough: Yes, the code itself is
obfuscated: It's (almost) only one big expression, with deep
nesting of () and ?:, and full of unnecessary operations which
do not really help making it readable. And it contains a lot of
"magic numbers". (My favourite is the "7" in line 15 (each
one). Which is the other digit I could have put there instead,
and what other changes to the program would have been necessary?
Without violating the constraints of course.)
- Just in case this is not enough: Yes, the code itself is
obfuscated: It's (almost) only one big expression, with deep
nesting of () and ?:, and full of unnecessary operations which
do not really help making it readable. And it contains a lot of
"magic numbers". (My favourite is the "7" in line 15 (each
one). Which is the other digit I could have put there instead,
and what other changes to the program would have been necessary?
Without violating the constraints of course.)
- The fact that the main loop of the program calls "main"
recursively is nothing new. New however is that this program
only needs a logarithmic recursion depth! (Find out how this
works.)
- The fact that the main loop of the program calls "main"
recursively is nothing new. New however is that this program
only needs a logarithmic recursion depth! (Find out how this
works.)
- When still in doubt about how to judge this program, type
- When still in doubt about how to judge this program, type
```sh
./herrmann2 < herrmann2.cup
```
./herrmann2 < herrmann2.cup
and let the result inspire you. ;-)
and let the result inspire you. ;-)
### Requirements to the compiler / Compatibility
- I fear that gcc is the only compiler for which this program
works. Due to the severe restrictions, I was forced to use
declarations of int variables, functions and parameters without
specifying their type. The biggest problem was to put "int
main(int c, char ** v){" into the program. After some time, I
became convinced that this is impossible. Finally, at least I
managed to squeeze "main(c, v){" into the constraints instead.
- Also, a lot of warnings are produced - most of them "data
definition has no type or storage class", but also some
"parameter names (without types) in function declaration" and
"assignment from incompatible pointer type". I wasn't able to
get rid of them.
Requirements to the compiler / Compatibility
============================================
- I fear that gcc is the only compiler for which this program
works. Due to the severe restrictions, I was forced to use
declarations of int variables, functions and parameters without
specifying their type. The biggest problem was to put "int
main(int c, char ** v){" into the program. After some time, I
became convinced that this is impossible. Finally, at least I
managed to squeeze "main(c, v){" into the constraints instead.
- Also, a lot of warnings are produced - most of them "data
definition has no type or storage class", but also some
"parameter names (without types) in function declaration" and
"assignment from incompatible pointer type". I wasn't able to
get rid of them.
- At least, it probably works with all sufficiently recent
versions of gcc. I tested it with versions 2.7.2.1, 2.8.1,
2.95.2, and ecgs-2.91.66.
- Of course I couldn't put "#include"-lines at the beginning of
the program. Usually, this is not really necessary with
gcc. However, for this program it would have been, because some
functions appear as function pointers, and as such they are not
generated implicitly. So the build script has to pass "-include
..." to gcc. A problem with this is that the complete path of
the include files has to be provided. In the build script, I
assume that the path is /usr/include, but this can easily be
adapted.
- At least, it probably works with all sufficiently recent
versions of gcc. I tested it with versions 2.7.2.1, 2.8.1,
2.95.2, and ecgs-2.91.66.
- Of course I couldn't put "#include"-lines at the beginning of
the program. Usually, this is not really necessary with
gcc. However, for this program it would have been, because some
functions appear as function pointers, and as such they are not
generated implicitly. So the build script has to pass "-include
..." to gcc. A problem with this is that the complete path of
the include files has to be provided. In the build script, I
assume that the path is /usr/include, but this can easily be
adapted.