On Tue, 29 Oct 2002, Andy Dougherty wrote:

> On Tue, 29 Oct 2002, Andy Dougherty wrote:
> 
> > Here's my proposal for stage one:  This patch is intended to define
> > explicitly what the different compiler and linker commands and flags
> > are, what they are supposed to mean, and how they are to be used.

I've gotten a little feedback.  Here's my proposed patch.  I added yet
more documentation and cleaned up config/gen/makefiles/root.in to use the
variables consistently.  Also, with the new link_out variable, the stack
direction test should work again with MS Visual C.  It might even work
with VMS, though lots of other things still won't.  I had to make some
guesses for all those systems.

I did not fix up Makefiles in different sub-directories or any other build
commands that are part of the test suite.  Nor did I generalize the
stackdir.pl stuff to a generic Configure function.  One thing at a time.

diff -r -u parrot-orig/config/auto/stackdir.pl parrot-andy/config/auto/stackdir.pl
--- parrot-orig/config/auto/stackdir.pl Mon Oct 21 09:44:36 2002
+++ parrot-andy/config/auto/stackdir.pl Thu Oct 31 11:57:03 2002
@@ -18,19 +18,33 @@
     genfile('config/auto/stackdir/test1_c.in', 'test1.c');
     genfile('config/auto/stackdir/test2_c.in', 'test2.c');
     
-    my($cc, $ccflags, $ldout, $o, $link, $linkflags, 
-          $cc_exe_out, $exe, $libs) =
-       Configure::Data->get( qw(cc ccflags ld_out o link linkflags 
-           cc_exe_out exe libs) );
+    my($cc, $ccflags, $cc_c, $cc_inc, $o, $link, $linkflags,
+          $link_out, $exe, $libs) =
+       Configure::Data->get( qw(cc ccflags cc_c cc_inc o link linkflags 
+           link_out exe libs) );
        
-    system("$cc $ccflags -I./include -c test0.c >test0.cco $redir_err") and 
-        die "C compiler failed (see test0.cco)";
-    system("$cc $ccflags -I./include -c test1.c >test1.cco $redir_err") and 
-        die "C compiler failed (see test1.cco)";
-    system("$cc $ccflags -I./include -c test2.c >test2.cco $redir_err") and 
-        die "C compiler failed (see test2.cco)";
-    system("$link $linkflags ${cc_exe_out}test$exe test0$o test1$o test2$o $libs 
>test.ldo $redir_err") and 
-       die "Linker failed (see test.ldo)";
+    # XXX VMS syntax is only a guess!
+    # (The main issue is what to do about redirecting errors.)
+    if ($^O =~ /VMS/) {
+       system("$cc $ccflags $cc_inc $cc_c test0.c") and 
+           die "C compiler failed for test0.c.";
+       system("$cc $ccflags $cc_inc $cc_c test1.c") and 
+           die "C compiler failed for test1.c.";
+       system("$cc $ccflags $cc_inc $cc_c test2.c") and 
+           die "C compiler failed for test2.c.";
+       system("$link $linkflags ${link_out}test$exe test0$o,test1$o,test2$o $libs") 
+and 
+           die "Linker failed for stack direction test.";
+    }
+    else {
+       system("$cc $ccflags $cc_inc $cc_c test0.c >test0.cco $redir_err") and 
+           die "C compiler failed (see test0.cco)";
+       system("$cc $ccflags $cc_inc $cc_c test1.c >test1.cco $redir_err") and 
+           die "C compiler failed (see test1.cco)";
+       system("$cc $ccflags $cc_inc $cc_c test2.c >test2.cco $redir_err") and 
+           die "C compiler failed (see test2.cco)";
+       system("$link $linkflags ${link_out}test$exe test0$o test1$o test2$o $libs 
+>test.ldo $redir_err") and 
+           die "Linker failed (see test.ldo)";
+    }
 
   my %results=eval cc_run();
   cc_clean();
diff -r -u parrot-orig/config/gen/makefiles/root.in 
parrot-andy/config/gen/makefiles/root.in
--- parrot-orig/config/gen/makefiles/root.in    Mon Oct 28 12:25:36 2002
+++ parrot-andy/config/gen/makefiles/root.in    Thu Oct 31 10:00:21 2002
@@ -7,8 +7,9 @@
 RANLIB = ${ranlib}
 LINK = ${link}
 LD = ${ld}
+# link_out and ld_out might have trailing spaces, so they are handled
+# by the input file, config/gen/makefiles/root.in.
 LD_SHARED = ${ld_shared}
-LD_OUT = ${ld_out}
 LD_SHARED_FLAGS=${ld_shared_flags}
 
 INC=include/parrot
@@ -168,7 +169,7 @@
 mops : examples/assembly/mops${exe} examples/mops/mops${exe}
 
 $(TEST_PROG) : test_main$(O) $(GEN_HEADERS) $(O_DIRS) $(O_FILES) 
lib/Parrot/OpLib/core.pm
-       $(LINK) ${ld_out}$(TEST_PROG) $(LINKFLAGS) $(O_FILES) test_main$(O) $(C_LIBS)
+       $(LINK) ${link_out}$(TEST_PROG) $(LINKFLAGS) $(O_FILES) test_main$(O) $(C_LIBS)
 
 lib_deps_object : $(O_DIRS) $(O_FILES)
        $(PERL) tools/dev/lib_deps.pl object $(O_FILES)
@@ -201,17 +202,17 @@
        $(RANLIB) $@
 
 blib/lib/libparrot$(SO) : blib/lib $(O_DIRS) $(O_FILES)
-       $(LD) $(LD_SHARED) $(LD_SHARED_FLAGS) $(LDFLAGS) 
$(LD_OUT)blib/lib/libparrot$(SO) $(O_FILES) $(C_LIBS)
+       $(LD) $(LD_SHARED) $(LD_SHARED_FLAGS) $(LDFLAGS) 
+${ld_out}blib/lib/libparrot$(SO) $(O_FILES) $(C_LIBS)
 
 $(TEST_PROG_SO) : test_main$(O) blib/lib/libparrot$(SO) lib/Parrot/OpLib/core.pm
-       $(LINK) $(LINKFLAGS) $(LD_OUT)$(TEST_PROG) test_main$(O) 
blib/lib/libparrot$(A) $(C_LIBS)
+       $(LINK) $(LINKFLAGS) ${link_out}$(TEST_PROG) test_main$(O) 
+blib/lib/libparrot$(A) $(C_LIBS)
 
 # XXX The dependancies on SO.MAJOR.MINOR and SO.VERSION are removed
 #     because those should be done at "make install" and not "make shared"
 #     It also makes the task of getting this working on win32 much easier. :)
 #
 #blib/lib/libparrot$(SO).${VERSION} : blib/lib $(O_DIRS) $(O_FILES)
-#      $(LD) $(LD_SHARED) -Wl,-soname,libparrot$(SO).${MAJOR} $(LDFLAGS) 
$(LD_OUT)blib/lib/libparrot$(SO).${VERSION} $(O_FILES)
+#      $(LD) $(LD_SHARED) -Wl,-soname,libparrot$(SO).${MAJOR} $(LDFLAGS) 
+${ld_out}blib/lib/libparrot$(SO).${VERSION} $(O_FILES)
 #
 #blib/lib/libparrot$(SO).${MAJOR}.${MINOR} : blib/lib/libparrot$(SO).${VERSION}
 #      $(RM_F) $@
@@ -226,7 +227,7 @@
 #      cd blib/lib; ln -s libparrot$(SO).${MAJOR} libparrot$(SO)
 #
 #blib/lib/libcore_prederef$(SO).${VERSION} : blib/lib core_ops_prederef$(O)
-#      $(LD) $(LD_SHARED) -Wl,-soname,libparrot$(SO).${MAJOR} $(LDFLAGS) 
$(LD_OUT)blib/lib/libcore_prederef$(SO).${VERSION} core_ops_prederef$(O)
+#      $(LD) $(LD_SHARED) -Wl,-soname,libparrot$(SO).${MAJOR} $(LDFLAGS) 
+${ld_out}blib/lib/libcore_prederef$(SO).${VERSION} core_ops_prederef$(O)
 #
 #blib/lib/libcore_prederef$(SO).${MAJOR}.${MINOR} : 
blib/lib/libcore_prederef$(SO).${VERSION}
 #      $(RM_F) $@
@@ -249,7 +250,7 @@
 pdb$(O) : $(GENERAL_H_FILES)
 
 $(PDB) : pdb$(O) $(O_DIRS) $(O_FILES)
-       $(LINK) ${ld_out}$(PDB) pdb$(O) $(LINKFLAGS) $(O_FILES) $(C_LIBS)
+       $(LINK) ${link_out}$(PDB) pdb$(O) $(LINKFLAGS) $(O_FILES) $(C_LIBS)
 
 #
 # Parrot Disassembler
@@ -259,14 +260,14 @@
 disassemble$(O) : $(GENERAL_H_FILES)
 
 $(DIS) : disassemble$(O) $(O_DIRS) $(O_FILES)
-       $(LINK) ${ld_out}$(DIS) disassemble$(O) $(LINKFLAGS) $(O_FILES) $(C_LIBS)
+       $(LINK) ${link_out}$(DIS) disassemble$(O) $(LINKFLAGS) $(O_FILES) $(C_LIBS)
 
 #
 # Parrot Dump
 #
 
 $(PDUMP) : pdump$(O) packdump$(O) $(O_FILES) $(O_DIRS)
-       $(LINK) ${ld_out}$(PDUMP) pdump$(O) packdump$(O) $(LINKFLAGS) $(O_FILES) 
$(C_LIBS)
+       $(LINK) ${link_out}$(PDUMP) pdump$(O) packdump$(O) $(LINKFLAGS) $(O_FILES) 
+$(C_LIBS)
 
 
 ###############################################################################
@@ -296,7 +297,7 @@
        $(PERL) pbc2c.pl examples/assembly/mops.pbc > examples/assembly/mops.c
 
 examples/assembly/mops${exe} : examples/assembly/mops$(O) $(O_DIRS) $(O_FILES)
-       $(LINK) $(LINKFLAGS) ${ld_out}examples/assembly/mops${exe} 
examples/assembly/mops$(O) $(O_FILES) $(C_LIBS)
+       $(LINK) $(LINKFLAGS) ${link_out}examples/assembly/mops${exe} 
+examples/assembly/mops$(O) $(O_FILES) $(C_LIBS)
 
 examples/assembly/life.pbc : examples/assembly/life.pasm assemble.pl
        cd examples && cd assembly && $(MAKE) life.pbc PERL=$(PERL) && cd .. && cd ..
@@ -305,7 +306,7 @@
        $(PERL) pbc2c.pl examples/assembly/life.pbc > examples/assembly/life.c
 
 examples/assembly/life${exe} : examples/assembly/life$(O) $(O_DIRS) $(O_FILES)
-       $(LINK) $(LINKFLAGS) ${ld_out}examples/assembly/life${exe} 
examples/assembly/life$(O) $(O_FILES) $(C_LIBS)
+       $(LINK) $(LINKFLAGS) ${link_out}examples/assembly/life${exe} 
+examples/assembly/life$(O) $(O_FILES) $(C_LIBS)
 
 ###############################################################################
 #
@@ -316,7 +317,7 @@
 examples/mops/mops$(O) : examples/mops/mops.c
 
 examples/mops/mops${exe} : examples/mops/mops$(O)
-       $(LINK) $(LINKFLAGS) ${ld_out}examples/mops/mops${exe} \
+       $(LINK) $(LINKFLAGS) ${link_out}examples/mops/mops${exe} \
        examples/mops/mops$(O) blib/lib/libparrot$(A) $(C_LIBS)
 
 
diff -r -u parrot-orig/config/init/data.pl parrot-andy/config/init/data.pl
--- parrot-orig/config/init/data.pl     Thu Sep 12 10:39:22 2002
+++ parrot-andy/config/init/data.pl     Thu Oct 31 10:14:35 2002
@@ -20,44 +20,76 @@
   my(%c)=(
     debugging     => $debugging ? 1 : 0,
 
+    # Flags for compiling, linking, and building shared libraries.
+    # Note that for some systems, a space may be required between an
+    # output flag and the target (e.g. cc -o foo), while for
+    # other systems, no space might be allowed 
+    # (e.g. link /exe=foo.exe).  Therefore, several of the "output"
+    # variables below have trailing spaces.  Be careful to keep them.
+
     # Compiler -- used to turn .c files into object files.
     # (Usually cc or cl, or something like that.)
+    # Compile C source files with
+    #    $cc $ccflags $cc_inc $cc_debug $cc_warn $cc_c ${cc_c_out} file$o file.c
+    # If you want this object file to be part of a shared library,
+    # then you need to compile instead with
+    #    $cc $ccflags $cc_inc $cc_debug $cc_warn $cc_dlflags $cc_c ${cc_c_out}file$o 
+file.c
+    # These Unix-ish defaults should be overridden by hints files
+    # as necessary for Win32, VMS, and other non-Unix systems.
     cc            => $Config{cc},
     ccflags       => $Config{ccflags},
+    cc_c          => '-c',      # Empty for VMS.
+    cc_inc       => "-I./include",  # How to pick up parrot includes.
+                                     # XXX Won't work in subdirectories!
+                                    # We need to use File::Spec.
+    cc_debug      => '-g',
+    cc_warn       => '',
+    cc_dlflags    => $Config{cccdlflags}, # Flags necessary to compile
+                               # this file for use in a shared library.
+    cc_o_out      => '-o ',     # cc object output file.  XXX Is this portable?
+    cc_exe_out    => '-o ',     # cc executable output file.  Don't use this.
+                               # Use $link to create executables.
+    cc_ldflags    => '',        # prefix for ldflags (necessary for Win32) 
+                               # Huh?  This isn't used anywhere.
+                               # Don't use this.  I don't know what it means.
 
     # Linker, used to link object files (plus libraries) into
     # an executable.  It is usually $cc on Unix-ish systems.
     # VMS and Win32 might use "Link". 
     # Perl5's Configure doesn't distinguish linking from loading, so
     # make a reasonable guess at defaults.
+    # Create an executable with
+    #  $link $linkflags $link_debug ${link_out}file${exe} file${o} $libs
+    # If you have multiple object files, VMS needs to have them
+    # separated by commas, like this:  (and all on one line)
+    #  $link $linkflags $link_debug ${link_out}file${exe} \
+    #          file1${o},file2${o} $libs
     link          => $Config{cc},
     linkflags     => $Config{ldflags},
+    link_debug    => '',
+    link_out      => '-o ',    # linker output file.
 
     # ld:  Tool used to build dynamically loadable libraries.  Often
     # $cc on Unix-ish systems, but apparently sometimes it's ld.
+    # XXX The exact usage has not been determined yet.
     ld            => $Config{ld},
     ldflags       => $Config{ldflags},
+    ld_out        => '-o ',    # ld output file.
+    ld_debug      => '',        # include debug info in executable
+    ld_shared     => $Config{lddlflags},  # Any flags specifically
+                                # needed to instruct ld to create
+                               # a shared libary.
+    ld_shared_flags=> '',      # What is this, exactly?  For GNU ld, it was
+                               # '-Wl,-soname,libparrot$(SO)'
     
     libs          => $Config{libs},
     
-    cc_inc       => "-I./include",
-    cc_debug      => '-g',
-    link_debug    => '',
-    cc_warn       => '',
     o             => '.o',                # object files extension
-    so            => '.so',               # dynamic link library or shared object 
extension
+    so            => '.so',               # dynamic link library or 
+                                         # shared object extension
     a             => '.a',                # library or archive extension
     exe           => $Config{_exe},       # executable files extension
-    cc_o_out      => '-o ',               # cc object output file
-    cc_exe_out    => '-o ',               # cc executable output file (different on 
Win32)
-    
-    cc_ldflags    => '',                  # prefix for ldflags (necessary for Win32)
     
-    ld_out        => '-o ',               # ld output file
-    ld_debug      => '',                  # include debug info in executable
-    ld_shared     => $Config{lddlflags}, 
-    ld_shared_flags=> '', # What is this, exactly?  For GNU ld, it was
-    # '-Wl,-soname,libparrot$(SO)'
 
     # should we have a dependancy upon arc to generate .a's?
     blib_lib_libparrot_a => 'blib/lib/libparrot$(A)',
diff -r -u parrot-orig/config/init/hints/darwin.pl 
parrot-andy/config/init/hints/darwin.pl
--- parrot-orig/config/init/hints/darwin.pl     Fri Jun  7 15:21:17 2002
+++ parrot-andy/config/init/hints/darwin.pl     Thu Oct 31 08:57:22 2002
@@ -4,6 +4,9 @@
 $ccflags =~ s/-flat_namespace\s*//;
 $ldflags =~ s/-flat_namespace\s*//;
 $ldflags .= " -flat_namespace ";
+# Guess at what's needed for linking.  (See config/init/data.pl.)
+$linkflags =~ s/-flat_namespace\s*//;
+$linkflags .= " -flat_namespace ";
 
 Configure::Data->set(
   ccflags => $ccflags,
diff -r -u parrot-orig/config/init/hints/mswin32.pl 
parrot-andy/config/init/hints/mswin32.pl
--- parrot-orig/config/init/hints/mswin32.pl    Wed Oct 16 16:32:21 2002
+++ parrot-andy/config/init/hints/mswin32.pl    Thu Oct 31 10:03:45 2002
@@ -1,3 +1,4 @@
+# See config/init/data.pl for definitions of the various variables.
 {
        my($cc, $ccflags, $libs)=Configure::Data->get(qw(cc ccflags libs));
        my $is_msvc  = grep { $cc eq $_ } ( qw(cl cl.exe) );
@@ -24,16 +25,25 @@
                        so         => '.dll',
                        a          => '.lib',
                        o          => '.obj',
+                       # Compiler flags
                        cc_o_out   => '-Fo',
-                       cc_exe_out => '-Fe',
-                       cc_ldflags => '/link',
-                                     #Use Edit and Continue debugging if available
+                       cc_exe_out => '-Fe',  # Shouldn't be used.
+                       cc_ldflags => '/link', # Unused.
+                       #Use Edit and Continue debugging if available
                        cc_debug   => ($cc_output =~ /-ZI/? '-ZI' : '-Zi'),
+
+                       # Shared-library builder flags
                        ld_debug   => '-debug',
                        ld_shared  => '-dll',
                        ld_shared_flags=> '-def:libparrot.def',
                        ld_out     => '-out:',
                        ldflags    => '-nologo',
+                       
+                       # Linker flags
+                       linkflags  => '-nologo',
+                       link_debug => '-debug',
+                       link_out => '-out:',
+                       
                        blib_lib_libparrot_a => '',
                        cp         => 'copy',
                        slash      => '\\',
@@ -46,19 +56,27 @@
        if( $is_bcc ) {
                Configure::Data->set(
                        o => '.obj',
+                       # Compiler flags
                        ccflags => '-O2 -w-8066 -DWIN32 -DNO_STRICT -DNDEBUG 
-D_CONSOLE',
-                       cc_o_out => '-o',
-                       cc_exe_out => '-e',
+                       cc_o_out => '-o '
+                       cc_exe_out => '-e', # Shouldn't be used.
+                       cc_ldflags => '',   # Unused.
                        cc_debug => '-v',
                        
+                       # Shared-library builder flags XXX CHECK THESE!
                        ld => 'bcc32.exe',
                        ldflags => '',
                        ld_out => '-e',
-                       cc_ldflags => '',
                        ld_debug => '-v',
                        ld_shared => '-WD',
                        libs => 'import32.lib cw32.lib',
                        
+                       # Linker flags XXX CHECK THESE!
+                       link => 'bcc32.exe',
+                       linkflags  => '',
+                       link_debug => '-v',
+                       link_out => '-e',
+                       
                        cp => 'copy',
                        slash => '\\'
                );
@@ -70,4 +88,4 @@
                        libs => $libs
                );
        }
-}
\ No newline at end of file
+}
diff -r -u parrot-orig/config/init/hints/os2.pl parrot-andy/config/init/hints/os2.pl
--- parrot-orig/config/init/hints/os2.pl        Fri May 24 02:24:27 2002
+++ parrot-andy/config/init/hints/os2.pl        Thu Oct 31 09:14:10 2002
@@ -8,5 +8,6 @@
   opcode_t =>"long",
   ccflags => "-I. -fno-strict-aliasing -mieee-fp -I./include",
   ldflags => "-Zexe",
+  linkflags => "-Zexe",
   perl => "perl" # avoids case-mangling in make
 );
diff -r -u parrot-orig/config/init/hints/vms.pl parrot-andy/config/init/hints/vms.pl
--- parrot-orig/config/init/hints/vms.pl        Fri May 24 02:24:27 2002
+++ parrot-andy/config/init/hints/vms.pl        Thu Oct 31 11:54:17 2002
@@ -1,12 +1,25 @@
+# See config/init/data.pl for definitions of the various variables.
 Configure::Data->set(
   ccflags => 
qq{/Standard=Relaxed_ANSI/Prefix=All/Obj=.obj/NoList/NOANSI_ALIAS/include="./include"},
   perl    => "MCR $^X",
-  exe     => "exe"
+  exe     => "exe",
+  # Compiler flags
+  cc_c    => '', 
+  cc_inc  => '/INCLUDE=[.include]',
+  # Linker flags
+  link    => "link",
+  link_out => '/exe='
 );
 
 {
   local $^W;           #no warnings on redefinition
 
+  # Ultimately, we should try to move these back to
+  # Parrot::Configure::Step.  The abstractions required would likely
+  # be useful for supporting cross-compilation as well.
+  # (Apart from error re-directions issues, the first one probably
+  # already could be moved back now that Configure properly
+  # distinguishes among cc, link, and ld.)
   *Parrot::Configure::Step::cc_build=sub {
     system("$c{cc} $c{ccflags} test.c") and die "C compiler died!";
     system("link/exe=test test") and die "Link failed!";

-- 
    Andy Dougherty              [EMAIL PROTECTED]

Reply via email to