Name

SPVM::Builder::Config - Compiler and Linker Configuration

Description

The SPVM::Builder::Config class has methods to manipulate compiler and linker configuration.

Usage

use SPVM::Builder::Config;

# Create a config
my $config = SPVM::Builder::Config->new(file => __FILE__);

# C99
my $config = SPVM::Builder::Config->new_c99(file => __FILE__);

# GNU C99
my $config = SPVM::Builder::Config->new_gnu99(file => __FILE__);

# C++
my $config = SPVM::Builder::Config->new_cpp(file => __FILE__);

# C++11
my $config = SPVM::Builder::Config->new_cpp11(file => __FILE__);

# C++17
my $config = SPVM::Builder::Config->new_cpp17(file => __FILE__);

# Optimize
$config->optimize('-O2');

# Optimize with debug mode
$config->optimize('-O0 -g');

# Add libraries
$config->add_lib('gdi32', 'd2d1', 'Dwrite');

# Add source files
$config->add_source_file('foo.c', 'bar.c', 'baz/baz.c');

# Use resource
$config->use_resource('TestCase::Resource::Zlib');
$config->use_resource('TestCase::Resource::Foo1', mode => 'mode1', argv => ['args1', 'args2']);

# Get resouce information
my $resource = $config->get_resource('TestCase::Resource::Zlib');

Fields

ext

my $ext = $config->ext;
$config->ext($ext);

Gets and sets the ext field, the extension of a native class.

Examples:

# Foo/Bar.c
$config->ext('c');

# Foo/Bar.cpp
$config->ext('cpp');

cc

my $cc = $config->cc;
$config->cc($cc);

Gets and sets the cc field, a compiler name.

Examples:

# gcc
$config->cc('gcc');

# g++ for C++
$config->cc('g++');

# nvcc for CUDA/GUP
$config->cc('nvcc');

# cc that compiled this Perl
use Config;
$config->cc($Config{cc});

include_dirs

my $include_dirs = $config->include_dirs;
$config->include_dirs($include_dirs);

Gets and sets the include_dirs field, an array reference of directories for native header files.

The values of this field are converted to the -I options given the compiler "cc".

# -I/path1 -I/path2
$config->include_dirs('/path1', '/path2');

spvm_core_include_dir

my $spvm_core_include_dir = $config->spvm_core_include_dir;
$config->spvm_core_include_dir($spvm_core_include_dir);

Gets and sets the spvm_core_include_dir field, the directory for SPVM core header files.

This field are converted to the -I option given the compiler "cc".

native_include_dir

my $native_include_dir = $config->native_include_dir;
$config->native_include_dir($native_include_dir);

Gets and sets the native_include_dir field, the directory for native header files in this native class.

This field are converted to the -I option given the compiler "cc".

native_src_dir

my $native_src_dir = $config->native_src_dir;
$config->native_src_dir($native_src_dir);

Gets and sets the native_src_dir field, the directory for native source files in this native class.

This directory is where the source files added by the "add_source_file" method are searched.

ccflags

my $ccflags = $config->ccflags;
$config->ccflags($ccflags);

Gets and sets the ccflags field, an array reference of compiler flags given the compile "cc".

dynamic_lib_ccflags

my $dynamic_lib_ccflags = $config->dynamic_lib_ccflags;
$config->dynamic_lib_ccflags($dynamic_lib_ccflags);

Gets and sets the dynamic_lib_ccflags field, an array reference of compiler flags given the compile "cc" used when the linker generates a dynamic link file.

thread_ccflags

my $thread_ccflags = $config->thread_ccflags;
$config->thread_ccflags($thread_ccflags);

Gets and sets the thread_ccflags field, an array reference of compiler flags given the compile "cc" for threads.

std

my $std = $config->std;
$config->std($std);

Gets and sets the std field, a language standard.

This field is converted to the -std option given the compiler "cc".

Examples:

# -std=c99
$config->std('c99');

# -std=gnu99
$config->std('gnu99');

# -std=cpp
$config->std('cpp');

# -std=cpp11
$config->std('cpp11');

# -std=cpp17
$config->std('cpp17');

optimize

my $optimize = $config->optimize;
$config->optimize($optimize);

Gets and sets the optimize field, an option given the compiler "cc" for optimization.

Examples:

$config->optimize('-O3');
$config->optimize('-O2');
$config->optimize('-g3 -O0');

source_files

my $source_files = $config->source_files;
$config->source_files($source_files);

Gets and sets the source_files field, an array reference of native source files.

The source file names are specified as relative paths from the "native_src_dir" field.

before_compile_cbs

my $before_compile_cbs = $config->before_compile_cbs;
$config->before_compile_cbs($before_compile_cbs);

Gets and sets the before_compile_cbs field, an array reference of callbacks called just before the compile command "cc" is executed.

my $before_link_cbs = $config->before_link_cbs;
$config->before_link_cbs($before_link_cbs);

Gets and sets the before_link_cbs field, an array reference of callbacks called just before the link command "ld" is executed.

ld

my $ld = $config->ld;
$config->ld($ld);

Gets and sets the ld field, a linker name.

Excamples:

$config->ld('gcc');
$config->ld('g++');

lib_dirs

my $lib_dirs = $config->lib_dirs;
$config->lib_dirs($lib_dirs);

Gets and sets the lib_dirs field.

This field is an array reference that contains the directories that libraries are searched for by the linker.

This is same as -L option of the compiler "cc".

libs

my $libs = $config->libs;
$config->libs($libs);

Gets and sets the libs field.

This field is an array reference that contains library names or SPVM::Builder::LibInfo objects. These libraries are linked by "link" in SPVM::Builder::CC method.

ldflags

my ldflags = $config->ldflags;
$config->ldflags(ldflags);

Gets and sets the ldflags field.

This field is an array reference that contains linker flags.

dynamic_lib_ldflags

my dynamic_lib_ldflags = $config->dynamic_lib_ldflags;
$config->dynamic_lib_ldflags(dynamic_lib_ldflags);

Gets and sets the dynamic_lib_ldflags field, an array reference of the linker flags for the linker "ld".

thread_ldflags

my thread_ldflags = $config->thread_ldflags;
$config->thread_ldflags(thread_ldflags);

Gets and sets the thread_ldflags field, an array reference of the linker flags for thread for the linker "ld".

static_lib_ldflag

my static_lib_ldflag = $config->static_lib_ldflag;
$config->static_lib_ldflag(static_lib_ldflag);

Gets and sets the static_lib_ldflag field, an array reference that contains the begining and the end of static linking option for each static library of "static_libs".

Excamples:

# -Wl,-Bstatic -lfoo -Wl,-Bdynamic
$config->static_lib_ldflag(['-Wl,-Bstatic', '-Wl,-Bdynamic']);
$config->add_static_lib('foo');

ld_optimize

my $ld_optimize = $config->ld_optimize;
$config->ld_optimize($ld_optimize);

Gets and sets the ld_optimize field.

This field is the option for optimization of the linker such as -O3, -O2, -g3 -O0.

Examples:

$config->ld_optimize("-O3");

force

my $force = $config->force;
$config->force($force);

Gets and sets the force field.

If this field is a true value, the compilation and link are forced without caching.

If this field is a false value, they are not forced.

If this field is undef, whether they are forced or not is determined by other conditions.

quiet

my $quiet = $config->quiet;
$config->quiet($quiet);

Gets and sets the quiet field.

If this field is a true value, messages of the compiler and linker are output.

If this field is a false value, the messages are not output.

If this field is undef, whether the messages are output or not is determined by other conditions.

class_name

my $basic_type_name = $config->class_name;
$config->class_name($basic_type_name);

Gets and sets the class_name field.

This field is the class name of this config.

file

my $file = $config->file;
$config->file($file);

Gets and sets the file field.

This field is the path of the config file.

file_optional

my $file_optional = $config->file_optional;
$config->file_optional($file_optional);

Gets and sets the file_optional field.

If this field is false and the file that is given by the file field is not found, an exception is thrown.

output_type

my $output_type = $config->output_type;
$config->output_type($output_type);

Gets and sets the output_type field.

This field is the output type of the linker. "dynamic_lib", "static_lib" and "exe" are available.

disable_resource

my $disable_resource = $config->disable_resource;
$config->disable_resource($disable_resource);

Gets and sets the disable_resource field.

If this value is true, All resources loaded by the "use_resource" method is disabled.

Class Methods

new

my $config = SPVM::Builder::Config->new(%fields);

Create a SPVM::Builder::Config object with fields.

Exceptions:

If the "file_optional" field is not set to a true value, the "file" field must be passed. Otherwise an exception is thrown.

Default Field Values:

If a field is not defined, the field is set to the following default value.

Examples:

my $config = SPVM::Builder::Config->new(file => __FILE__);

new_c

my $config = SPVM::Builder::Config->new_c(file => __FILE__);

Calls the "new" method and sets th "ext" field to c.

new_c99

my $config = SPVM::Builder::Config->new_c99(file => __FILE__);

Calls the "new_c" method and sets the "std" field to c99.

new_c11

my $config = SPVM::Builder::Config->new_c11(file => __FILE__);

Calls the "new_c" method and sets the "std" field to c11.

new_gnu99

my $config = SPVM::Builder::Config->new_gnu99(file => __FILE__);

Calls the "new_c" method and sets the "std" field to gnu99.

new_gnu11

my $config = SPVM::Builder::Config->new_gnu11(file => __FILE__);

Calls the "new_c" method and sets the "std" field to gnu11.

new_cpp

my $config = SPVM::Builder::Config->new_cpp(file => __FILE__);

Calls the "new" method and sets the "ext" field to cpp and sets the "cc" field to a C++ compiler and sets the "ld" field to a C++ linker.

If $Config{gccversion} of the Config class matches the regex /\bclang\b/i, the "cc" field and the "ld" field are set to clang++.

Otherwise the "cc" field and the "ld" field are set to set to g++.

new_cpp11

my $config = SPVM::Builder::Config->new_cpp11(file => __FILE__);

Calls the "new_cpp" method and sets the "std" field to c++11.

new_cpp14

my $config = SPVM::Builder::Config->new_cpp14(file => __FILE__);

Calls the "new_cpp" method and sets the "std" field to c++14.

new_cpp17

my $config = SPVM::Builder::Config->new_cpp17(file => __FILE__);

Calls the "new_cpp" method and sets the "std" field to c++17.

Instance Methods

add_ccflag

$config->add_ccflag(@ccflags);

Adds values at the end of the "ccflags" field.

add_ldflag

$config->add_ldflag(@ldflags);

Adds values at the end of the "ldflags" field.

add_include_dir

$config->add_include_dir(@include_dirs);

Adds values at the end of the "include_dirs" field.

add_lib_dir

$config->add_lib_dir(@lib_dirs);

Adds values after the last element of lib_dirs field.

add_source_file

$config->add_source_file(@source_files);

Adds a native source file at the end of the "source_files" field.

Examples:

$config->add_source_file('foo.c', 'bar.c');

add_before_compile_cb

$config->add_before_compile_cb(@before_compile_cbs);

Adds callbacks called just before the compile command "cc" is executed at the end of the "before_compile_cbs" field.

Examples:

$config->add_before_compile_cb(sub {
  my ($config, $compile_info) = @_;
  
  my $cc = $compile_info->cc;
  
  # Do something
});
$config->add_before_link_cb(@before_link_cbs);

Adds callbacks called just before the link command "ld" is executed at the end of the "before_link_cbs" field.

Examples:

$config->add_before_link_cb(sub {
  my ($config, $link_info) = @_;
  
  my $object_files = $link_info->object_files;
  
  # Do something
  
});

add_lib

$config->add_lib(@libs);

Adds library names or SPVM::Builder::LibInfo objects at the end of the "libs" field.

Examples:

$config->add_lib('gsl');
$config->add_lib('gsl', 'z');
$config->add_lib(
  SPVM::Builder::LibInfo->new(config => $config, name => 'gsl'),
  SPVM::Builder::LibInfo->new(config => $config, name => 'z', abs => 1),
);

add_static_lib

$config->add_static_lib(@libs);

Adds library names or SPVM::Builder::LibInfo objects at the end of the "libs" field.

static field is set to a true value.

Examples:

$config->add_static_lib('gsl');
$config->add_static_lib('gsl', 'z');
$config->add_static_lib(
  SPVM::Builder::LibInfo->new(config => $config, name => 'gsl'),
  SPVM::Builder::LibInfo->new(config => $config, name => 'z', abs => 1),
);

use_resource

my $resource = $config->use_resource($resource_name);
my $resource = $config->use_resource($resource_name, %options);

Loads a resource by the resource name $resource_name using the SPVM::Builder::Resource method in the SPVM::Builder::Resource class, and returns a SPVM::Builder::Resource object. my $resource = SPVM::Builder::Resource->new(class_name => $resource_name); $config->use_resource($resource);

If the options %options are given, they are used as the options of the SPVM::Builder::Resource method in the SPVM::Builder::Resource class.

my $resource = SPVM::Builder::Resource->new(
  class_name => 'Resource::Zlib',
  mode => 'production',
  argv => ['foo', 'bar'],
);
$config->use_resource($resource);

Examples:

$config->use_resource('Resource::Zlib');

get_resource_names

my $resource_names = $config->get_resource_names;

Gets resource names loaded by the L/"use_resource/"> method.

load_config

my $config = $config->load_config($config_file, @argv);

Loads a config file, and returns a SPVM::Builder::Config object. The argument @argv is set to the @ARGV of the config file.

load_base_config

my $config = $config->load_base_config($config_file, @argv);

Loads a base config file like Foo.config. This method is the alias for the following method call using "load_mode_config".

my $config = $config->load_mode_config($config_file, undef, @argv);

load_mode_config

my $config = $config->load_mode_config($config_file, $mode, @argv);

Loads a mode config file like Foo.mode.config.

At first, removes the string matching the regex (\.[^\.]+)?\.config$ from the base name of the config file $config_file.

Next, if the mode $mode is defined, .$mode.config is added to $config_file. Otherwise .config is added.

Last, "load_config" is called with the modified name of the config file.

get_loaded_config_files

Gets the config files loaded by the "load_config" method.

clone

my $clone = $self->clone;

Clones the SPVM::Builder::Config object, and returns it.

Copyright & License

Copyright (c) 2023 Yuki Kimoto

MIT License