Author: marvin
Date: Mon Jun 11 23:49:43 2012
New Revision: 1349071
URL: http://svn.apache.org/viewvc?rev=1349071&view=rev
Log:
Add ability to create a Charmonizer "meld".
Add "meld.pl", which consolidates all Core charmonizer files, selected
Probes, and arbitrary user-specified files into one C source file.
Added:
lucy/trunk/charmonizer/buildbin/
lucy/trunk/charmonizer/buildbin/meld.pl (with props)
Added: lucy/trunk/charmonizer/buildbin/meld.pl
URL:
http://svn.apache.org/viewvc/lucy/trunk/charmonizer/buildbin/meld.pl?rev=1349071&view=auto
==============================================================================
--- lucy/trunk/charmonizer/buildbin/meld.pl (added)
+++ lucy/trunk/charmonizer/buildbin/meld.pl Mon Jun 11 23:49:43 2012
@@ -0,0 +1,179 @@
+#!/usr/bin/perl
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+use strict;
+use warnings;
+
+use Getopt::Long;
+use File::Spec::Functions qw( rel2abs catdir catfile updir );
+use FindBin qw( $Bin );
+use File::stat qw( stat );
+
+# Process command line arguments.
+my ( @probes, @user_files, @charm_files );
+my $outfile;
+GetOptions(
+ 'probes:s' => \@probes,
+ 'files=s' => \@user_files,
+ 'out=s' => \$outfile,
+);
+my $usage = <<END_USAGE;
+Usage:
+
+ meld.pl --files=FILES [--probes=PROBES] --out=OUTFILE
+
+ * probes -- A comma separated list of Charmonizer Probe names, e.g.
+ "Integers", "Integers,Floats,LargeFiles". Defaults to all probes if not
+ supplied.
+ * files -- A comma separated list of files to be appended verbatim. At
+ least one file must be present and it must define main().
+ * out -- The output file.
+
+END_USAGE
+die $usage unless @user_files;
+die $usage unless $outfile;
+$outfile = rel2abs($outfile);
+@user_files = split( /,/, join( ',', @user_files ) );
+@probes = split( /,/, join( ',', @probes ) );
+@user_files = map { rel2abs($_) } @user_files;
+
+# Make sure we are in the charmonizer dir.
+chdir( catdir( $Bin, updir() ) );
+
+# Default to including all Probes.
+if ( !@probes ) {
+ my $probe_dir = catdir(qw( src Charmonizer Probe ));
+ opendir( my $dh, $probe_dir ) or die "Can't opendir '$probe_dir': $!";
+ @probes = map { $_ =~ s/\.c$//; $_ } grep {/\.c$/} readdir $dh;
+}
+
+# Add Core headers.
+for (qw( Defines Compiler ConfWriter HeaderChecker OperatingSystem Util )) {
+ push @charm_files, catfile( qw( src Charmonizer Core ), "$_.h" );
+}
+push @charm_files, catfile(qw( src Charmonizer Probe.h ));
+
+# Add specified Probe headers in lexically sorted order.
+for ( sort @probes ) {
+ push @charm_files, catfile( qw( src Charmonizer Probe ), "$_.h" );
+}
+
+# Add Core implementation files.
+for (qw( Compiler ConfWriter HeaderChecker OperatingSystem Util )) {
+ push @charm_files, catfile( qw( src Charmonizer Core ), "$_.c" );
+}
+push @charm_files, catfile(qw( src Charmonizer Probe.c ));
+
+# Add Probe implementation files in lexically sorted order.
+for ( sort @probes ) {
+ push @charm_files, catfile( qw( src Charmonizer Probe ), "$_.c" );
+}
+
+# Don't write out unless there has been an update.
+if ( -e $outfile ) {
+ my $outfile_mtime = stat($outfile)->mtime;
+ my $needs_update;
+ for my $dependency ( @charm_files, @user_files ) {
+ die "Can't find '$dependency'" unless -e $dependency;
+ if ( stat($dependency)->mtime > $outfile_mtime ) {
+ $needs_update = 1;
+ last;
+ }
+ }
+ if ($needs_update) {
+ unlink $outfile;
+ }
+ else {
+ exit;
+ }
+}
+
+# Start the composite.
+open( my $out_fh, '>', $outfile )
+ or die "Can't open '$outfile': $!";
+print $out_fh meld_start();
+
+# Process core files.
+for my $file (@charm_files) {
+ print $out_fh pare_charm_file($file);
+}
+
+# Process user specified files.
+for my $file (@user_files) {
+ my $content = slurp($file);
+
+ # Remove pound-includes for files being inlined.
+ $content =~ s/^#include "Charmonizer[^\n]+\n//msg;
+
+ print $out_fh $content;
+}
+
+close $out_fh or die "Can't close '$outfile': $!";
+exit;
+
+sub pare_charm_file {
+ my $path = shift;
+ my $content = slurp($path);
+
+ # Strip license header.
+ $content =~ s#/\* Licensed to the Apache.+?\*/\n+##s
+ or die "Couldn't find ASF license header in '$path'";
+
+ # Remove C++ guards (if this is a header).
+ $content =~ s/^#ifdef __cplusplus.*?#endif\n+//msg;
+
+ # Remove pound-includes for files being inlined.
+ $content =~ s/^#include "Charmonizer[^\n]+\n//msg;
+
+ print <<END_STUFF;
+/***************************************************************************/
+
+$content
+END_STUFF
+}
+
+sub slurp {
+ my $path = shift;
+ open( my $fh, '<', $path ) or die "Can't open '$path': $!";
+ return do { local $/; <$fh> };
+}
+
+sub meld_start {
+ return <<END_STUFF;
+/* This is an auto-generated file -- do not edit directly. */
+
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define CHAZ_USE_SHORT_NAMES
+
+END_STUFF
+}
+
Propchange: lucy/trunk/charmonizer/buildbin/meld.pl
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: lucy/trunk/charmonizer/buildbin/meld.pl
------------------------------------------------------------------------------
svn:executable = *