blob: b4321bd6923c9b9c471c3375fb51d99bbb286a93 [file] [log] [blame]
#!/usr/bin/env perl
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
use strict;
use warnings;
use File::Spec::Functions
qw( catdir catfile splitpath updir no_upwards rel2abs );
use File::Path qw( mkpath rmtree );
use File::Copy qw( copy move );
use File::Find qw( find );
use Cwd qw( getcwd );
my $is_distro_not_devel = -e 'core';
my $base_dir = rel2abs( $is_distro_not_devel ? getcwd() : updir() );
my $DEBUG = $ENV{LIBLUCY_DEBUG} || 0;
$DEBUG and print "base_dir=$base_dir\n";
my $usage = "$0 make-cmd cc-cmd cc-flags\n";
die $usage if $ARGV[0] and $ARGV[0] =~ m/^\-\-?h/;
my $MAKE = shift(@ARGV) || 'make';
my $CC = shift(@ARGV) || 'cc';
my $CC_FLAGS = shift(@ARGV) || '';
my $EXE = shift(@ARGV) || '';
my $CHARMONIZER_ORIG_DIR = catdir( $base_dir, 'charmonizer' );
my $CHARMONIZE_EXE_PATH
= catfile( $CHARMONIZER_ORIG_DIR, "charmonize${EXE}" );
my $CHARMONY_PATH = 'charmony.h';
my $LEMON_DIR = catdir( $base_dir, 'lemon' );
my $LEMON_EXE_PATH = catfile( $LEMON_DIR, "lemon${EXE}" );
my $SNOWSTEM_SRC_DIR
= catdir( $base_dir, qw( modules analysis snowstem source ) );
my $SNOWSTEM_INC_DIR = catdir( $SNOWSTEM_SRC_DIR, 'include' );
my $SNOWSTOP_SRC_DIR
= catdir( $base_dir, qw( modules analysis snowstop source ) );
my $CORE_SOURCE_DIR = catdir( $base_dir, 'core' );
my $CLOWNFISH_DIR = catdir( $base_dir, 'clownfish' );
my $CLOWNFISH_BUILD = catfile( $CLOWNFISH_DIR, 'Build' );
# run this program
main();
sub main {
build_charmony();
build_charmonizer_tests();
build_lemon();
}
sub run_make {
my (%params) = @_;
my @command = @{ $params{args} };
my $dir = $params{dir};
my $current_directory = getcwd();
$DEBUG and print "cur=$current_directory dir=$dir\n";
if ($dir) {
chdir $dir or die "failed to chdir $dir";
}
unshift @command, 'CC=' . $CC;
if ( $CC =~ /^cl\b/ ) {
unshift @command, "-f", "Makefile.MSVC";
}
elsif ( $^O =~ /mswin/i ) {
unshift @command, "-f", "Makefile.MinGW";
}
unshift @command, $MAKE;
system(@command) and die("$MAKE failed");
chdir $current_directory if $dir;
}
sub build_charmonize {
print "Building $CHARMONIZE_EXE_PATH...\n\n";
run_make(
dir => $CHARMONIZER_ORIG_DIR,
args => [],
);
}
# Run the charmonize executable, creating the charmony.h file.
sub build_charmony {
my $self = shift;
build_charmonize();
print "\nWriting $CHARMONY_PATH...\n\n";
# Clean up after charmonize if it doesn't succeed on its own.
# TODO
#$self->add_to_cleanup("_charm*");
#$self->add_to_cleanup($CHARMONY_PATH);
# Prepare arguments to charmonize.
my $flags = $CC_FLAGS;
$flags =~ s/"/\\"/g;
my @command = ( $CHARMONIZE_EXE_PATH, $CC, $flags );
if ( $ENV{CHARM_VALGRIND} ) {
unshift @command, "valgrind", "--leak-check=yes";
}
$DEBUG and print join( " ", @command ), $/;
system(@command) and die "Failed to write $CHARMONY_PATH: $!";
}
sub build_charmonizer_tests {
print "Building Charmonizer Tests...\n\n";
my $flags = join( " ", $CC_FLAGS, '-I' . rel2abs( getcwd() ) );
$flags =~ s/"/\\"/g;
run_make(
dir => $CHARMONIZER_ORIG_DIR,
args => [ "DEFS=$flags", "tests" ],
);
}
sub build_lemon {
print "Building the Lemon parser generator...\n\n";
run_make(
dir => $LEMON_DIR,
args => [],
);
}