gnuaceworkspacecreator.pm

来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· PM 代码 · 共 224 行

PM
224
字号
package GNUACEWorkspaceCreator;# ************************************************************# Description   : A GNU Workspace (GNUmakefile) creator for ACE# Author        : Chad Elliott# Create Date   : 5/13/2002# ************************************************************# ************************************************************# Pragmas# ************************************************************use strict;use GNUACEProjectCreator;use MakeWorkspaceBase;use WorkspaceCreator;use vars qw(@ISA);@ISA = qw(MakeWorkspaceBase WorkspaceCreator);# ************************************************************# Data Section# ************************************************************my($base) = 'GNUmakefile';# ************************************************************# Subroutine Section# ************************************************************sub targets {  return 'clean depend idl_stubs realclean';}sub generate_implicit_project_dependencies {  #my($self) = shift;  return 1;}sub workspace_file_prefix {  #my($self) = shift;  return $base;}sub pre_workspace {  my($self) = shift;  my($fh)   = shift;  my($crlf) = $self->crlf();  print $fh '# -*- makefile -*-', $crlf;  $self->workspace_preamble($fh, $crlf, 'GNU ACE Workspace',                            '$Id: GNUACEWorkspaceCreator.pm 77499 2007-03-02 18:19:05Z elliott_c $');  print $fh 'MAKEFILE = ', $self->get_modified_workspace_name($base, '', 1),            $crlf;}    sub write_project_targets {  my($self)   = shift;  my($fh)     = shift;  my($crlf)   = shift;  my($target) = shift;  my($list)   = shift;  foreach my $project (@$list) {    my($dname) = $self->mpc_dirname($project);    my($chdir) = ($dname ne '.');    print $fh "\t\@",              ($chdir ? "cd $dname && " : ''),              "\$(MAKE) -f ",              ($chdir ? $self->mpc_basename($project) : $project),              " $target$crlf";  }}sub write_comps {  my($self)    = shift;  my($fh)      = shift;  my($crlf)    = $self->crlf();  my(%targnum) = ();  my($pjs)     = $self->get_project_info();  my($named)   = !defined $ENV{MPC_GNUACE_DIRECTORY_DEPS};  my(@list)    = $self->number_target_deps($self->get_projects(),                                           $pjs, \%targnum,                                           $named ? 0 : 1);  ## Print out some preliminary information  print $fh $crlf,            "ifeq (\$(findstring k,\$(MAKEFLAGS)),k)$crlf",            "  KEEP_GOING = -$crlf",            "endif$crlf$crlf",            "include \$(ACE_ROOT)/include/makeinclude/macros.GNU$crlf";  if ($named) {    $self->write_named_targets($fh, $crlf, \%targnum, \@list,                               'REMAINING_TARGETS := ' .                               '$(subst all, , $(TARGETS_NESTED:.nested=)) $(CUSTOM_TARGETS)' .                               "$crlf$crlf\$(REMAINING_TARGETS)", '', '',                               $self->project_target_translation(1), 1);  }  else {    ## Determine the ordering of the sub-directories    my(@dirs)  = ();    my(%found) = ();    foreach my $file (reverse @list) {      my($dir) = $self->get_first_level_directory($file);      if ($dir ne '.') {        if (!defined $found{$dir}) {          $found{$dir} = 1;          unshift(@dirs, $dir);        }      }    }    my($need_dirs) = ($#dirs > -1);    ## Store the local projects in a separate list    my(@lprj)   = ();    my(%dirprj) = ();    foreach my $project (@list) {      if ($project !~ /\//) {        push(@lprj, $project);        if ($need_dirs && defined $targnum{$project}) {          foreach my $number (@{$targnum{$project}}) {            if ($list[$number] =~ /\//) {              ## If any local project depends on a project that is not              ## in this directory, we can not rely on the directory              ## recursion to get the correct dependencies.  We will do              ## all projects as local targets.              @lprj = ();              foreach my $prj (@list) {                push(@lprj, $prj);                if ($prj =~ /\//) {                  $dirprj{$prj} = 1;                }              }              $need_dirs = 0;              last;            }          }          if (!$need_dirs) {            last;          }        }      }    }    if ($#lprj >= 0) {      ## Print out the all target first.  This will allow multiple projects      ## within the same directory to build in parallel.      print $fh 'all:';      foreach my $project (@lprj) {        print $fh ' ', $$pjs{$project}->[0];      }      print $fh $crlf;      if ($need_dirs) {        foreach my $dir (@dirs) {          print $fh "\t\$(KEEP_GOING)\@cd $dir && ",                    "\$(MAKE) -f \$(MAKEFILE) \$(\@)$crlf";        }      }      ## Print out each target separately.  Make can decide on which      ## targets can be built in parallel because we add the local      ## dependencies.      foreach my $project (@lprj) {        print $fh $crlf, '.PHONY: ', $$pjs{$project}->[0],                  $crlf, $$pjs{$project}->[0], ':';        if (defined $targnum{$project}) {          foreach my $number (@{$targnum{$project}}) {            print $fh ' ', $$pjs{$list[$number]}->[0];          }        }        print $fh $crlf,                  "\t\$(KEEP_GOING)\@";        if (defined $dirprj{$project}) {          print $fh "cd ", $self->mpc_dirname($project),                    " && \$(MAKE) -f ", $self->mpc_basename($project),                    $crlf;        }        else {          print $fh "\$(MAKE) -f $project$crlf";        }      }      print $fh $crlf,                'REMAINING_TARGETS := ',                '$(subst all, , $(TARGETS_NESTED:.nested=)) $(CUSTOM_TARGETS)',                $crlf;    }    else {      print $fh 'REMAINING_TARGETS := $(TARGETS_NESTED:.nested=) ',                '$(CUSTOM_TARGETS)', $crlf;    }    ## Print out the remaing targets.    ## They will be handled serially by make.    print $fh "\$(REMAINING_TARGETS):$crlf";    foreach my $project (@lprj) {      print $fh "\t\$(KEEP_GOING)\@";      if (defined $dirprj{$project}) {        print $fh "cd ", $self->mpc_dirname($project),                  " && \$(MAKE) -f ", $self->mpc_basename($project),                  " \$(\@)", $crlf;      }      else {        print $fh "\$(MAKE) -f $project \$(\@)$crlf";      }    }    if ($need_dirs) {      foreach my $dir (@dirs) {        print $fh "\t\$(KEEP_GOING)\@cd $dir && ",                  "\$(MAKE) -f \$(MAKEFILE) \$(\@)$crlf";      }    }    print $fh $crlf;  }}1;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?