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.
before_link_cbs
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.
-
undef
-
undef
-
0
-
undef
-
undef
-
undef
-
The
$Config{cc}
of the Config class. -
[]
-
Windows:
[]
Others:
['-fPIC']
-
Windows:
[]
Others:
['-pthread']
-
undef
-
"-O3"
-
[]
-
The header including directory of the SPVM core is created from the class file of the loaded SPVM::Builder::Config class.
The value looks like
path/SPVM/Builder/include
. -
If the "file" field is defined, the path of the header including directory is created from the "file" field.
The value looks like
path/Foo.native/include
. -
If the "file" field is defined, the path of the source directory is created from the "file" field.
The value looks like
path/Foo.native/src
. -
[]
-
[]
-
The
$Config{ld}
of the Config class. -
Windows:
["-mdll", "-s"]
Other OSs:
['-shared']
-
Windows:
[]
Other OSs:
['-pthread']
-
['-Wl,-Bstatic', '-Wl,-Bdynamic']
-
"-O2"
-
[]
-
[]
-
[]
-
"dynamic_lib"
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
});
add_before_link_cb
$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