view interps/c-intercal/etc/cftoec.sh @ 12493:885661512b17 draft

<int-e> le//rn schwartzian//In 1987, Yogurt introduced a better way to rank Schwartz users: Rather than holding an annual tournament, users would take a series of standardized tests adminstered by official Schwartz centers, and would then be ranked according to the results. This lead to the Schwartzian transform because it allowed many more users to be ranked.
author HackEso <hackeso@esolangs.org>
date Fri, 12 Jan 2024 07:24:55 +0000
parents 859f9b4339e6
children
line wrap: on
line source

#! /bin/sh
# This shell-script takes one argument, the path to a source
# distribution of cfunge, and compiles that source distribution into a
# library (libick_ecto_b98.a) suitable for linking to C-INTERCAL
# programs. The cfunge distribution itself is not modified; all changes
# are made on a copy.

die() { echo "Error: $1"; exit 1; }

if [ -z "$1" ] ||  [ -z "$2" ]; then
    echo "Usage: $0 ick-source-path cfunge-path"
    exit 1
fi

# test x$1 != x || (
#     echo Please give the path to the root of a cfunge source
#     echo distribution as an argument to this script.
#     exit 1
# ) || exit 1

ICKSRC_PATH="$1"
CFUNGE_PATH="$2"
BUILD_PATH="$(pwd)"

ICKSRC_PATH=`(cd $ICKSRC_PATH; pwd)` || (
    echo Please give the path to the root of C-INTERCAL source
    echo distribution as the first argument to this script\; the directory
    echo or file you gave does not exist.
    exit 1
) || exit 1

CFUNGE_PATH=`(cd $CFUNGE_PATH; pwd)` || (
    echo Please give the path to the root of a cfunge source
    echo distribution as the second argument to this script\; the directory
    echo or file you gave does not exist.
    exit 1
) || exit 1

test -f "$CFUNGE_PATH/src/interpreter.c" || (
    echo Please give the path to the root of a cfunge source
    echo distribution as the second argument to this script.
    echo You gave $CFUNGE_PATH, but it does not appear to be a cfunge
    echo source distribution.
    exit 1
) || exit 1

test -f "$ICKSRC_PATH/etc/IFFI.spec" || (
    echo Please give the path to the root of the C-INTERCAL source
    echo distribution as the first argument of this script.
    echo You gave $ICKSRC_PATH, but it does not appear to be a C-INTERCAL
    echo source distribution.
    exit 1
) || exit 1

echo Compiling cfunge into a library suitable for use with C-INTERCAL:

rm -rf cftoec_temp || die "Failed to remove any old temp directory"
mkdir -p cftoec_temp || die "Failed to create temp directory"
cd cftoec_temp  || die "Failed to change directory to temp directory"

# Select compiler
if [ -z "$CC" ]; then
    CC=cc
fi

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/\"'"
# If GCC 4.1 or later is used add:
#   -O1 -combine -fwhole-program -fvisibility=hidden.
# At least -O1 needed or -fwhole-program have no effect. Which is needed for
# this trick.
if "$CC" --version 2>&1 | grep -q GCC; then
    GCC_VERSION="$("$CC" --version 2>&1 | awk '/[^ ]+ \(GCC\)/ {print $3}')"
    GCC_MAJOR="$(echo "$GCC_VERSION" | cut -d. -f 1)"
    GCC_MINOR="$(echo "$GCC_VERSION" | cut -d. -f 2)"
    # We need GCC 4.1 or later.
    if [ "$GCC_MAJOR" -eq 4 ]; then
        if [ "$GCC_MINOR" -ge 1 ]; then
            IS_GCC=yes
        fi
    elif [ "$GCC_MAJOR" -gt 4 ]; then
        IS_GCC=yes
    fi
fi
if [ "$IS_GCC" ]; then
    CFLAGS="$CFLAGS -O1 -combine -fwhole-program -fvisibility=hidden"
fi
# Allow optional -O2 or such:
if [ "$CFUNGE_CFLAGS" ]; then
    CFLAGS="$CFLAGS $CFUNGE_CFLAGS"
fi
# Please enable this when making changes. Requested by the cfunge author.
#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"

echo "   " Duplicating cfunge source tree so that it can be modified...
cp -r $CFUNGE_PATH/src $CFUNGE_PATH/lib $CFUNGE_PATH/tools .

# Comment these lines back in if patching is needed
# echo "   " Patching cfunge source tree for use with C-INTERCAL...
# patch -p0 < ../cfunge.patch

echo "   " Adding the IFFI fingerprint...
cp -r "$ICKSRC_PATH/etc/IFFI" "$ICKSRC_PATH/etc/IFFI.spec" src/fingerprints

echo "   " Regenerating fingerprint lists...
tools/gen_fprint_list.sh > /dev/null || die "Failed to regen list."

# Trust the filenames that are in the cfunge directory tree; if the user's
# trying to trick themselves into running this on something that looks like
# the cfunge directory tree but which has spaces or quotes in the filenames,
# I really can't be bothered to save them from themself. Dump all the resulting
# object files in this temp directory.
echo "   " Compiling source...
if [ "$IS_GCC" ]; then
    FILES="$(find . -name '*.c' -printf "%p ")"
    # Pipe needed due to messy double quoting.
    # It is impossible to use -o -c and multiple files all at once. GCC errors
    # if you try. However the *.o will be equal to one of the source filenames
    # but placed in the current directory and with .c replaced with .o
    echo "$CC $CFLAGS -c $FILES" | sh
else
    find . -name '*.c' -printf "$CC $CFLAGS -c %p -o %f.o\n" | sh
fi

# Remove any existing library or ar would just add to the existing one.
rm -f ../libick_ecto_b98.a

echo "   " Creating library...
ar cr ../libick_ecto_b98.a *.o
ranlib ../libick_ecto_b98.a

echo "   " Cleaning up...
rm -rf *
cd ..
rm -rf cftoec_temp

echo Finished, unless there were errors.