From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use strict;
use Config;
use Carp 'confess';
use File::Basename 'dirname';
# Fields
sub source_file {
my $self = shift;
if (@_) {
$self->{source_file} = $_[0];
return $self;
}
else {
return $self->{source_file};
}
}
sub output_file {
my $self = shift;
if (@_) {
$self->{output_file} = $_[0];
return $self;
}
else {
return $self->{output_file};
}
}
sub config {
my $self = shift;
if (@_) {
$self->{config} = $_[0];
return $self;
}
else {
return $self->{config};
}
}
# Class methods
sub new {
my $class = shift;
my $self = {@_};
bless $self, $class;
return $self;
}
# Instance Methods
sub create_compile_command {
my ($self) = @_;
my $config = $self->config;
my $cc = $config->cc;
my $output_file = $self->output_file;
my $source_file = $self->source_file;
my $compile_command_args = $self->create_compile_command_args;
my @compile_command = ($cc, '-c', '-o', $output_file, @$compile_command_args, $source_file);
return \@compile_command;
}
sub create_compile_command_args {
my ($self) = @_;
my $config = $self->config;
my @compile_command_args;
my $std = $config->std;
if (defined $std) {
push @compile_command_args, "-std=$std";
}
my $optimize = $config->optimize;
if (defined $optimize) {
push @compile_command_args, split(/ +/, $optimize);
}
push @compile_command_args, @{$config->ccflags};
push @compile_command_args, @{$config->thread_ccflags};
my $output_type = $config->output_type;
if ($output_type eq 'dynamic_lib') {
push @compile_command_args, @{$config->dynamic_lib_ccflags};
}
# include directories
{
my @all_include_dirs;
# SPVM core native directory
my $spvm_core_include_dir = $config->spvm_core_include_dir;
push @all_include_dirs, $spvm_core_include_dir;
# Native include directory
my $native_include_dir = $config->native_include_dir;
if (defined $native_include_dir) {
push @all_include_dirs, $native_include_dir;
}
# Resource include directories
my $disable_resource = $config->disable_resource;
unless ($disable_resource) {
my $resource_names = $config->get_resource_names;
for my $resource_name (@$resource_names) {
my $resource = $config->get_resource($resource_name);
my $config = $resource->config;
my $resource_include_dir = $config->native_include_dir;
if (defined $resource_include_dir) {
push @all_include_dirs, $resource_include_dir;
}
}
}
# include directories
my $include_dirs = $config->include_dirs;
push @all_include_dirs, @$include_dirs;
my @all_include_dirs_args = map { "-I$_" } @all_include_dirs;
push @compile_command_args, @all_include_dirs_args;
}
return \@compile_command_args;
}
sub to_cmd {
my ($self) = @_;
my $compile_command = $self->create_compile_command;
my $compile_command_string = "@$compile_command";
return $compile_command_string;
}
1;
=head1 Name
SPVM::Builder::CompileInfo - Compilation Information
=head1 Description
The SPVM::Builder::CompileInfo class has methods to manipulate compilation information.
=head1 Fields
=head2 config
my $config = $compile_info->config;
$compile_info->config($config);
Gets and sets the C<config> field.
This is a L<SPVM::Builder::Config> object used to compile the source file.
=head2 source_file
my $source_file = $compile_info->source_file;
$compile_info->source_file($source_file);
Gets and sets the C<source_file> field.
This field is a source file.
=head2 output_file
my $output_file = $compile_info->output_file;
$compile_info->output_file($output_file);
Gets and sets the C<output_file> field.
This field is an output file.
=head1 Class Methods
=head2 new
my $compile_info = SPVM::Builder::CompileInfo->new(%fields);
Creates a new L<SPVM::Builder::CompileInfo> object with L</"Fields">.
Default Field Values:
If a field is not defined, the field is set to the following default value.
=over 2
=item * L</"source_file">
undef
=item * L</"output_file">
undef
=item * L</"config">
undef
=back
=head1 Instance Methods
=head2 create_compile_command
my $compile_command = $compile_info->create_compile_command;
Creates the compilation command, and returns it.
The return value is an array reference.
The following one is an example of the return value.
[qw(cc -o foo.o -c -O2 -Ipath/include foo.c)]
=head2 create_compile_command_args
my $config_args = $compile_info->create_compile_command_args;
Creates the parts of the arguments of the compilation command from the information of the L</"config"> field, and returns it. The return value is an array reference.
The C<-c> option, the C<-o> option and the source file name are not contained.
The following one is an example of the return value.
[qw(-O2 -Ipath/include)]
=head2 to_cmd
my $compile_command_string = $compile_info->to_cmd;
Calls the L<create_compile_command|/"create_compile_command"> method and joins all elements of the returned array reference with a space, and returns it.
The following one is an example of the return value.
"cc -c -o foo.o -O2 -Ipath/include foo.c"
=head1 Copyright & License
Copyright (c) 2023 Yuki Kimoto
MIT License