#! /usr/bin/env perl
# -*- mode: perl -*-
## Toilet Lisp, a Common Lisp subset for the Étoilé runtime.
## Copyright (C) 2008 Matthias Andreas Benkard.
##
## This program is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or (at
## your option) any later version.
##
## This program is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program. If not, see .
$CC = $ENV{'CC'} // "gcc";
$CFLAGS = $ENV{'CFLAGS'} // "";
$OBJCFLAGS = $ENV{'OBJCFLAGS'} // $CFLAGS;
$MAKE = $ENV{'MAKE'} // "make";
$XCODEBUILD = $ENV{'XCODEBUILD'} // "xcodebuild";
$LLVM_CONFIG = $ENV{'LLVM_CONFIG'} // "llvm-config";
$llvm = `$LLVM_CONFIG --version`;
if ($llvm =~ /(\d+)\.(\d+).*/) {
$llvm_maj = $1;
$llvm_min = $2;
}
`echo '\#include ' | $CC $CFLAGS $OBJCFLAGS -c -o /dev/null -x c - 2>/dev/null`;
if ($? == 0) {
$ffi_h = 1;
} else {
`echo '\#include ' | $CC $CFLAGS $OBJCFLAGS -c -o /dev/null -x c - 2>/dev/null`;
if ($? == 0) {
$ffi_ffi_h = 1;
}
else {
$no_ffi = 1;
}
}
`echo '\#include ' | $CC $CFLAGS $OBJCFLAGS -c -o /dev/null -x c - 2>/dev/null`;
$histedit_h = 1 if ($? == 0);
`$XCODEBUILD -version`;
if ($? == 0) {
$xcode = 1;
$build_cmd = "xcodebuild";
} elsif ($ENV{'GNUSTEP_MAKEFILES'} && (`$MAKE --version` =~ /^GNU.*/)) {
$build_cmd = "$MAKE";
}
$darwin = (`uname -s` =~ "Darwin");
$debian = !$darwin && (`apt-cache show llvm 2>/dev/null` =~ /.*llvm.*/);
if ($darwin) {
$install = "sudo port install";
} elsif ($debian) {
$install = "sudo apt-get install";
}
@steps = ();
@optional_steps = ();
$optional_install = $install;
print "Your system lacks the following REQUIRED components:\n";
if ($no_ffi) {
print " * libffi\n";
if ($darwin || $debian) {
$install = "$install libffi" if $darwin;
$install = "$install libffi-dev" if $debian;
$installp = 1;
} else {
push @steps, (" * Download and install libffi from: http://sourceware.org/libffi/\n");
}
}
unless ($histedit_h) {
print " * libedit\n";
if ($darwin || $debian) {
$install = "$install libedit" if $darwin;
$install = "$install libedit-dev" if $debian;
$installp = 1;
} else {
push @steps, (" * Download and install libedit from: http://www.thrysoee.dk/editline/\n");
}
}
unless ($build_cmd) {
if ($darwin) {
print " * xcodebuild\n";
print " OR: GNUstep-Make and GNUstep-Base\n";
} else {
print " * GNUstep-Make and GNUstep-Base\n";
}
if ($debian) {
$install = "$install gnustep-make libgnustep-base-dev" if $debian;
$installp = 1;
} elsif ($darwin) {
push @steps, (" * Download and install Xcode from: http://developer.apple.com/tools/download/\n");
push @steps, (" OR: Install gnustep-make and gnustep-base through MacPorts.\n");
} else {
push @steps, (" * Download and install GNUstep-Startup from: http://gnustep.org/resources/sources.html\n");
}
}
print "\n";
print "Your system lacks the following OPTIONAL components:\n";
unless ($llvm_maj && $llvm_min && $llvm_maj >= 2 && $llvm_min >= 4) {
print " * LLVM >= 2.3\n";
if ($darwin || $debian) {
$optional_install = "$optional_install llvm" if $darwin;
$optional_install = "$optional_install llvm" if $debian;
$optionalp = 1;
push @optional_steps, (" NOTE: If your distribution's version of LLVM is too old, please download and\n");
push @optional_steps, (" install it manually from: http://llvm.org/releases/\n");
} else {
push @optional_steps, (" * Download and install LLVM from: http://llvm.org/releases/\n");
}
}
if ($installp || @steps) {
print "\n";
print "In order to be able to compile Toilet Lisp, please follow these steps:\n";
print " * In a shell, type: $install\n" if ($installp);
print join("", @steps);
print " * Rerun $0.\n";
}
if ($optionalp || @optional_steps) {
print "\n";
print "If you want the compiler, please follow these steps:\n";
print " * In a shell, type: $optional_install\n" if ($optionalp);
print join("", @optional_steps);
print " * Rerun $0.\n";
}
if (!$installp && !@steps) {
print "\n";
print "Congratulations! You can now build Toilet Lisp by following these steps:\n";
if ($xcode) {
print " * In a shell, type: $XCODEBUILD";
print " -configuration \"Debug (no LLVM)\"" if ($optionalp);
print "\n";
} else {
print " * In a shell, type: $MAKE";
print " USE_LLVM=NO" if ($optionalp);
print "\n";
}
}