# -*-perl-*- $description = 'Test the $(guile ...) function.'; $details = 'This only works on systems that support it.'; # If this instance of make doesn't support GNU Guile, skip it # This detects if guile is loaded using the "load" directive # $makefile = get_tmpfile(); # open(MAKEFILE, "> $makefile") || die "Failed to open $makefile: $!\n"; # print MAKEFILE q! # -load guile # all: ; @echo $(filter guile,$(.LOADED)) # !; # close(MAKEFILE) || die "Failed to write $makefile: $!\n"; # $cmd = subst_make_string("#MAKEPATH# -f $makefile"); # $log = get_logfile(0); # $code = run_command_with_output($log, $cmd); # read_file_into_string ($log) eq "guile\n" and $FEATURES{guile} = 1; # If we don't have Guile support, never mind. exists $FEATURES{guile} or return -1; # Verify simple data type conversions # Currently we don't support vectors: # echo '$(guile (vector 1 2 3))'; \ run_make_test(q! x:;@echo '$(guile #f)'; \ echo '$(guile #t)'; \ echo '$(guile #\c)'; \ echo '$(guile 1234)'; \ echo '$(guile 'foo)'; \ echo '$(guile "bar")'; \ echo '$(guile (cons 'a 'b))'; \ echo '$(guile '(a b (c . d) 1 (2) 3))' !, '', "\n#t\nc\n1234\nfoo\nbar\na b\na b c d 1 2 3"); # Verify the gmk-expand function run_make_test(q! VAR = $(guile (gmk-expand "$(shell echo hi)")) x:;@echo '$(VAR)' !, '', "hi"); # Verify the gmk-eval function run_make_test(q! $(guile (gmk-eval "VAR = hi $(shell echo there)")) x:;@echo '$(VAR)' !, '', "hi there"); # Verify the gmk-eval function with a list run_make_test(q! $(guile (gmk-eval '(VAR = 1 (2) () 3))) x:;@echo '$(VAR)' !, '', "1 2 3"); # Verify the gmk-var function run_make_test(q! VALUE = hi $(shell echo there) VAR = $(guile (gmk-var "VALUE")) x:;@echo '$(VAR)' !, '', "hi there"); # Verify the gmk-var function with a symbol run_make_test(q! VALUE = hi $(shell echo there) VAR = $(guile (gmk-var 'VALUE)) x:;@echo '$(VAR)' !, '', "hi there"); # Write a Guile program using define and run it run_make_test(q! # Define the "fib" function in Guile define fib ;; A procedure for counting the n:th Fibonacci number ;; See SICP, p. 37 (define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2)))))) endef $(guile $(fib)) # Now run it x:;@echo $(guile (fib $(FIB))) !, 'FIB=10', "55"); 1;