📄 projectcreator.pm
字号:
}
if ($curly == 0) {
$self->{'feature_defined'} = 0;
last;
}
}
}
return $status, $error;
}
sub process_array_assignment {
my($self) = shift;
my($aref) = shift;
my($type) = shift;
my($array) = shift;
if (!defined $$aref || $type eq 'assignment') {
if ($type ne 'assign_sub') {
$$aref = $array;
}
}
else {
if ($type eq 'assign_add') {
push(@{$$aref}, @$array);
}
elsif ($type eq 'assign_sub') {
my($count) = scalar(@{$$aref});
for(my $i = 0; $i < $count; ++$i) {
foreach my $val (@$array) {
if ($$aref->[$i] eq $val) {
splice(@{$$aref}, $i, 1);
--$i;
--$count;
last;
}
}
}
}
}
}
sub parse_define_custom {
my($self) = shift;
my($fh) = shift;
my($tag) = shift;
my($status) = 0;
my($errorString) = "Unable to process $tag";
my(%flags) = ();
## Make the tag something _files
$tag = lc($tag) . '_files';
if (defined $self->{'valid_components'}->{$tag}) {
$errorString = "$tag has already been defined";
}
else {
## Update the custom_types assignment
$self->process_assignment_add('custom_types', $tag);
if (!defined $self->{'matching_assignments'}->{$tag}) {
my(@keys) = keys %custom;
$self->{'matching_assignments'}->{$tag} = \@keys;
}
while(<$fh>) {
my($line) = $self->preprocess_line($fh, $_);
if ($line eq '') {
}
elsif ($line =~ /^}/) {
$status = 1;
$errorString = undef;
## Propagate the custom defined values into the mapped values
foreach my $key (keys %{$self->{'valid_names'}}) {
my($mapped) = $self->{'valid_names'}->{$key};
if (UNIVERSAL::isa($mapped, 'ARRAY')) {
my($value) = $self->{'generated_exts'}->{$tag}->{$$mapped[1]};
if (defined $value) {
## Bypass the process_assignment() defined in this class
## to avoid unwanted keyword mapping.
$self->SUPER::process_assignment($key, $value);
}
}
}
## Set some defaults (if they haven't already been set)
if (!defined $self->{'generated_exts'}->{$tag}->{'pre_filename'}) {
$self->{'generated_exts'}->{$tag}->{'pre_filename'} = [ '' ];
}
if (!defined $self->{'generated_exts'}->{$tag}->{'pre_extension'}) {
$self->{'generated_exts'}->{$tag}->{'pre_extension'} = [ '' ];
}
if (!defined $self->{'generated_exts'}->{$tag}->{'automatic'}) {
$self->{'generated_exts'}->{$tag}->{'automatic'} = 1;
}
last;
}
else {
my(@values) = ();
## If this returns true, then we've found an assignment
if ($self->parse_assignment($line, \@values)) {
my($type) = $values[0];
my($name) = $values[1];
my($value) = $values[2];
if (defined $customDefined{$name}) {
if ($customDefined{$name} == -1) {
$value = $self->escape_regex_special($value);
my(@array) = split(/\s*,\s*/, $value);
$self->process_array_assignment(
\$self->{'valid_components'}->{$tag}, $type, \@array);
}
else {
if (!defined $self->{'generated_exts'}->{$tag}) {
$self->{'generated_exts'}->{$tag} = {};
}
## First try to convert the value into a relative path
$value = $self->relative($value);
## If that didn't work, try to convert it to the
## right environment variable form.
if ($value =~ /\$\(.*\)/) {
my($envstart, $envend) = $self->get_env_accessor();
if (defined $envstart) {
if (!defined $envend) {
$envend = '';
}
$value =~ s/\$\(([^\)]+)\)/$envstart$1$envend/g;
}
}
if ($customDefined{$name} == 1) {
if ($type eq 'assignment') {
$self->process_assignment(
$name, $value,
$self->{'generated_exts'}->{$tag});
}
elsif ($type eq 'assign_add') {
$self->process_assignment_add(
$name, $value,
$self->{'generated_exts'}->{$tag});
}
elsif ($type eq 'assign_sub') {
$self->process_assignment_sub(
$name, $value,
$self->{'generated_exts'}->{$tag});
}
}
else {
## Transform the name from something outputext to
## something files. We expect this to match the
## names of valid_assignments.
$name =~ s/outputext/files/g;
## Get it ready for regular expressions
$value = $self->escape_regex_special($value);
## Process the array assignment
my(@array) = split(/\s*,\s*/, $value);
$self->process_array_assignment(
\$self->{'generated_exts'}->{$tag}->{$name},
$type, \@array);
}
}
}
else {
$status = 0;
$errorString = "Invalid assignment name: $name";
last;
}
}
elsif ($line =~ /^(\w+)\s+(\w+)(\s*=\s*(\w+)?)?/) {
## Check for keyword mapping here
my($keyword) = $1;
my($newkey) = $2;
my($mapkey) = $4;
if ($keyword eq 'keyword') {
if (defined $self->{'valid_names'}->{$newkey}) {
$status = 0;
$errorString = "Cannot map $newkey onto an " .
"existing keyword";
last;
}
elsif (!defined $mapkey) {
$self->{'valid_names'}->{$newkey} = 1;
}
elsif ($newkey ne $mapkey) {
if (defined $customDefined{$mapkey}) {
$self->{'valid_names'}->{$newkey} = [ $tag, $mapkey ];
}
else {
$status = 0;
$errorString = "Cannot map $newkey to an " .
"undefined custom keyword: $mapkey";
last;
}
}
else {
$status = 0;
$errorString = "Cannot map $newkey to $mapkey";
last;
}
}
else {
$status = 0;
$errorString = "Unrecognized line: $line";
last;
}
}
else {
$status = 0;
$errorString = "Unrecognized line: $line";
last;
}
}
}
}
return $status, $errorString;
}
sub process_duplicate_modification {
my($self) = shift;
my($name) = shift;
my($assign) = shift;
## If we are modifying the libs, libpaths or includes assignment with
## either addition or subtraction, we are going to
## perform a little fix on the value to avoid multiple
## libraries and to try to insure the correct linking order
if ($name eq 'libpaths' || $name eq 'includes' || $name =~ /libs$/) {
my($nval) = $self->get_assignment($name, $assign);
if (defined $nval) {
my($parts) = $self->create_array($nval);
my(%seen) = ();
my($value) = '';
foreach my $part (@$parts) {
if (!defined $seen{$part}) {
$value .= $part . ' ';
$seen{$part} = 1;
}
}
$self->process_assignment($name, $value, $assign);
}
}
}
sub read_template_input {
my($self) = shift;
my($status) = 1;
my($errorString) = undef;
my($file) = undef;
my($tag) = undef;
my($ti) = $self->get_ti_override();
my($override) = undef;
if ($self->exe_target()) {
if ($self->get_static() == 1) {
$tag = 'lexe_template_input';
if (!defined $self->{$tag}) {
if (defined $$ti{'lib_exe'}) {
$file = $$ti{'lib_exe'};
$override = 1;
}
else {
$file = $self->get_lib_exe_template_input_file();
}
}
}
else {
$tag = 'dexe_template_input';
if (!defined $self->{$tag}) {
if (defined $$ti{'dll_exe'}) {
$file = $$ti{'dll_exe'};
$override = 1;
}
else {
$file = $self->get_dll_exe_template_input_file();
}
}
}
}
else {
if ($self->get_static() == 1) {
$tag = 'lib_template_input';
if (!defined $self->{$tag}) {
if (defined $$ti{'lib'}) {
$file = $$ti{'lib'};
$override = 1;
}
else {
$file = $self->get_lib_template_input_file();
}
}
}
else {
$tag = 'dll_template_input';
if (!defined $self->{$tag}) {
if (defined $$ti{'dll'}) {
$file = $$ti{'dll'};
$override = 1;
}
else {
$file = $self->get_dll_template_input_file();
}
}
}
}
if (defined $file) {
my($file) = $self->search_include_path("$file.$TemplateInputExtension");
if (defined $file) {
$self->{$tag} = new TemplateInputReader($self->get_include_path());
($status, $errorString) = $self->{$tag}->read_file($file);
}
else {
if ($override) {
$status = 0;
$errorString = 'Unable to locate template input file.';
}
}
}
return $status, $errorString;
}
sub already_added {
my($self) = shift;
my($array) = shift;
my($name) = shift;
foreach my $file (@$array) {
if ($file eq $name) {
return 1;
}
}
return 0;
}
sub add_generated_files {
my($self) = shift;
my($gentype) = shift;
my($tag) = shift;
my($arr) = shift;
my($names) = $self->{$tag};
my($wanted) = $self->{'valid_components'}->{$gentype}->[0];
foreach my $name (keys %$names) {
my($comps) = $$names{$name};
foreach my $key (keys %$comps) {
my(@added) = ();
my($array) = $$comps{$key};
foreach my $i (@$arr) {
my($file) = $i;
$file =~ s/$wanted$//;
foreach my $pf (@{$self->{'generated_exts'}->{$gentype}->{'pre_filename'}}) {
foreach my $pe (@{$self->{'generated_exts'}->{$gentype}->{'pre_extension'}}) {
$self->list_generated_file($gentype, $tag, \@added, "$pf$file$pe", $i);
}
}
}
unshift(@$array, @added);
}
}
}
sub generate_default_target_names {
my($self) = shift;
if (!$self->exe_target()) {
my($sharedname) = $self->get_assignment('sharedname');
if (defined $sharedname &&
!defined $self->get_assignment('staticname')) {
$self->process_assignment('staticname', $sharedname);
}
my($staticname) = $self->get_assignment('staticname');
if (defined $staticname &&
!defined $self->get_assignment('sharedname')) {
$self->process_assignment('sharedname', $staticname);
$sharedname = $staticname;
}
## If it's neither an exe or library target, we will search
## through the source files for a main()
if (!$self->lib_target()) {
my($fh) = new FileHandle();
my($exename) = undef;
my(@sources) = $self->get_component_list('source_files', 1);
foreach my $file (@sources) {
if (open($fh, $file)) {
while(<$fh>) {
## Remove c++ comments (ignore c style comments for now)
$_ =~ s/\/\/.*//;
## Check for main
if (/(main|ACE_MAIN|ACE_WMAIN|ACE_TMAIN)\s*\(/) {
## If we found a main, set the exename to the basename
## of the cpp file with the extension removed
$exename = basename($file);
$exename =~ s/\.[^\.]+$//;
last;
}
}
close($fh);
}
## Set the exename assignment
if (defined $exename) {
$self->process_assignment('exename', $exename);
last;
}
}
## If we still don't have a project type, then we will
## default to a library if there are source files
if (!$self->exe_target() && $#sources >= 0) {
my($base) = $self->get_assignment('project_name');
$self->process_assignment('sharedname', $base);
$self->process_assignment('staticname', $base);
}
}
}
## If we are generating only static projects, then we need to
## unset the sharedname, so that we can insure that projects of
## various types only generate static targets.
if ($self->get_static() == 1) {
my($sharedname) = $self->get_assignment('sharedname');
if (defined $sharedname) {
$self->process_assignment('sharedname', undef);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -