PasteRack.org
Paste # 11082
2016-01-19 13:51:05

Fork as a new paste.

Paste viewed 129 times.


Embed:

  1. #lang racket/base
  2.  
  3. (provide compile-c-module
  4.          from-c)
  5.  
  6. (require racket/file
  7.          dynext/file
  8.          dynext/compile
  9.          dynext/link
  10.          (for-syntax racket/base
  11.                      syntax/parse
  12.                      racket/require-transform
  13.                      racket/file
  14.                      dynext/file
  15.                      dynext/compile
  16.                      dynext/link))
  17.  
  18. (define-syntax-rule (define-for-syntax-and-runtime f ...)
  19.   (begin (define f ...)
  20.          (define-for-syntax f ...)))
  21.  
  22. (define-for-syntax-and-runtime (compile-c-module c-source)
  23.   (define extensionless-source (path-replace-suffix c-source ""))
  24.   (define object-target-path
  25.     (build-path "compiled" "native" (system-library-subpath)))
  26.   (define object-target
  27.     (build-path object-target-path (append-object-suffix extensionless-source)))
  28.   (define shared-object-target
  29.     (build-path object-target-path (append-extension-suffix extensionless-source)))
  30.   (make-directory* object-target-path)
  31.   (compile-extension #t c-source object-target '())
  32.   (link-extension #t (list object-target) shared-object-target))
  33.  
  34. (define-syntax from-c
  35.   (make-require-transformer
  36.    (lambda (stx)
  37.      (syntax-parse stx
  38.        [(_ c-source:str)
  39.         (define f (syntax-e #'c-source))
  40.         (compile-c-module f)
  41.         (expand-import (datum->syntax stx (path->string (path-replace-suffix f ""))))]))))

=>