📄 projectcreator.pm
字号:
$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 = "ERROR: Invalid assignment name: $name";
last;
}
}
}
}
}
return $status, $errorString;
}
sub handle_scoped_end {
my($self) = shift;
my($types) = shift;
my($flags) = shift;
foreach my $type (@$types) {
if (!defined $self->{'type_specific_assign'}->{$type}) {
$self->{'type_specific_assign'}->{$type} = {};
}
foreach my $key (keys %$flags) {
$self->{'type_specific_assign'}->{$type}->{$key} = $$flags{$key};
}
}
}
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 'libs' || $name eq 'libpaths' || $name eq 'includes') {
my($nval) = $self->get_assignment($name, $assign);
if (defined $nval) {
my($parts) = $self->create_array($nval);
my(%seen) = ();
my($value) = '';
foreach my $part (reverse @$parts) {
if (!defined $seen{$part}) {
$value = "$part $value";
$seen{$part} = 1;
}
}
$self->process_assignment($name, $value, $assign);
}
}
}
sub read_template_input {
my($self) = shift;
my($status) = 1;
my($errorString) = '';
my($file) = undef;
my($tag) = undef;
my($ti) = $self->get_ti_override();
my($override) = 0;
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");
}
}
}
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()
my(@sources) = $self->get_component_list('source_files');
if (!$self->lib_target()) {
my($fh) = new FileHandle();
my($exename) = undef;
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);
}
}
}
sub generate_default_pch_filenames {
my($self) = shift;
my($files) = shift;
my($pname) = $self->escape_regex_special(
$self->get_assignment('project_name'));
if (!defined $self->get_assignment('pch_header')) {
my($count) = 0;
my($matching) = undef;
foreach my $file (@$files) {
foreach my $ext (@{$self->{'valid_components'}->{'header_files'}}) {
if ($file =~ /(.*_pch$ext)$/) {
$self->process_assignment('pch_header', $1);
++$count;
if ($file =~ /$pname/) {
$matching = $file;
}
last;
}
}
}
if ($count > 1 && defined $matching) {
$self->process_assignment('pch_header', $matching);
}
}
if (!defined $self->get_assignment('pch_source')) {
my($count) = 0;
my($matching) = undef;
foreach my $file (@$files) {
foreach my $ext (@{$self->{'valid_components'}->{'source_files'}}) {
if ($file =~ /(.*_pch$ext)$/) {
$self->process_assignment('pch_source', $1);
++$count;
if ($file =~ /$pname/) {
$matching = $file;
}
last;
}
}
}
if ($count > 1 && defined $matching) {
$self->process_assignment('pch_source', $matching);
}
}
}
sub fix_pch_filenames {
my($self) = shift;
foreach my $type ('pch_header', 'pch_source') {
my($pch) = $self->get_assignment($type);
if (defined $pch && $pch eq '') {
$self->process_assignment($type, undef);
}
}
}
sub remove_extra_pch_listings {
my($self) = shift;
my(@pchs) = ('pch_header', 'pch_source');
my(@tags) = ('header_files', 'source_files');
for(my $j = 0; $j <= $#pchs; ++$j) {
my($pch) = $self->get_assignment($pchs[$j]);
if (defined $pch) {
## If we are converting slashes, then we need to
## convert the pch file back to forward slashes
if ($self->{'convert_slashes'}) {
$pch =~ s/\\/\//g;
}
## Find out which files are duplicated
my($names) = $self->{$tags[$j]};
foreach my $name (keys %$names) {
my($comps) = $$names{$name};
foreach my $key (keys %$comps) {
my($array) = $$comps{$key};
my($count) = scalar(@$array);
for(my $i = 0; $i < $count; ++$i) {
if ($pch eq $$array[$i]) {
splice(@$array, $i, 1);
--$count;
}
}
}
}
}
}
}
sub is_special_tag {
my($self) = shift;
my($tag) = shift;
foreach my $t (@specialComponents) {
if ($tag eq $t) {
return 1;
}
}
return 0;
}
sub sift_files {
my($self) = shift;
my($files) = shift;
my($exts) = shift;
my($pchh) = shift;
my($pchc) = shift;
my($tag) = shift;
my($array) = shift;
my(@saved) = ();
my($ec) = $self->{'exclude_components'};
foreach my $file (@$files) {
foreach my $ext (@$exts) {
## Always exclude the precompiled header and cpp
if ($file =~ /$ext$/ && (!defined $pchh || $file ne $pchh) &&
(!defined $pchc || $file ne $pchc)) {
my($exclude) = 0;
if (defined $$ec{$tag}) {
my($excludes) = $$ec{$tag};
foreach my $exc (@$excludes) {
if ($file =~ /$exc$/) {
$exclude = 1;
last;
}
}
}
elsif ($tag eq 'resource_files') {
## Save these files for later. There may
## be more than one and we want to try and
## find the one that corresponds to this project
$exclude = 1;
push(@saved, $file);
}
if (!$exclude) {
if (!$self->already_added($array, $file)) {
push(@$array, $file);
}
}
last;
}
}
}
## Now deal with the saved files
if (defined $saved[0]) {
if ($#saved == 0) {
## Theres only one rc file, take it
push(@$array, $saved[0]);
}
else {
my($unescaped) = $self->transform_file_name(
$self->get_assignment('project_name'));
my($pjname) = $self->escape_regex_special($unescaped);
foreach my $save (@saved) {
my($file) = $self->escape_regex_special($save);
if ($unescaped =~ /$file/ || $save =~ /$pjname/) {
if (!$self->already_added($array, $save)) {
push(@$array, $save);
}
}
}
}
}
}
sub generate_default_components {
my($self) = shift;
my($files) = shift;
my($passed) = shift;
my($vc) = $self->{'valid_components'};
my(@tags) = (defined $passed ? $passed : keys %$vc);
my($pchh) = $self->get_assignment('pch_header');
my($pchc) = $self->get_assignment('pch_source');
foreach my $tag (@tags) {
my($exts) = $$vc{$tag};
if (defined $$exts[0]) {
if (defined $self->{$tag}) {
## If the tag is defined, then process directories
my($names) = $self->{$tag};
foreach my $name (keys %$names) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -