On Fri, 19 Nov 2004, Andy Dougherty wrote: > On Fri, 19 Nov 2004, Dan Sugalski wrote: > > > So, if someone'd like to take a shot at thumping the template > > makefile bits to add in compilers/p6ge to the basic build, that'd be > > great. Grovelling over the code in there to scrub out portability > > issues would also be good. > > I'll take a look at this.
Ok, here's a first pass. Most of it is pretty straightforward, but one thing is worth noting: The code uses both signed and unsigned chars, with and without the 'const' qualifier. I gather this is a deliberate part of a carefully considered overall design. Unfortunately, it's hard to get it to interact smoothly with system headers and functions. I put in various casts to pacify Sun's cc compiler. I fully expect that Linux/gcc folks might notice even more squawking after applying my patch than before because that compiler will complain about a completely different set of conversions. Without understanding the underlying design, I don't know offhand what to recommend, but this patch works for me and highlights spots where some further thought might be needed. diff -r -u -H -P parrot-orig/MANIFEST parrot-andy/MANIFEST --- parrot-orig/MANIFEST Fri Nov 19 10:58:42 2004 +++ parrot-andy/MANIFEST Fri Nov 19 13:04:40 2004 @@ -123,7 +123,6 @@ classes/unmanagedstruct.pmc [] classes/version.pmc [] classes/vtablecache.pmc [] -compilers/p6ge/Makefile [] compilers/p6ge/README [] compilers/p6ge/demo.pir [] compilers/p6ge/p6ge.h [] @@ -211,6 +210,7 @@ config/gen/makefiles/miniperl.in [] config/gen/makefiles/ook.in [] config/gen/makefiles/perl6.in [] +config/gen/makefiles/p6ge.in [] config/gen/makefiles/root.in [] config/gen/makefiles/scheme.in [] config/gen/makefiles/tcl.in [] diff -r -u -H -P parrot-orig/compilers/p6ge/p6ge_gen.c parrot-andy/compilers/p6ge/p6ge_gen.c --- parrot-orig/compilers/p6ge/p6ge_gen.c Fri Nov 19 08:53:40 2004 +++ parrot-andy/compilers/p6ge/p6ge_gen.c Fri Nov 19 14:43:43 2004 @@ -81,7 +81,7 @@ /* strcon(...) converts string values into PIR string constants */ static char* -strcon(const char* s, int len) +strcon(const unsigned char* s, int len) { static char esc[P6GE_MAX_LITERAL_LEN * 2 + 3]; char* t = esc; diff -r -u -H -P parrot-orig/compilers/p6ge/p6ge_parse.c parrot-andy/compilers/p6ge/p6ge_parse.c --- parrot-orig/compilers/p6ge/p6ge_parse.c Fri Nov 19 08:53:40 2004 +++ parrot-andy/compilers/p6ge/p6ge_parse.c Fri Nov 19 14:41:41 2004 @@ -22,6 +22,7 @@ #include <ctype.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> int p6ge_ctype[256]; int p6ge_cmeta[256]; @@ -62,7 +63,7 @@ p6ge_parse_error(P6GE_Text* t, const char* msg) { printf("%s at offset %d (found '%c')\n", msg, t->pos - t->text, *(t->pos)); - t->pos = ""; + t->pos = NULL; } @@ -231,7 +232,7 @@ p6ge_parse_error(t, "Missing { after ** quantifier"); p6ge_skip(t, 1); if (isdigit(*(t->pos))) { - q->min = q->max = atoi(t->pos); + q->min = q->max = atoi((char *) t->pos); while (isdigit(*(t->pos))) t->pos++; p6ge_skip(t, 0); } else p6ge_parse_error(t, "Missing min value in **{} quantifier"); @@ -239,7 +240,7 @@ p6ge_skip(t, 2); if (t->pos[0] == '.') { q->max = P6GE_INF; p6ge_skip(t, 1); } else if (isdigit(*(t->pos))) { - q->max = atoi(t->pos); + q->max = atoi((char *) t->pos); while (isdigit(*(t->pos))) t->pos++; p6ge_skip(t, 0); } @@ -296,8 +297,8 @@ { P6GE_Text t; P6GE_Exp* e = 0; - t.text = s; - t.pos = s; + t.text = (unsigned const char *) s; + t.pos = (unsigned const char *) s; t.capture = 0; t.ncapture = 0; return p6ge_parse_expr(&t); @@ -361,6 +362,8 @@ Initial version by Patrick R. Michaud, 2004.11.16 =cut + +*/ /* * Local variables: diff -r -u -H -P parrot-orig/compilers/p6ge/p6ge_parsep5.c parrot-andy/compilers/p6ge/p6ge_parsep5.c --- parrot-orig/compilers/p6ge/p6ge_parsep5.c Fri Nov 19 08:53:40 2004 +++ parrot-andy/compilers/p6ge/p6ge_parsep5.c Fri Nov 19 14:47:37 2004 @@ -22,6 +22,7 @@ #include <ctype.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> static P6GE_Exp* p5re_parse_expr(P6GE_Text* t); @@ -29,7 +30,7 @@ p5re_parse_error(P6GE_Text* t, const char* msg) { printf("%s at offset %d (found '%c')\n", msg, t->pos - t->text, *(t->pos)); - t->pos = ""; + t->pos = NULL; } @@ -143,14 +144,14 @@ else if (c == '*') { q->min = 0; q->max = P6GE_INF; } else if (c == '{') { if (isdigit(*(t->pos))) { - q->min = q->max = atoi(t->pos); + q->min = q->max = atoi((char *) t->pos); while (isdigit(*(t->pos))) t->pos++; p5re_skip(t, 0); } else p5re_parse_error(t, "Missing min value in {} quantifier"); if (t->pos[0] == ',') { p5re_skip(t, 1); if (isdigit(*(t->pos))) { - q->max = atoi(t->pos); + q->max = atoi((char *) t->pos); while (isdigit(*(t->pos))) t->pos++; p5re_skip(t, 0); } @@ -207,8 +208,8 @@ { P6GE_Text t; P6GE_Exp* e = 0; - t.text = s; - t.pos = s; + t.text = (unsigned char *) s; + t.pos = (unsigned char *) s; t.capture = 0; t.ncapture = 0; return p5re_parse_expr(&t); @@ -226,6 +227,8 @@ Initial version by Patrick R. Michaud, 2004.11.16 =cut + +*/ /* * Local variables: diff -r -u -H -P parrot-orig/config/gen/makefiles/p6ge.in parrot-andy/config/gen/makefiles/p6ge.in --- parrot-orig/config/gen/makefiles/p6ge.in Wed Dec 31 19:00:00 1969 +++ parrot-andy/config/gen/makefiles/p6ge.in Fri Nov 19 14:34:06 2004 @@ -0,0 +1,75 @@ +# $Id: p6ge.in,v $ + +# Setup some commands +LN_S = ${lns} +PERL = ${perl} +RM_RF = ${rm_rf} +PARROT = ..${slash}..${slash}parrot${exe} +CP = ${cp} + +# Where to put things +PARROT_RUNTIME = ..${slash}..${slash}runtime${slash}parrot${slash}dynext + +# Compile commands and flags +CC = ${cc} +CC_SHARED = ${cc_shared} # e.g. -fpic +DEBUG = ${cc_debug} +WARN = ${ccwarn} +CFLAGS = ${ccflags} $(CC_SHARED) -I..${slash}..${slash}include $(DEBUG) $(WARN) +O = ${o} + +# Linker command and flags +LINK = ${link} +LINKFLAGS = ${linkflags} + +# Shared-library and dynamically-loadable module building +# XXX Which one is this? +LD = ${ld} +LDFLAGS = ${ldflags} +LD_SHARE_FLAGS = ${ld_share_flags} # e.g. -shared +SO = ${share_ext} +LD_LOAD_FLAGS = ${ld_load_flags} + +# the default target +all: $(PARROT_RUNTIME)${slash}p6ge$(SO) + +$(PARROT_RUNTIME)${slash}p6ge$(SO): p6ge$(SO) + $(CP) p6ge$(SO) $(PARROT_RUNTIME) + +p6ge$(SO): p6ge_parse$(O) p6ge_gen$(O) p6ge_parsep5$(O) + $(LD) $(LD_SHARE_FLAGS) $(LDFLAGS) -o p6ge$(SO) p6ge_parse$(O) p6ge_gen$(O) p6ge_parsep5$(O) + +p6ge_gen$(O): p6ge_gen.c p6ge.h +p6ge_parse$(O): p6ge_parse.c p6ge.h +p6ge_parsep5$(O): p6ge_parsep5.c p6ge.h + +# This is a listing of all targets, that are meant to be called by users +help: + @echo "" + @echo "Following targets are available for the user:" + @echo "" + @echo " all: p6ge.so" + @echo " This is the default." + @echo "Testing:" + @echo " test: Run the test suite." + @echo " (Doesn't work yet.)" + @echo "" + @echo "Cleaning:" + @echo " clean: Basic cleaning up." + @echo " realclean: Removes also files generated by 'Configure.pl'" + @echo " distclean: Remove everything not in MANIFEST." + @echo "" + @echo "Misc:" + @echo " help: Print this help message." + @echo "" + +test: all + @echo "make test not supported yet." + +clean: + $(RM_RF) *$(O) p6ge$(SO) + +realclean: clean + $(RM_RF) Makefile + +distclean: realclean diff -r -u -H -P parrot-orig/config/gen/makefiles.pl parrot-andy/config/gen/makefiles.pl --- parrot-orig/config/gen/makefiles.pl Mon Sep 13 03:00:07 2004 +++ parrot-andy/config/gen/makefiles.pl Fri Nov 19 13:07:15 2004 @@ -53,6 +53,8 @@ commentType => '#', replace_slashes => 1, conditioned_lines => 1); genfile('config/gen/makefiles/imcc.in', 'imcc/Makefile', commentType => '#', replace_slashes => 1); + genfile('config/gen/makefiles/p6ge.in', 'compilers/p6ge/Makefile', + commentType => '#', replace_slashes => 1); genfile('config/gen/makefiles/languages.in', 'languages/Makefile', commentType => '#', replace_slashes => 1); genfile('config/gen/makefiles/jako.in', 'languages/jako/Makefile', diff -r -u -H -P parrot-orig/config/init/data.pl parrot-andy/config/init/data.pl --- parrot-orig/config/init/data.pl Fri Oct 8 13:40:37 2004 +++ parrot-andy/config/init/data.pl Fri Nov 19 13:22:46 2004 @@ -75,9 +75,12 @@ ld => $Config{ld}, ldflags => $Config{ldflags}, - # Shared libraries + # Some operating systems (e.g. Darwin) distinguish between shared libraries and + # modules that can be dynamically loaded. + # Flags to tell ld to build a shared library, e.g. -shared for GNU ld. ld_share_flags => $Config{lddlflags}, + # Flags to tell ld to build a dynamically loadable module, e.g. -shared for GNU ld. # Dynamically loadable modules ld_load_flags => $Config{lddlflags}, @@ -87,10 +90,10 @@ cc_debug => '-g', link_debug => '', - o => '.o', # object files extension - share_ext => '.so', # shared library extension - load_ext => '.so', # dynamically loadable module extension - a => '.a', # library or archive extension + o => $Config{_o}, # object files extension + share_ext => ".$Config{so}", # shared library extension + load_ext => ".$Config{so}", # dynamically loadable module extension + a => $Config{_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) @@ -124,6 +127,7 @@ as => 'as', # assembler cp => 'cp', + lns => $Config{lns}, # soft link slash => '/', VERSION => $main::parrot_version, -- Andy Dougherty [EMAIL PROTECTED]