blob: c574029062d04426e4011a9f25d84ab282b5d46a [file] [log] [blame]
# 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;
package Clownfish::CFC::Perl::Build::Charmonic;
use base qw( Module::Build );
our $VERSION = '0.004001';
$VERSION = eval $VERSION;
use Carp;
use Config;
use Cwd qw( getcwd );
use File::Spec::Functions qw( catfile curdir );
# Add a custom Module::Build hashref property to pass the following build
# parameters.
# charmonizer_c: Charmonizer C file, required
if ( $Module::Build::VERSION <= 0.30 ) {
__PACKAGE__->add_property( charmonizer_params => {} );
}
else {
__PACKAGE__->add_property(
'charmonizer_params',
default => {},
);
}
my $CHARMONIZER_EXE_PATH = catfile( curdir(), "charmonizer$Config{_exe}" );
my $CHARMONY_H_PATH = 'charmony.h';
my $CHARMONY_PM_PATH = 'Charmony.pm';
# Compile and run the charmonizer executable, creating the charmony.h and
# Charmony.pm files.
sub ACTION_charmony {
my $self = shift;
my $charmonizer_c = $self->charmonizer_params('charmonizer_c');
$self->add_to_cleanup($CHARMONIZER_EXE_PATH);
if ( !$self->up_to_date( $charmonizer_c, $CHARMONIZER_EXE_PATH ) ) {
print "\nCompiling $CHARMONIZER_EXE_PATH...\n\n";
my $cc = $self->config('cc');
my $outflag = $cc =~ /cl\b/ ? "/Fe" : "-o ";
system("$cc $charmonizer_c $outflag$CHARMONIZER_EXE_PATH")
and die "Failed to compile $CHARMONIZER_EXE_PATH";
}
return if $self->up_to_date( $CHARMONIZER_EXE_PATH, [
$CHARMONY_H_PATH, $CHARMONY_PM_PATH,
] );
print "\nRunning $CHARMONIZER_EXE_PATH...\n\n";
$self->add_to_cleanup($CHARMONY_H_PATH);
$self->add_to_cleanup($CHARMONY_PM_PATH);
# Clean up after charmonizer if it doesn't succeed on its own.
$self->add_to_cleanup("_charm*");
if ($Config{cc} =~ /^cl\b/) {
$self->add_to_cleanup('charmonizer.obj');
}
# Prepare arguments to charmonizer.
my @cc_args = $self->split_like_shell($self->config('cc'));
my $cc = shift(@cc_args);
my @command = (
$CHARMONIZER_EXE_PATH,
"--cc=$cc",
'--enable-c',
'--enable-perl',
);
if ( !$self->config('usethreads') ) {
push @command, '--disable-threads';
}
push @command, ( '--', @cc_args, $self->config('ccflags') );
if ( $ENV{CHARM_VALGRIND} ) {
unshift @command, "valgrind", "--leak-check=yes";
}
print join( " ", @command ), $/;
system(@command) and die "Failed to run $CHARMONIZER_EXE_PATH: $!";
}
my $config;
sub charmony {
my ( undef, $key ) = @_;
if (!$config) {
eval { require 'Charmony.pm'; };
if ( !$@ ) {
$config = Charmony->config;
}
}
if ($config) {
return $config->{$key};
}
return;
}
1;
__END__