309 lines
8.2 KiB
Perl
Executable file
309 lines
8.2 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
use strict;
|
|
|
|
# this is not available in some distro :(
|
|
use Getopt::Long;
|
|
use Pod::Usage;
|
|
|
|
######################################################################
|
|
# Prelude
|
|
######################################################################
|
|
|
|
# Yes I know about autoconf ... and autoconf sucks.
|
|
|
|
# We do not check for the following programs; we assume they are standard:
|
|
# - binutils, gcc, as, ld (the GNU toolchain)
|
|
# - make, perl, bash
|
|
# - diffutils, fileutils, findutils, grep, patchutils, sh-utils
|
|
#
|
|
#todo:
|
|
# - findutils? we need a good GNU find, not the macos find
|
|
# which adds some extra '//' in paths which bothers flitter
|
|
# - sharutils still?, for obrowser/ocsigen use of uuencode
|
|
#
|
|
# If you want to run the tests you will also need:
|
|
# - swipl
|
|
# - javac
|
|
|
|
my $project =
|
|
"flitter";
|
|
my $projectcmdline =
|
|
"./flitter -generate-nim <c_file>";
|
|
|
|
######################################################################
|
|
# Options
|
|
######################################################################
|
|
|
|
my $prefix="/usr/local";
|
|
|
|
# adjusted automatically based on local ocaml configuration
|
|
my $opt= ""; # ocamlc.opt?
|
|
my $ocamlc_flags = ""; #ocamlc -bin-annot?
|
|
my $ocaml_version = 3112;
|
|
|
|
|
|
my $man = 0;
|
|
my $help = 0;
|
|
|
|
# See http://perldoc.perl.org/Getopt/Long.html
|
|
# coupling: if add options here, add an explanation at the bottom of this file
|
|
# too. Later you may also add something in the documentation latex file
|
|
# (or use LP).
|
|
GetOptions (
|
|
"prefix=s" => \$prefix,
|
|
'help|?' => \$help,
|
|
'man' => \$man
|
|
) or pod2usage(2);
|
|
#or die "$0: GetOptions: $!";
|
|
|
|
pod2usage(1) if $help;
|
|
pod2usage(-exitstatus => 0, -verbose => 2) if $man;
|
|
|
|
my $src="$prefix/share/$project";
|
|
|
|
######################################################################
|
|
# Helpers
|
|
######################################################################
|
|
BEGIN { die "need Perl 5 or greater" if $] < 5 ; }
|
|
|
|
#use Common;
|
|
sub pr2 { print STDERR "@_\n" }
|
|
sub cat {
|
|
my ($what) = @_;
|
|
my @list;
|
|
open(TMP, $what);
|
|
while(<TMP>) { push @list, "$_"; }
|
|
\@list;
|
|
}
|
|
sub notb { !$_[0] }
|
|
sub mapf { my ($f, $xs) = @_; [ map { &$f($_) } @{$xs} ] }
|
|
sub plural { my ($e) = @_; if ($e > 1) { "s" } else { "" } }
|
|
|
|
sub check_config { my ($command, $expect, $msggood, $msgbad) = @_;
|
|
my $error = 0;
|
|
|
|
my $full = cat($command);
|
|
my $res = join(" ", @{$full});
|
|
# pr2 $res;
|
|
if(notb($res =~ $expect)) { $error++; pr2 "!!!! $msgbad !!!!"; }
|
|
else { pr2 $msggood }
|
|
return $error;
|
|
}
|
|
|
|
sub show_error_msg_and_exit_if_error {
|
|
my ($error) = @_;
|
|
if($error) {
|
|
pr2 "
|
|
----------------------------------------------------------------------
|
|
!!!! There seems to have a problem, we have found a missing program.
|
|
Have a look at install.txt and the install_xxx.txt corresponding to your
|
|
OS.!!!!
|
|
----------------------------------------------------------------------
|
|
";
|
|
exit 1;
|
|
}
|
|
#plural($error) . ".
|
|
#" .
|
|
#" . (($error > 1) ? "Some of those packages" : "This package") .
|
|
# " may be installed by picking " . ($error > 1 ? "them" : "it") .
|
|
# " in $project-dependencies.tgz available
|
|
#on the $project website. !!!!
|
|
}
|
|
|
|
sub show_missing_package_error_msg {
|
|
my ($error2) = @_;
|
|
pr2 "
|
|
----------------------------------------------------------------------
|
|
!!!! You can try to compile and test $project,
|
|
but some features or plugins may be missing. !!!!\n
|
|
We have found $error2 missing package" . plural($error2) . ". " .
|
|
#(($error2 > 1) ? "Some of those packages" : "This package") .
|
|
#" may be installed
|
|
#by picking " . ($error2 > 1 ? "them" : "it") .
|
|
#" in $project-dependencies.tgz available on the $project website.
|
|
#";
|
|
"
|
|
Have a look at the install_xxx.txt corresponding to your OS.
|
|
";
|
|
}
|
|
|
|
######################################################################
|
|
# Let's go
|
|
######################################################################
|
|
|
|
pr2 "Checking your configuration.\n";
|
|
|
|
# hard error, missing programs
|
|
my $error = 0;
|
|
# soft error, missing libraries, can not probably compile every flitter components
|
|
my $error2 = 0;
|
|
|
|
my $arch = `uname`;
|
|
|
|
#---------------------------------------------------------------------
|
|
# Compilers and runtimes
|
|
#---------------------------------------------------------------------
|
|
# We need at least 3.12 because I use the forall 'a. new typing feature
|
|
# as well as the '_' pattern in records (in my code but also in lib-sexp/)
|
|
$error +=
|
|
check_config("echo \"1;;\\n\" | ocaml |",
|
|
"(Objective|OCaml)(.*) ([34]\.*.*)",
|
|
"OCaml (the wonderful language) is present.",
|
|
"The program ocaml is missing or is not a good version. We need at least 3.12",
|
|
);
|
|
show_error_msg_and_exit_if_error($error);
|
|
|
|
my $command = "echo \"1;;\\n\" | ocaml |";
|
|
my $full = cat($command);
|
|
my $res = join(" ", @{$full});
|
|
if ($res =~ /(Objective|OCaml)(.*) ([34])\.([0-9]+).([0-9]+)/) {
|
|
my $major = $3;
|
|
my $minor = $4;
|
|
my $other = $5;
|
|
$ocaml_version = $major * 1000 + $minor * 10 + $other;
|
|
} else {
|
|
die "wrong version of ocaml";
|
|
}
|
|
|
|
# allow to use ocamlc.opt instead of ocamlc, which speeds up compilation
|
|
if (`which ocamlc.opt` && `which ocamlopt.opt`) {
|
|
$opt = ".opt";
|
|
}
|
|
|
|
# -bin-annot is for codegraph, it needs ocaml 4.00,
|
|
# -absname is for tuareg mode under my mac, it also needs ocaml 4.00
|
|
if($ocaml_version >= 4000) {
|
|
$ocamlc_flags="-bin-annot -absname";
|
|
}
|
|
|
|
#---------------------------------------------------------------
|
|
# Developers tools
|
|
#---------------------------------------------------------------
|
|
|
|
my $MAKE_PROGRAM = "make";
|
|
if( ($arch =~ /FreeBSD/) || ($arch =~ /OpenBSD/) ) {
|
|
$MAKE_PROGRAM = "gmake";
|
|
}
|
|
|
|
my $BREW_PROGRAM = "";
|
|
if($arch =~ /Darwin/) {
|
|
$BREW_PROGRAM = `which brew`;
|
|
}
|
|
|
|
#---------------------------------------------------------------------
|
|
# More developers tools
|
|
#---------------------------------------------------------------------
|
|
|
|
#---------------------------------------------------------------------
|
|
# Libraries
|
|
#---------------------------------------------------------------------
|
|
|
|
# if darwin or cygwin then could just modify this variable ? enough ?
|
|
my $prefix_distrib = "/usr";
|
|
|
|
if( ($arch =~ /FreeBSD/) || (($arch =~ /Darwin/) && ($BREW_PROGRAM)) ) {
|
|
$prefix_distrib = "/usr/local";
|
|
} elsif ($arch =~ /Darwin/) {
|
|
$prefix_distrib = "/opt/local";
|
|
}
|
|
|
|
######################################################################
|
|
# Generating the configuration
|
|
######################################################################
|
|
|
|
pr2 "";
|
|
pr2 "$project target prefix: $prefix (you can use --prefix to override it)";
|
|
pr2 "Generating Makefile.config (see also configure --help)";
|
|
open(CONFIG, ">Makefile.config");
|
|
print CONFIG "# autogenerated by configure
|
|
|
|
# Where to install the binary
|
|
BINDIR=$prefix/bin
|
|
|
|
# Where to install the man pages
|
|
MANDIR=$prefix/man
|
|
|
|
# Where to install the lib
|
|
LIBDIR=$prefix/lib
|
|
|
|
# Where to install the configuration files
|
|
SHAREDIR=$src
|
|
|
|
OPTBIN=$opt
|
|
OCAMLCFLAGS_EXTRA=$ocamlc_flags
|
|
OCAMLVERSION=$ocaml_version
|
|
";
|
|
|
|
|
|
pr2 "Generating globals/config_flitter.ml";
|
|
`perl -p -e 's#Not_found1.\*#Not_found->\\\"./\\\"#' globals/config_flitter.ml.in > globals/config_flitter.ml`;
|
|
|
|
`perl -p -i -e 's#Not_found[0-9]#Not_found#' globals/config_flitter.ml`;
|
|
|
|
if($error || $error2) {
|
|
pr2 "!!Problems during ./configure!!";
|
|
}
|
|
|
|
######################################################################
|
|
# Diagnostic
|
|
######################################################################
|
|
|
|
if($error2) {
|
|
show_missing_package_error_msg($error2);
|
|
} else {
|
|
pr2 "All seems fine for $project.";
|
|
}
|
|
|
|
pr2 "
|
|
To compile $project type:
|
|
\$ $MAKE_PROGRAM depend
|
|
\$ $MAKE_PROGRAM
|
|
|
|
Then, to test $project simply type:
|
|
\$ $projectcmdline
|
|
and to run tests:
|
|
\$ make test
|
|
";
|
|
|
|
|
|
|
|
######################################################################
|
|
# Documentation
|
|
######################################################################
|
|
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
configure - setting compilation options for flitter
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
configure [options] [--prefix=/path/to/install]
|
|
|
|
Options are:
|
|
--prefix
|
|
--with-all
|
|
|
|
=head1 OPTIONS
|
|
|
|
=over 8
|
|
|
|
|
|
=item B<-help>
|
|
|
|
Print a brief help message and exits.
|
|
|
|
=item B<-man>
|
|
|
|
Prints the manual page and exits.
|
|
|
|
=back
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
B<This program> will read command line options and generate
|
|
a B<Makefile.config> and other files to set the compilation
|
|
environment for flitter.
|
|
|
|
=cut
|