diff --git a/aosc/private/defines.rkt b/aosc/private/defines.rkt new file mode 100644 index 0000000..e9c0692 --- /dev/null +++ b/aosc/private/defines.rkt @@ -0,0 +1,34 @@ +#lang racket/base + +(require racket/contract + "macro.rkt") + +; TODO: limit abtype and abhost to a set of valid values with contract +(define-vars #f string? pkgname pkgsec abhost abtype) +(define-vars #t string? pkgdes) +(define-vars #f (listof string?) + pkgdep builddep pkgrecom pkgbreak pkgsug pkgconfl pkgrep) +(define-vars #f (listof string?) + autotools-def cmake-def waf-def qtproj-def) +(define-vars #t (listof string?) + autotools-after cmake-after waf-after qtproj-after go-build-after + cargo-after) +(define-vars #f boolean? + ab-flags-o3 ab-flags-specs ab-flags-ssp ab-flags-ftf ab-flags-rro + nolto useclang ab-flags-pie ab-flags-pic abshadow abconfighack + abclean noparallel abstrip absplitdbg) +(define-vars #f boolean? reconf nopython2 nopython3) +(define-vars #f exact-nonnegative-integer? + abthreads) + +(struct defines-type (opts) #:transparent) + +(define/contract (defines opts) + (-> (listof pair?) defines-type?) + ;; TODO: checks here + (defines-type opts)) + +(define/contract (defines->string defines) + (-> defines-type? string?) + ;; TODO: ->string here, apply ->string to each opt + "") diff --git a/aosc/private/macro.rkt b/aosc/private/macro.rkt index dfbc09e..01f5133 100644 --- a/aosc/private/macro.rkt +++ b/aosc/private/macro.rkt @@ -3,27 +3,49 @@ (require racket/contract racket/format racket/string + "arch.rkt" + "utils.rkt" (for-syntax racket/base racket/syntax)) (define-syntax (define-vars stx) (syntax-case stx () - [(_ array contract a) - (with-syntax - ([a-val (format-id #'a "~a-val" #'a)] + [(_ array/quote contract a) + (with-syntax* + ([a (if (equal? (syntax->datum #'contract) 'boolean?) + (format-id #'a "~a?" #'a) + #'a)] + [a-val (format-id #'a "~a-val" #'a)] [a? (format-id #'a "~a?" #'a)] [a->string (format-id #'a "~a->string" #'a)] ) #`(begin (struct a (val) #:transparent) - (define/contract (a->string val) - (-> a? string?) + (define/contract (a->string val [arch 'any]) + (->* (a?) (arch?) string?) (format "~a=~a" - 'a - (if (equal? 'contract string?) - (a-val val) - (if 'array - (format "(~a)" (string-join (map ~v (a-val val)))) - (format "\"~a\"" (string-join (a-val val))))))) + (string-upcase + (format "~a~a" + (string-replace + (if (equal? 'contract 'boolean?) + (string-trim (symbol->string 'a) "?" #:left? #f) + (symbol->string 'a)) + "-" "_") + (if (equal? arch 'any) + "" + (string-append "__" (symbol->string arch))))) + (cond + [(equal? 'contract 'string?) + (if 'array/quote + (~v (a-val val)) + (a-val val))] + [(equal? 'contract 'boolean?) + (boolean->exact-nonnegative-integer (a-val val))] + [(equal? 'contract 'exact-nonnegative-integer?) + (a-val val)] + [(equal? 'contract '(listof string?)) + (if 'array/quote + (format "(~a)" (string-join (map ~v (a-val val)))) + (format "\"~a\"" (string-join (a-val val))))]))) ))] [(_ array contract a b ...) #'(begin diff --git a/aosc/private/utils.rkt b/aosc/private/utils.rkt index 3321a55..28e314a 100644 --- a/aosc/private/utils.rkt +++ b/aosc/private/utils.rkt @@ -19,7 +19,7 @@ (->* (string? any/c) (boolean? arch?) string?) (string-append entry-name (if (equal? arch 'any) - "" + "" (string-append "__" (string-upcase (symbol->string arch)))) (if quote? "=\"" "=") (~a value)