Cleanup ACE_HAS_PTHREAD_SIGMASK_PROTOTYPE, all platforms support it so far as I can...
[ACE_TAO.git] / ACE / bin / create_ace_build
blob987a40c47f245ce9b5d70afa182696cd25710c2f
1 eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
2     & eval 'exec perl -S $0 $argv:q'
3     if 0;
5 # Creates an ACE build tree in directory "build/<build name>" below the current
6 # directory, which must be an ACE "top level" directory (such as
7 # $ACE_ROOT).  The build tree directory structure mirrors that of the ACE
8 # top level directory structure, except that instead of containing any plain
9 # files, it contains only symlinks to the files in the ACE top level structure.
11 # This program has a similar purpose to "clone", but in addition to
12 # only creating symlinks (clone creates hard links, by default), this
13 # script:
14 # 1) uses relative rather than absolute symlinks,
15 # 2) tries not to put junk files into the build tree,
16 # 3) only creates a new tree in a build/ directory below the current,
17 #    top level ACE directory (it's a feature :-), but it does enforce
18 #    consistency).
20 # This program can be re-run on a build tree at any time in order to
21 # update it.  It will add symlinks for newly added files, and remove
22 # any that are no longer valid.
24 # If the <build name> starts with "build/", that part will be removed
25 # from it.
27 # The first three lines above let this script run without specifying the
28 # full path to perl, as long as it is in the user's PATH.
29 # Taken from perlrun man page.
31 use File::Find ();
32 use File::Basename;
33 use FileHandle;
35 print "You should consider using clone_build_tree.pl found with MPC\n";
37 $usage = "usage: $0 -? | [-a] [-d <directory mode>] [-v] <build name>\n";
38 $directory_mode = 0777;   #### Will be modified by umask, also.
39 $verbose = 0;
41 $source='.';
42 $absolute= 0;
44 $perl_version = $] + 0;
45 if ($perl_version >= 5) {
46   #### Use an eval so that this script will compile with perl4.
47   eval <<'PERL5_CWD'
48   require Cwd;
49   sub cwd {
50     Cwd::getcwd ();
51   }
52 PERL5_CWD
53 } else {
54   sub cwd {
55     local ($pwd);
57     chop ($pwd = `pwd`);
58     $pwd;
59   }
62 my($starting_dir) = cwd ();
63 my(@nlinks)       = ();
64 my($build_re)     = undef;
66 sub cab_link {
67   my($real) = shift;
68   my($fake) = shift;
69   my($uif)  = ($^O eq 'MSWin32' ? 'link' : 'symlink');
71   print "$uif $real $fake\n" if $verbose;
73   my($status) = 0;
74   if ($^O eq 'MSWin32') {
75     my($fixed) = $fake;
76     $fixed =~ s/$build_re//;
77     push(@nlinks, $fixed);
79     chdir(dirname($fake));
80     $status = link ($real, basename($fake));
81     chdir($starting_dir);
82   }
83   else {
84     $status = symlink ($real, $fake);
85   }
86   if (!$status) {
87     warn "$0: $uif to $fake failed\n";
88   }
91 ####
92 #### Process command line args.
93 ####
94 while ($#ARGV >= 0  &&  $ARGV[0] =~ /^-/) {
95   if ($ARGV[0] eq '-v') {
96     $verbose = 1;
97   } elsif ($ARGV[0] eq '-d') {
98     if ($ARGV[1] =~ /^\d+$/) {
99       $directory_mode = eval ($ARGV[1]); shift;
100     } else {
101       warn "$0:  must provide argument for -d option\n";
102       die $usage;
103     }
104   } elsif ($ARGV[0] eq '-a') {
105     $source = &cwd ();
106     $absolute = 1;
107   } elsif ($ARGV[0] eq '-?') {
108     print "$usage";
109     exit;
110   } else {
111     warn "$0:  unknown option $ARGV[0]\n";
112     die $usage;
113   }
114   shift;
117 die $usage unless $#ARGV == 0;
118 $build = $ARGV[0];
119 $build =~ s%^build[/\\]%%;        #### remove leading "build/", if any
120 $build = "build/$build";
122 ## Set up the build regular expression use under MSWin32
123 if ($^O eq 'MSWin32') {
124   ## Get the original build name
125   $build_re = $build;
127   ## Remove any trailing slashes
128   $build_re =~ s/[\\\/]+$//;
130   ## Add a single trailing slash
131   $build_re .= '/';
133   ## Escape any special characters
134   $build_re =~ s/([\\\$\[\]\(\)\.])/\\$1/g;
137 ####
138 #### Check that we're in an ACE "top level" directory.
139 ####
140 (-d 'ace' && -d 'include')  ||
141   die "$0:  must be in an ACE top level (ACE_ROOT) directory!\n";
143 ####
144 #### Create build directories, if needed.
145 ####
146 -d 'build'  ||  mkdir ('build', $directory_mode);
147 -d "$build"  ||  mkdir ("$build", $directory_mode);
149 ####
150 #### Get all ACE plain file and directory names.
151 ####
152 @files = ();
154 sub wanted {
155     my ($dev,$ino,$mode,$nlink,$uid,$gid);
157     /^CVS\z/s &&
158     ($File::Find::prune = 1)
159     ||
160     /^build\z/s &&
161     ($File::Find::prune = 1)
162     ||
163     /^\..*obj\z/s &&
164     ($File::Find::prune = 1)
165     ||
166     /^Templates\.DB\z/s &&
167     ($File::Find::prune = 1)
168     ||
169     /^Debug\z/s &&
170     ($File::Find::prune = 1)
171     ||
172     /^Release\z/s &&
173     ($File::Find::prune = 1)
174     ||
175     /^Static_Debug\z/s &&
176     ($File::Find::prune = 1)
177     ||
178     /^Static_Release\z/s &&
179     ($File::Find::prune = 1)
180     ||
181     (
182         ($nlink || (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_))) &&
183         ! -l $_ &&
184         ! /^core\z/s &&
185         ! /^.*\.state\z/s &&
186         ! /^.*\.so\z/s &&
187         ! /^.*\.[oa]\z/s &&
188         ! /^.*\.dll\z/s &&
189         ! /^.*\.lib\z/s &&
190         ! /^.*\.obj\z/s &&
191         ! /^.*~\z/s &&
192         ! /^\.\z/s &&
193         ! /^\.#.*\z/s &&
194         ! /^.*\.log\z/s
195     ) &&
196     push(@files, $File::Find::name);
199 File::Find::find({wanted => \&wanted}, '.');
201 ####
202 #### Create directories and symlinks to files.
203 ####
204 foreach $file (@files) {
205   $file =~ s%^./%%g;  #### excise leading ./ directory component
207   if (-d $file) {
208      unless (-d "$build/$file") {
209        print "mkdir $build/$file, $directory_mode\n" if $verbose;
210        mkdir ("$build/$file", $directory_mode);
211      }
212   } else {
213     unless (-e "$build/$file") {
214       if (!$absolute) {
215         $up = '../..';
216         while ($file =~ m%/%g) {
217           $up .= '/..';
218         }
220         cab_link("$up/$file", "$build/$file");
221       } else {
222         $path = $source . '/' . $file;
223         cab_link("$path", "$build/$file");
224       }
225     }
226   }
229 ####
230 #### Find all the symlinks in the build directory, and remove ones
231 #### that are no longer actually linked to a file.
232 ####
234 if ($^O eq 'MSWin32') {
235   my($lfh) = new FileHandle();
236   my($txt) = "$build/create_ace_build.links";
237   if (open($lfh, "$txt")) {
238     while(<$lfh>) {
239       my($line) = $_;
240       $line =~ s/\s+$//;
241       if (-e $line) {
242         push(@nlinks, $line);
243       }
244       else {
245         print "Removing $build/$line \n" if $verbose;
246         unlink("$build/$line") || warn "$0: unlink of $build/$line failed\n";
247       }
248     }
249     close($lfh);
250   }
252   ## Rewrite the link file.
253   unlink($txt);
254   if (open($lfh, ">$txt")) {
255     foreach my $file (@nlinks) {
256       print $lfh "$file\n";
257     }
258     close($lfh);
259   }
261 else {
262   @lfiles = ();
264   sub lcheck {
265     ## There's no way to know if we have hard linked back to a now
266     ## non-existent file.  So, just do the normal -l on the file
267     ## which will cause no files to be pushed on Windows.
268     if (-l $_) {
269       push(@lfiles, $File::Find::name);
270     }
271   }
273   File::Find::find({wanted => \&lcheck}, $build);
275   foreach (@lfiles) {
276     local @s = stat $_;
277     if ($#s == -1) {
278       print "Removing $_ \n" if $verbose;
279       unlink $_  ||  warn "$0: unlink of $_ failed\n";
280     }
281   }
284 ####
285 #### Done: print message.
286 ####
287 print "\nCompleted creation of $build/.\n";
288 my($msg) = '';
289 if (! -e "$build/ace/config.h") {
290   $msg .= "$build/ace/config.h";
293 if ($^O ne 'MSWin32' &&
294     ! -e "$build/include/makeinclude/platform_macros.GNU") {
295   if ($msg ne '') {
296     $msg .= " and\n";
297   }
298   $msg .= "$build/include/makeinclude/platform_macros.GNU";
301 if ($msg ne '') {
302   print "Be sure to setup $msg.\n";
305 #### EOF