updating make rules

This commit is contained in:
Alex Shinn 2009-04-03 00:24:17 +09:00
parent 4736dcaa6d
commit 72886b897f
3 changed files with 118 additions and 89 deletions

View file

@ -3,7 +3,14 @@
all: chibi-scheme all: chibi-scheme
CFLAGS=-Wall -g -fno-inline -save-temps #-Os PREFIX=/usr/local
BINDIR=$(PREFIX)/bin
LIBDIR=$(PREFIX)/lib
INCDIR=$(PREFIX)/include/chibi-scheme
MODDIR=$(PREFIX)/share/chibi-scheme
SO=.dylib
CFLAGS=-Wall -g -fno-inline -save-temps -Os
GC_OBJ=./gc/gc.a GC_OBJ=./gc/gc.a
@ -16,10 +23,16 @@ sexp.o: sexp.c sexp.h config.h defaults.h Makefile
eval.o: eval.c debug.c opcodes.c eval.h sexp.h config.h defaults.h Makefile eval.o: eval.c debug.c opcodes.c eval.h sexp.h config.h defaults.h Makefile
gcc -c $(CFLAGS) -o $@ $< gcc -c $(CFLAGS) -o $@ $<
# main.o: main.c eval.h sexp.h config.h Makefile main.o: main.c eval.c debug.c opcodes.c eval.h sexp.h config.h defaults.h Makefile
# gcc -c $(CFLAGS) -o $@ $< gcc -c $(CFLAGS) -o $@ $<
chibi-scheme: eval.o sexp.o $(GC_OBJ) libchibisexp.$(SO): sexp.o $(GC_OBJ)
gcc $(LDFLAGS) -shared -dynamiclib -o $@ $^
libchibischeme.$(SO): eval.o $(GC_OBJ)
gcc $(LDFLAGS) -shared -dynamiclib -o $@ $^ -lchibisexp
chibi-scheme: main.o sexp.o $(GC_OBJ)
gcc $(CFLAGS) -o $@ $^ gcc $(CFLAGS) -o $@ $^
clean: clean:
@ -39,3 +52,17 @@ test: chibi-scheme
fi; \ fi; \
done done
install: chibi-scheme
cp chibi-scheme $(BINDIR)/
mkdir -p $(MODDIR)
cp init.scm $(MODDIR)/
mkdir -p $(INCDIR)
cp *.h $(INCDIR)/
cp *.$(SO) $(LIBDIR)/
uninstall:
rm -f $(BINDIR)/chibi-scheme
rm -f $(LIBDIR)/libchibischeme.$(SO)
rm -f $(LIBDIR)/libchibisexp.$(SO)
rm -f $(INCDIR)/*.h
rm -f $(MODDIR)/*.scm

85
eval.c
View file

@ -1745,88 +1745,3 @@ void scheme_init () {
final_resumer = finalize_bytecode(context); final_resumer = finalize_bytecode(context);
} }
} }
void repl (sexp context) {
sexp obj, res, env, in, out, err;
env = sexp_context_env(context);
in = env_global_ref(env, the_cur_in_symbol, SEXP_FALSE);
out = env_global_ref(env, the_cur_out_symbol, SEXP_FALSE);
err = env_global_ref(env, the_cur_err_symbol, SEXP_FALSE);
while (1) {
sexp_write_string("> ", out);
sexp_flush(out);
obj = sexp_read(in);
if (obj == SEXP_EOF)
break;
if (sexp_exceptionp(obj)) {
sexp_print_exception(obj, err);
} else {
res = eval_in_context(obj, context);
if (res != SEXP_UNDEF) {
sexp_write(res, out);
sexp_write_char('\n', out);
}
}
}
}
void run_main (int argc, char **argv) {
sexp env, obj, out=NULL, res, context, err_handler;
sexp_uint_t i, quit=0, init_loaded=0;
env = sexp_make_standard_env(sexp_make_integer(5));
context = sexp_make_context(NULL, env);
sexp_context_tailp(context) = 0;
emit_push(SEXP_UNDEF, context);
emit(OP_DONE, context);
err_handler = sexp_make_procedure(sexp_make_integer(0),
sexp_make_integer(0),
finalize_bytecode(context),
sexp_make_vector(0, SEXP_UNDEF));
env_define(env, the_err_handler_symbol, err_handler);
/* parse options */
for (i=1; i < argc && argv[i][0] == '-'; i++) {
switch (argv[i][1]) {
case 'e':
case 'p':
if (! init_loaded) {
sexp_load(sexp_c_string(sexp_init_file), env);
init_loaded = 1;
}
obj = sexp_read_from_string(argv[i+1]);
res = eval_in_context(obj, context);
if (argv[i][1] == 'p') {
if (! out)
out = env_global_ref(env, the_cur_out_symbol, SEXP_FALSE);
sexp_write(res, out);
sexp_write_char('\n', out);
}
quit=1;
i++;
break;
case 'q':
init_loaded = 1;
break;
default:
errx(1, "unknown option: %s", argv[i]);
}
}
if (! quit) {
if (! init_loaded)
sexp_load(sexp_c_string(sexp_init_file), env);
if (i < argc)
for ( ; i < argc; i++)
sexp_load(sexp_c_string(argv[i]), env);
else
repl(context);
}
}
int main (int argc, char **argv) {
scheme_init();
run_main(argc, argv);
return 0;
}

87
main.c Normal file
View file

@ -0,0 +1,87 @@
#include "eval.c"
void repl (sexp context) {
sexp obj, res, env, in, out, err;
env = sexp_context_env(context);
in = env_global_ref(env, the_cur_in_symbol, SEXP_FALSE);
out = env_global_ref(env, the_cur_out_symbol, SEXP_FALSE);
err = env_global_ref(env, the_cur_err_symbol, SEXP_FALSE);
while (1) {
sexp_write_string("> ", out);
sexp_flush(out);
obj = sexp_read(in);
if (obj == SEXP_EOF)
break;
if (sexp_exceptionp(obj)) {
sexp_print_exception(obj, err);
} else {
res = eval_in_context(obj, context);
if (res != SEXP_UNDEF) {
sexp_write(res, out);
sexp_write_char('\n', out);
}
}
}
}
void run_main (int argc, char **argv) {
sexp env, obj, out=NULL, res, context, err_handler;
sexp_uint_t i, quit=0, init_loaded=0;
env = sexp_make_standard_env(sexp_make_integer(5));
context = sexp_make_context(NULL, env);
sexp_context_tailp(context) = 0;
emit_push(SEXP_UNDEF, context);
emit(OP_DONE, context);
err_handler = sexp_make_procedure(sexp_make_integer(0),
sexp_make_integer(0),
finalize_bytecode(context),
sexp_make_vector(0, SEXP_UNDEF));
env_define(env, the_err_handler_symbol, err_handler);
/* parse options */
for (i=1; i < argc && argv[i][0] == '-'; i++) {
switch (argv[i][1]) {
case 'e':
case 'p':
if (! init_loaded) {
sexp_load(sexp_c_string(sexp_init_file), env);
init_loaded = 1;
}
obj = sexp_read_from_string(argv[i+1]);
res = eval_in_context(obj, context);
if (argv[i][1] == 'p') {
if (! out)
out = env_global_ref(env, the_cur_out_symbol, SEXP_FALSE);
sexp_write(res, out);
sexp_write_char('\n', out);
}
quit=1;
i++;
break;
case 'q':
init_loaded = 1;
break;
default:
errx(1, "unknown option: %s", argv[i]);
}
}
if (! quit) {
if (! init_loaded)
sexp_load(sexp_c_string(sexp_init_file), env);
if (i < argc)
for ( ; i < argc; i++)
sexp_load(sexp_c_string(argv[i]), env);
else
repl(context);
}
}
int main (int argc, char **argv) {
scheme_init();
run_main(argc, argv);
return 0;
}