You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2011/07/03 04:30:26 UTC

[lucy-commits] svn commit: r1142360 - in /incubator/lucy/trunk: charmonizer/Makefile charmonizer/Makefile.MSVC charmonizer/Makefile.MinGW devel/bin/gen_charmonizer_makefiles.pl

Author: marvin
Date: Sun Jul  3 02:30:26 2011
New Revision: 1142360

URL: http://svn.apache.org/viewvc?rev=1142360&view=rev
Log:
Abstract out link commands using Perl OO rather than Make.

Perl string manipulation backed by Perl OO allows more precise control over
the command which gets issued than Make's variable interpolation.  This is
important because the whitespace in how the target gets specified is
significant and varies across different operating systems and linkers.

This commit should restore Unix compatibility.

Modified:
    incubator/lucy/trunk/charmonizer/Makefile
    incubator/lucy/trunk/charmonizer/Makefile.MSVC
    incubator/lucy/trunk/charmonizer/Makefile.MinGW
    incubator/lucy/trunk/devel/bin/gen_charmonizer_makefiles.pl

Modified: incubator/lucy/trunk/charmonizer/Makefile
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/charmonizer/Makefile?rev=1142360&r1=1142359&r2=1142360&view=diff
==============================================================================
--- incubator/lucy/trunk/charmonizer/Makefile (original)
+++ incubator/lucy/trunk/charmonizer/Makefile Sun Jul  3 02:30:26 2011
@@ -18,9 +18,6 @@
 CC= cc
 DEFS=
 CFLAGS= -Isrc $(DEFS)
-LINKER= $(CC)
-LINKFLAGS= $(CFLAGS)
-LINKOUT= -o
 
 .c.o:
 	$(CC) $(CFLAGS) -c $*.c -o $@
@@ -40,32 +37,32 @@ CLEANABLE= $(OBJS) $(PROGNAME) $(TEST_OB
 all: $(PROGNAME)
 
 $(PROGNAME): $(OBJS)
-	$(LINKER) $(LINKFLAGS) $(OBJS) $(LINKOUT)"$(PROGNAME)"
+	$(CC) $(CFLAGS) $(OBJS) -o $(PROGNAME)
 
 $(OBJS) $(TEST_OBJS): $(HEADERS)
 
 tests: $(TESTS)
 
 TestDirManip: src/Charmonizer/Test.o src/Charmonizer/Test/TestDirManip.o
-	$(LINKER) $(LINKFLAGS) src/Charmonizer/Test.o src/Charmonizer/Test/TestDirManip.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src/Charmonizer/Test/TestDirManip.o src/Charmonizer/Test.o -o $@
 
 TestFuncMacro: src/Charmonizer/Test.o src/Charmonizer/Test/TestFuncMacro.o
-	$(LINKER) $(LINKFLAGS) src/Charmonizer/Test.o src/Charmonizer/Test/TestFuncMacro.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src/Charmonizer/Test/TestFuncMacro.o src/Charmonizer/Test.o -o $@
 
 TestHeaders: src/Charmonizer/Test.o src/Charmonizer/Test/TestHeaders.o
-	$(LINKER) $(LINKFLAGS) src/Charmonizer/Test.o src/Charmonizer/Test/TestHeaders.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src/Charmonizer/Test/TestHeaders.o src/Charmonizer/Test.o -o $@
 
 TestIntegers: src/Charmonizer/Test.o src/Charmonizer/Test/TestIntegers.o
-	$(LINKER) $(LINKFLAGS) src/Charmonizer/Test.o src/Charmonizer/Test/TestIntegers.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src/Charmonizer/Test/TestIntegers.o src/Charmonizer/Test.o -o $@
 
 TestLargeFiles: src/Charmonizer/Test.o src/Charmonizer/Test/TestLargeFiles.o
-	$(LINKER) $(LINKFLAGS) src/Charmonizer/Test.o src/Charmonizer/Test/TestLargeFiles.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src/Charmonizer/Test/TestLargeFiles.o src/Charmonizer/Test.o -o $@
 
 TestUnusedVars: src/Charmonizer/Test.o src/Charmonizer/Test/TestUnusedVars.o
-	$(LINKER) $(LINKFLAGS) src/Charmonizer/Test.o src/Charmonizer/Test/TestUnusedVars.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src/Charmonizer/Test/TestUnusedVars.o src/Charmonizer/Test.o -o $@
 
 TestVariadicMacros: src/Charmonizer/Test.o src/Charmonizer/Test/TestVariadicMacros.o
-	$(LINKER) $(LINKFLAGS) src/Charmonizer/Test.o src/Charmonizer/Test/TestVariadicMacros.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src/Charmonizer/Test/TestVariadicMacros.o src/Charmonizer/Test.o -o $@
 
 clean:
 	rm -f $(CLEANABLE)

Modified: incubator/lucy/trunk/charmonizer/Makefile.MSVC
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/charmonizer/Makefile.MSVC?rev=1142360&r1=1142359&r2=1142360&view=diff
==============================================================================
--- incubator/lucy/trunk/charmonizer/Makefile.MSVC (original)
+++ incubator/lucy/trunk/charmonizer/Makefile.MSVC Sun Jul  3 02:30:26 2011
@@ -18,9 +18,6 @@
 CC= cl
 DEFS=
 CFLAGS= -Isrc -nologo -D_CRT_SECURE_NO_WARNINGS $(DEFS)
-LINKER= link
-LINKFLAGS= -nologo
-LINKOUT= /OUT:
 
 .c.obj:
 	$(CC) $(CFLAGS) -c $< -Fo$@
@@ -40,32 +37,32 @@ CLEANABLE= $(OBJS) $(PROGNAME) $(TEST_OB
 all: $(PROGNAME)
 
 $(PROGNAME): $(OBJS)
-	$(LINKER) $(LINKFLAGS) $(OBJS) $(LINKOUT)"$(PROGNAME)"
+	link -nologo $(OBJS) /OUT:$(PROGNAME)
 
 $(OBJS) $(TEST_OBJS): $(HEADERS)
 
 tests: $(TESTS)
 
 TestDirManip.exe: src\Charmonizer\Test.obj src\Charmonizer\Test\TestDirManip.obj
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.obj src\Charmonizer\Test\TestDirManip.obj $(LINKOUT)"$@"
+	link -nologo src\Charmonizer\Test\TestDirManip.obj src\Charmonizer\Test.obj /OUT:$@
 
 TestFuncMacro.exe: src\Charmonizer\Test.obj src\Charmonizer\Test\TestFuncMacro.obj
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.obj src\Charmonizer\Test\TestFuncMacro.obj $(LINKOUT)"$@"
+	link -nologo src\Charmonizer\Test\TestFuncMacro.obj src\Charmonizer\Test.obj /OUT:$@
 
 TestHeaders.exe: src\Charmonizer\Test.obj src\Charmonizer\Test\TestHeaders.obj
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.obj src\Charmonizer\Test\TestHeaders.obj $(LINKOUT)"$@"
+	link -nologo src\Charmonizer\Test\TestHeaders.obj src\Charmonizer\Test.obj /OUT:$@
 
 TestIntegers.exe: src\Charmonizer\Test.obj src\Charmonizer\Test\TestIntegers.obj
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.obj src\Charmonizer\Test\TestIntegers.obj $(LINKOUT)"$@"
+	link -nologo src\Charmonizer\Test\TestIntegers.obj src\Charmonizer\Test.obj /OUT:$@
 
 TestLargeFiles.exe: src\Charmonizer\Test.obj src\Charmonizer\Test\TestLargeFiles.obj
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.obj src\Charmonizer\Test\TestLargeFiles.obj $(LINKOUT)"$@"
+	link -nologo src\Charmonizer\Test\TestLargeFiles.obj src\Charmonizer\Test.obj /OUT:$@
 
 TestUnusedVars.exe: src\Charmonizer\Test.obj src\Charmonizer\Test\TestUnusedVars.obj
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.obj src\Charmonizer\Test\TestUnusedVars.obj $(LINKOUT)"$@"
+	link -nologo src\Charmonizer\Test\TestUnusedVars.obj src\Charmonizer\Test.obj /OUT:$@
 
 TestVariadicMacros.exe: src\Charmonizer\Test.obj src\Charmonizer\Test\TestVariadicMacros.obj
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.obj src\Charmonizer\Test\TestVariadicMacros.obj $(LINKOUT)"$@"
+	link -nologo src\Charmonizer\Test\TestVariadicMacros.obj src\Charmonizer\Test.obj /OUT:$@
 
 clean:
 	CMD /c FOR %i IN ($(CLEANABLE)) DO IF EXIST %i DEL /F %i

Modified: incubator/lucy/trunk/charmonizer/Makefile.MinGW
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/charmonizer/Makefile.MinGW?rev=1142360&r1=1142359&r2=1142360&view=diff
==============================================================================
--- incubator/lucy/trunk/charmonizer/Makefile.MinGW (original)
+++ incubator/lucy/trunk/charmonizer/Makefile.MinGW Sun Jul  3 02:30:26 2011
@@ -18,9 +18,6 @@
 CC= gcc
 DEFS=
 CFLAGS= -Isrc $(DEFS)
-LINKER= $(CC)
-LINKFLAGS= $(CFLAGS)
-LINKOUT= -o
 
 .c.o:
 	$(CC) $(CFLAGS) -c $*.c -o $@
@@ -40,32 +37,32 @@ CLEANABLE= $(OBJS) $(PROGNAME) $(TEST_OB
 all: $(PROGNAME)
 
 $(PROGNAME): $(OBJS)
-	$(LINKER) $(LINKFLAGS) $(OBJS) $(LINKOUT)"$(PROGNAME)"
+	$(CC) $(CFLAGS) $(OBJS) -o $(PROGNAME)
 
 $(OBJS) $(TEST_OBJS): $(HEADERS)
 
 tests: $(TESTS)
 
 TestDirManip.exe: src\Charmonizer\Test.o src\Charmonizer\Test\TestDirManip.o
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.o src\Charmonizer\Test\TestDirManip.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src\Charmonizer\Test\TestDirManip.o src\Charmonizer\Test.o -o $@
 
 TestFuncMacro.exe: src\Charmonizer\Test.o src\Charmonizer\Test\TestFuncMacro.o
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.o src\Charmonizer\Test\TestFuncMacro.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src\Charmonizer\Test\TestFuncMacro.o src\Charmonizer\Test.o -o $@
 
 TestHeaders.exe: src\Charmonizer\Test.o src\Charmonizer\Test\TestHeaders.o
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.o src\Charmonizer\Test\TestHeaders.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src\Charmonizer\Test\TestHeaders.o src\Charmonizer\Test.o -o $@
 
 TestIntegers.exe: src\Charmonizer\Test.o src\Charmonizer\Test\TestIntegers.o
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.o src\Charmonizer\Test\TestIntegers.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src\Charmonizer\Test\TestIntegers.o src\Charmonizer\Test.o -o $@
 
 TestLargeFiles.exe: src\Charmonizer\Test.o src\Charmonizer\Test\TestLargeFiles.o
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.o src\Charmonizer\Test\TestLargeFiles.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src\Charmonizer\Test\TestLargeFiles.o src\Charmonizer\Test.o -o $@
 
 TestUnusedVars.exe: src\Charmonizer\Test.o src\Charmonizer\Test\TestUnusedVars.o
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.o src\Charmonizer\Test\TestUnusedVars.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src\Charmonizer\Test\TestUnusedVars.o src\Charmonizer\Test.o -o $@
 
 TestVariadicMacros.exe: src\Charmonizer\Test.o src\Charmonizer\Test\TestVariadicMacros.o
-	$(LINKER) $(LINKFLAGS) src\Charmonizer\Test.o src\Charmonizer\Test\TestVariadicMacros.o $(LINKOUT)"$@"
+	$(CC) $(CFLAGS) src\Charmonizer\Test\TestVariadicMacros.o src\Charmonizer\Test.o -o $@
 
 clean:
 	CMD /c FOR %i IN ($(CLEANABLE)) DO IF EXIST %i DEL /F %i

Modified: incubator/lucy/trunk/devel/bin/gen_charmonizer_makefiles.pl
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/devel/bin/gen_charmonizer_makefiles.pl?rev=1142360&r1=1142359&r2=1142360&view=diff
==============================================================================
--- incubator/lucy/trunk/devel/bin/gen_charmonizer_makefiles.pl (original)
+++ incubator/lucy/trunk/devel/bin/gen_charmonizer_makefiles.pl Sun Jul  3 02:30:26 2011
@@ -88,6 +88,12 @@ sub objectify {
     return @objects;
 }
 
+sub build_link_command {
+    my ( $self, %args ) = @_;
+    my $objects = join( " ", @{ $args{objects} } );
+    return "\$(CC) \$(CFLAGS) $objects -o $args{target}";
+}
+
 sub test_execs {
     my $self = shift;
     my @test_execs = grep { $_ !~ /Test\.c/ } @_; # skip Test.c entry
@@ -105,10 +111,13 @@ sub test_blocks {
         my $exe = $c_file; 
         $exe =~ s/.*(Test\w+)\.c$/$1$self->{exe_ext}/ or die "no match $exe";
         my ($obj) = $self->objectify($c_file);
-        push @blocks, <<END_BLOCK;
-$exe: src/Charmonizer/Test$self->{obj_ext} $obj
-\t\$(LINKER) \$(LINKFLAGS) src/Charmonizer/Test$self->{obj_ext} $obj \$(LINKOUT)"\$@"
-END_BLOCK
+        my ($test_obj)
+            = $self->pathify( $self->objectify("src/Charmonizer/Test.c") );
+        my $link_command = $self->build_link_command(
+            objects => [ $obj, $test_obj ],
+            target  => '$@',
+        );
+        push @blocks, qq|$exe: $test_obj $obj\n\t$link_command|;
     }
     return @blocks;
 }
@@ -127,6 +136,10 @@ sub gen_makefile {
     my ( $self, %args ) = @_;
     open my $fh, ">", $args{file} or die "open '$args{file}' failed: $!\n";
     my $license = $self->license;
+    my $progname_link_command = $self->build_link_command(
+        objects => ['$(OBJS)'],
+        target  => '$(PROGNAME)',
+    );
     my $content = <<EOT;
 # GENERATED BY $FindBin::Script: do not hand-edit!!!
 #
@@ -147,13 +160,14 @@ CLEANABLE= \$(OBJS) \$(PROGNAME) \$(TEST
 all: \$(PROGNAME)
 
 \$(PROGNAME): \$(OBJS)
-	\$(LINKER) \$(LINKFLAGS) \$(OBJS) \$(LINKOUT)"\$(PROGNAME)"
+\t$progname_link_command
 
 \$(OBJS) \$(TEST_OBJS): \$(HEADERS)
 
 tests: \$(TESTS)
 
 $args{test_blocks}
+
 $args{clean_target}
 
 EOT
@@ -172,7 +186,7 @@ sub write_makefile {
         objs         => join(" ", $self->pathify(@objects)),
         test_objs    => join(" ", $self->pathify(@test_objects)),
         headers      => join(" ", $self->pathify( @{ $self->{h_files} } ) ),
-        test_blocks  => join("\n", $self->pathify(@test_blocks)),
+        test_blocks  => join("\n\n", @test_blocks),
         top          => $self->top,
         clean_target => $self->clean_target,
         file         => $self->{filename},
@@ -216,9 +230,6 @@ sub top {
 CC= cc
 DEFS=
 CFLAGS= -Isrc \$(DEFS)
-LINKER= \$(CC)
-LINKFLAGS= \$(CFLAGS)
-LINKOUT= -o
 
 .c.o:
 \t\$(CC) \$(CFLAGS) -c \$*.c -o \$@
@@ -247,15 +258,18 @@ sub top {
 CC= cl
 DEFS=
 CFLAGS= -Isrc -nologo -D_CRT_SECURE_NO_WARNINGS \$(DEFS)
-LINKER= link
-LINKFLAGS= -nologo
-LINKOUT= /OUT:
 
 .c.obj:
 \t\$(CC) \$(CFLAGS) -c \$< -Fo\$@
 END_STUFF
 }
 
+sub build_link_command {
+    my ( $self, %args ) = @_;
+    my $objects = join( " ", @{ $args{objects} } );
+    return "link -nologo $objects /OUT:$args{target}";
+}
+
 sub pathify      { shift->winnify(@_) }
 sub clean_target { shift->clean_target_win }
 
@@ -277,9 +291,6 @@ sub top {
 CC= gcc
 DEFS=
 CFLAGS= -Isrc \$(DEFS)
-LINKER= \$(CC)
-LINKFLAGS= \$(CFLAGS)
-LINKOUT= -o
 
 .c.o:
 \t\$(CC) \$(CFLAGS) -c \$*.c -o \$@