#!/usr/local/bin/sagittarius

#!read-macro=sagittarius/regex
(import (rnrs) (sagittarius control)
	(sagittarius regex))

(define *installed-version* "0.9.11")

(define (check-version)
  (or (string=? *installed-version* (sagittarius-version))
      (error 'sagittarius-config
	     "installed version and Sagittarius version are different")))

(define *one-char-table* '((I . include-path)
			   (V . version)
			   (L . library-path)
			   (l . libraries)))

(define (usage)
  (print "Usage sagittarius-config [option]

General parameter
  -V	the current Sagittarius version

Paremters to compile an application using Sagittarius
  -I	include paths required to compile programs using Sagittarius.
  -L	library paths required to link Sagittarius installation directory.
  -l	libraries required to link programs using Sagittarius.
  --arch
	prints the architecture signature.
  --c-flags
	prints the used CFLAGS.
  --cxx-flags
	prints the used CXXFLAGS.
  --sharedir
	prints the paths of Sagittarius' shread directory.
  --incdir,--sysincdir
	prints the paths of Sagittarius' include files directory.
  --syslibdir
	prints the paths of Sagittarius' library directory.
  --sysarchdir
	prints the paths of Sagittarius' system architecture directory.
  --pkgincdir
	prints the paths of Sagittarius' include files directory without
	installed prefix
  --pkglibdir
	prints the paths of Sagittarius' library directory without
	installed prefix
  --pkgarchdir
	prints the paths of Sagittarius' system architecture directory without
	installed prefix
  --install-prefix
        prints the install prefix where Sagittarius is installed.
")
  (exit 1))

(define (resolve-flag first? flag)
  (define (emit s) (unless first? (display #\space)) (display s))
  (case flag
    ((include-path)
     (emit "-I/usr/local/lib/sagittarius/0.9.11/include"))
    ((version)
     (emit *installed-version*))
    ((libraries)
     ;; FIXME I want to get this from CMake definitions
     (emit "-lpthread -ldl -lm -lsagittarius"))
    ((c-flags)
     (emit "-fPIC -Wall -pipe -I/usr/local/include -O2 -fno-strict-aliasing"))
    ((cxx-flags)
     (emit "-fPIC -Wall  -pipe -I/usr/local/include -O2 -fno-strict-aliasing"))
    ((library-path)
     (emit "-L/usr/local/lib/sagittarius/0.9.11/x86_64-pc-dragonfly"))
    ((arch)
     (emit "x86_64-pc-dragonfly"))
    ((incdir sysincdir)
     (emit "/usr/local/lib/sagittarius/0.9.11/include"))
    ((sharedir)
     (emit "/usr/local/share/sagittarius/0.9.11"))
    ;; for now only pkg and sys
    ((syslibdir)
     (emit "/usr/local/share/sagittarius/0.9.11/lib"))
    ((sysarchdir)
     (emit "/usr/local/lib/sagittarius/0.9.11/x86_64-pc-dragonfly"))
    ((pkglibdir)
     (emit "share/sagittarius/sitelib"))
    ((pkgarchdir)
     (emit "lib/sagittarius/sitelib/x86_64-pc-dragonfly"))
    ((install-prefix)
     (emit "/usr/local"))
    (else
     (usage))))

(define (parse-argument args)
  (let loop ((args args)
	     (r '()))
    (cond ((null? args) (reverse! r))
	  ((matches #/-(\w)/ (car args)) ;; one char
	   => (lambda (m) 
		(or (and-let* ((s (string->symbol (m 1)))
			       (def (assq s *one-char-table*)))
		      (loop (cdr args)
			    (cons (cdr def) r)))
		    (usage))))
	  ((matches #/--([\w-]+)/ (car args))
	   => (lambda (m)
		;; let resolve-flag do it
		(loop (cdr args)
		      (cons (string->symbol (m 1)) r))))
	  (else (usage)))))

(define (main args)
  (check-version)
  (let1 flags (parse-argument (cdr args))
    (when (null? flags) (usage))
    (fold-left (lambda (first? flag) (resolve-flag first? flag) #f) #t flags))
  (newline)
  0)

;; Local Variables:
;; mode: scheme
;; coding: utf-8
;; End:
