996
|
1 #! /bin/sh
|
|
2 # This shell-script takes one argument, the path to a source
|
|
3 # distribution of cfunge, and compiles that source distribution into a
|
|
4 # library (libick_ecto_b98.a) suitable for linking to C-INTERCAL
|
|
5 # programs. The cfunge distribution itself is not modified; all changes
|
|
6 # are made on a copy.
|
|
7
|
|
8 die() { echo "Error: $1"; exit 1; }
|
|
9
|
|
10 if [ -z "$1" ] || [ -z "$2" ]; then
|
|
11 echo "Usage: $0 ick-source-path cfunge-path"
|
|
12 exit 1
|
|
13 fi
|
|
14
|
|
15 # test x$1 != x || (
|
|
16 # echo Please give the path to the root of a cfunge source
|
|
17 # echo distribution as an argument to this script.
|
|
18 # exit 1
|
|
19 # ) || exit 1
|
|
20
|
|
21 ICKSRC_PATH="$1"
|
|
22 CFUNGE_PATH="$2"
|
|
23 BUILD_PATH="$(pwd)"
|
|
24
|
|
25 ICKSRC_PATH=`(cd $ICKSRC_PATH; pwd)` || (
|
|
26 echo Please give the path to the root of C-INTERCAL source
|
|
27 echo distribution as the first argument to this script\; the directory
|
|
28 echo or file you gave does not exist.
|
|
29 exit 1
|
|
30 ) || exit 1
|
|
31
|
|
32 CFUNGE_PATH=`(cd $CFUNGE_PATH; pwd)` || (
|
|
33 echo Please give the path to the root of a cfunge source
|
|
34 echo distribution as the second argument to this script\; the directory
|
|
35 echo or file you gave does not exist.
|
|
36 exit 1
|
|
37 ) || exit 1
|
|
38
|
|
39 test -f "$CFUNGE_PATH/src/interpreter.c" || (
|
|
40 echo Please give the path to the root of a cfunge source
|
|
41 echo distribution as the second argument to this script.
|
|
42 echo You gave $CFUNGE_PATH, but it does not appear to be a cfunge
|
|
43 echo source distribution.
|
|
44 exit 1
|
|
45 ) || exit 1
|
|
46
|
|
47 test -f "$ICKSRC_PATH/etc/IFFI.spec" || (
|
|
48 echo Please give the path to the root of the C-INTERCAL source
|
|
49 echo distribution as the first argument of this script.
|
|
50 echo You gave $ICKSRC_PATH, but it does not appear to be a C-INTERCAL
|
|
51 echo source distribution.
|
|
52 exit 1
|
|
53 ) || exit 1
|
|
54
|
|
55 echo Compiling cfunge into a library suitable for use with C-INTERCAL:
|
|
56
|
|
57 rm -rf cftoec_temp || die "Failed to remove any old temp directory"
|
|
58 mkdir -p cftoec_temp || die "Failed to create temp directory"
|
|
59 cd cftoec_temp || die "Failed to change directory to temp directory"
|
|
60
|
|
61 # Select compiler
|
|
62 if [ -z "$CC" ]; then
|
|
63 CC=cc
|
|
64 fi
|
|
65
|
|
66 CFLAGS="-std=c99 -DUSE32 -DDISABLE_GC -DFUNGE_EXTERNAL_LIBRARY -D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED -DFUNGE_OLD_HANDPRINT=0x43464649 '-DFUNGE_NEW_HANDPRINT=\"http://example.com/\"'"
|
|
67 # If GCC 4.1 or later is used add:
|
|
68 # -O1 -combine -fwhole-program -fvisibility=hidden.
|
|
69 # At least -O1 needed or -fwhole-program have no effect. Which is needed for
|
|
70 # this trick.
|
|
71 if "$CC" --version 2>&1 | grep -q GCC; then
|
|
72 GCC_VERSION="$("$CC" --version 2>&1 | awk '/[^ ]+ \(GCC\)/ {print $3}')"
|
|
73 GCC_MAJOR="$(echo "$GCC_VERSION" | cut -d. -f 1)"
|
|
74 GCC_MINOR="$(echo "$GCC_VERSION" | cut -d. -f 2)"
|
|
75 # We need GCC 4.1 or later.
|
|
76 if [ "$GCC_MAJOR" -eq 4 ]; then
|
|
77 if [ "$GCC_MINOR" -ge 1 ]; then
|
|
78 IS_GCC=yes
|
|
79 fi
|
|
80 elif [ "$GCC_MAJOR" -gt 4 ]; then
|
|
81 IS_GCC=yes
|
|
82 fi
|
|
83 fi
|
|
84 if [ "$IS_GCC" ]; then
|
|
85 CFLAGS="$CFLAGS -O1 -combine -fwhole-program -fvisibility=hidden"
|
|
86 fi
|
|
87 # Allow optional -O2 or such:
|
|
88 if [ "$CFUNGE_CFLAGS" ]; then
|
|
89 CFLAGS="$CFLAGS $CFUNGE_CFLAGS"
|
|
90 fi
|
|
91 # Please enable this when making changes. Requested by the cfunge author.
|
|
92 #CFLAGS="$CFLAGS -Wall -Wextra -pedantic -Wpointer-arith -Wimplicit -Wnested-externs -Wcast-align -Wcast-qual -Wbad-function-cast -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wparentheses -Wshadow -Wundef -Wpacked -Wfloat-equal -Wstrict-aliasing=2 -Wformat=2 -Wdisabled-optimization -Wmissing-noreturn -Wmissing-format-attribute -Wdeclaration-after-statement -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wwrite-strings"
|
|
93
|
|
94 echo " " Duplicating cfunge source tree so that it can be modified...
|
|
95 cp -r $CFUNGE_PATH/src $CFUNGE_PATH/lib $CFUNGE_PATH/tools .
|
|
96
|
|
97 # Comment these lines back in if patching is needed
|
|
98 # echo " " Patching cfunge source tree for use with C-INTERCAL...
|
|
99 # patch -p0 < ../cfunge.patch
|
|
100
|
|
101 echo " " Adding the IFFI fingerprint...
|
|
102 cp -r "$ICKSRC_PATH/etc/IFFI" "$ICKSRC_PATH/etc/IFFI.spec" src/fingerprints
|
|
103
|
|
104 echo " " Regenerating fingerprint lists...
|
|
105 tools/gen_fprint_list.sh > /dev/null || die "Failed to regen list."
|
|
106
|
|
107 # Trust the filenames that are in the cfunge directory tree; if the user's
|
|
108 # trying to trick themselves into running this on something that looks like
|
|
109 # the cfunge directory tree but which has spaces or quotes in the filenames,
|
|
110 # I really can't be bothered to save them from themself. Dump all the resulting
|
|
111 # object files in this temp directory.
|
|
112 echo " " Compiling source...
|
|
113 if [ "$IS_GCC" ]; then
|
|
114 FILES="$(find . -name '*.c' -printf "%p ")"
|
|
115 # Pipe needed due to messy double quoting.
|
|
116 # It is impossible to use -o -c and multiple files all at once. GCC errors
|
|
117 # if you try. However the *.o will be equal to one of the source filenames
|
|
118 # but placed in the current directory and with .c replaced with .o
|
|
119 echo "$CC $CFLAGS -c $FILES" | sh
|
|
120 else
|
|
121 find . -name '*.c' -printf "$CC $CFLAGS -c %p -o %f.o\n" | sh
|
|
122 fi
|
|
123
|
|
124 # Remove any existing library or ar would just add to the existing one.
|
|
125 rm -f ../libick_ecto_b98.a
|
|
126
|
|
127 echo " " Creating library...
|
|
128 ar cr ../libick_ecto_b98.a *.o
|
|
129 ranlib ../libick_ecto_b98.a
|
|
130
|
|
131 echo " " Cleaning up...
|
|
132 rm -rf *
|
|
133 cd ..
|
|
134 rm -rf cftoec_temp
|
|
135
|
|
136 echo Finished, unless there were errors.
|