changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/skel/comp/makefile.lisp

changeset 663: cc89b337384b
parent: 5bd0eb9fa1fa
author: Richard Westhaver <ellis@rwest.io>
date: Sat, 21 Sep 2024 22:58:22 -0400
permissions: -rw-r--r--
description: skel upgrades, added skel/net
478
9472976adda9 skel comps
Richard Westhaver <ellis@rwest.io>
parents: 439
diff changeset
1
 ;;; makefile.lisp --- GNU Makefile Components
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
478
9472976adda9 skel comps
Richard Westhaver <ellis@rwest.io>
parents: 439
diff changeset
3
 ;; GNU Makefile skel components.
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
4
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Commentary:
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
6
 
478
9472976adda9 skel comps
Richard Westhaver <ellis@rwest.io>
parents: 439
diff changeset
7
 ;; Makefiles are a reasonably portable build medium. We can parse them using
9472976adda9 skel comps
Richard Westhaver <ellis@rwest.io>
parents: 439
diff changeset
8
 ;; the same general strategy as GNU make and compile them from skelfiles
9472976adda9 skel comps
Richard Westhaver <ellis@rwest.io>
parents: 439
diff changeset
9
 ;; (rule, source, target, command).
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
10
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
11
 ;;  HACK 2023-09-15: MVP
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
12
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
13
 ;; SO, the absolute priority ATM is to transpile our `sk-rule' objects
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
14
 ;; into a working Makefile. We're ignoring most of the niceties like
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
15
 ;; line-splitting and any JIT or compile-time execution.
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
16
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
17
 ;; https://github.com/takagi/lake
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
18
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
19
 ;; https://www.gnu.org/software/make/manual/html_node/Parsing-Makefiles.html
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
20
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
21
 ;;; Code:
384
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
22
 (in-package :skel/comp/makefile)
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
23
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
24
 (defparameter *default-makefile* "makefile")
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
25
 (defparameter *makefile-extension* "mk")
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
26
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
27
 ;;  TODO 2023-09-27: what is $(@D) ?? (target-dir)
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
28
 (defvar *mk-magic-vars* #(#\@ #\< #\^ #\* #\+ #\? #\|))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
29
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
30
 (defvar *mk-command-prefixes* #(#\@ #\- #\+))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
31
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
32
 (deftype mk-val-designator () '(member nil :simple :immediate :conditional :recursive :once :append :shell))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
33
 
384
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
34
 (defstruct mk-val (kind nil :type mk-val-designator)  (val nil :type sxp:form))
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
35
 
384
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
36
 (defstruct mk-var
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
37
   (key "" :type string)
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
38
   (val (make-mk-val) :type mk-val))
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
39
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
40
 ;; https://www.gnu.org/software/make/manual/html_node/Makefile-Contents.html
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
41
 (defclass makefile (skel sk-meta)
663
cc89b337384b skel upgrades, added skel/net
Richard Westhaver <ellis@rwest.io>
parents: 594
diff changeset
42
   ((directives :initform (make-array 0 :adjustable t :fill-pointer 0)
cc89b337384b skel upgrades, added skel/net
Richard Westhaver <ellis@rwest.io>
parents: 594
diff changeset
43
 	       :type (vector list) :accessor mk-directives)
cc89b337384b skel upgrades, added skel/net
Richard Westhaver <ellis@rwest.io>
parents: 594
diff changeset
44
    (variables :initform (make-hash-table)
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
45
 	      :type (hash-table) :accessor mk-vars)
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
46
    (explicit :initform (make-array 0 :element-type 'sk-rule :adjustable t :fill-pointer 0)
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
47
 	     :type (vector sk-rule) :accessor mk-erules)
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
48
    (implicit :initform (make-array 0 :element-type 'sk-rule :adjustable t :fill-pointer 0) 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
49
 	     :type (vector sk-rule) :accessor mk-irules))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
50
   (:documentation "A virtual GNU Makefile."))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
51
 
384
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
52
 (defmethod push-mk-rule ((self sk-rule) (place makefile) &optional implicit)
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
53
   (if implicit
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
54
       (vector-push-extend self (mk-irules place))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
55
       (vector-push-extend self (mk-erules place))))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
56
 
663
cc89b337384b skel upgrades, added skel/net
Richard Westhaver <ellis@rwest.io>
parents: 594
diff changeset
57
 (defmethod push-mk-directive ((self list) (place makefile))
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
58
   (vector-push-extend self (mk-directives place)))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
59
 
384
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
60
 (defmethod push-mk-var ((self cons) (place makefile))
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
61
   (destructuring-bind (k v) self
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
62
     (setf (gethash k (mk-vars place)) v)))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
63
 
516
f68a5996a2b1 skel updates, sketch of sk-path parser
Richard Westhaver <ellis@rwest.io>
parents: 508
diff changeset
64
 (defmethod sk-compile ((self makefile) &key stream &allow-other-keys)
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
65
   "Compile the makefile SELF to output STREAM."
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
66
   (with-open-stream (s stream)
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
67
     (with-slots (directives variables explicit implicit) self
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
68
       ;; directives
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
69
       (loop for d across directives
663
cc89b337384b skel upgrades, added skel/net
Richard Westhaver <ellis@rwest.io>
parents: 594
diff changeset
70
 	    do (write d :stream s)
cc89b337384b skel upgrades, added skel/net
Richard Westhaver <ellis@rwest.io>
parents: 594
diff changeset
71
             do (terpri s))
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
72
       ;; variables
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
73
       (maphash (lambda (x y) (format s "~A=~A~%" x y)) variables)
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
74
       ;; explicit rules
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
75
       (loop for exp across explicit
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
76
 	    do (format s "~A:~A;~A~%" 
508
e2d577f31866 viz updates
Richard Westhaver <ellis@rwest.io>
parents: 478
diff changeset
77
 		       (sk-rule-target exp)
e2d577f31866 viz updates
Richard Westhaver <ellis@rwest.io>
parents: 478
diff changeset
78
 		       (sk-rule-source exp)
663
cc89b337384b skel upgrades, added skel/net
Richard Westhaver <ellis@rwest.io>
parents: 594
diff changeset
79
                        (when-let ((recipe (sk-rule-recipe exp)))
cc89b337384b skel upgrades, added skel/net
Richard Westhaver <ellis@rwest.io>
parents: 594
diff changeset
80
 		         (sk-write-string recipe))))
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
81
       ;; TODO implicit rules
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
82
       (loop for imp across implicit
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
83
 	    do (format s "~A:~A;~A~%" 
508
e2d577f31866 viz updates
Richard Westhaver <ellis@rwest.io>
parents: 478
diff changeset
84
 		       (sk-rule-target imp)
e2d577f31866 viz updates
Richard Westhaver <ellis@rwest.io>
parents: 478
diff changeset
85
 		       (sk-rule-source imp)
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
86
 		       (sk-write-string (sk-rule-recipe imp)))))))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
87
 
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
88
 (defmethod sk-write-file ((self makefile) &key (path *default-makefile*) (comment t) (if-exists :overwrite))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
89
   (with-open-file (out path
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
90
 		       :direction :output
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
91
 		       :if-exists if-exists
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
92
 		       :if-does-not-exist :create)
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
93
     (when comment (princ
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
94
 		   (make-source-header-comment
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
95
 		    (sk-name self)
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
96
 		    :cchar #\#
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
97
 		    :timestamp t
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
98
 		    :description (sk-description self)
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
99
 		    :opts '("mode: makefile-gmake;"))
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
100
 		   out))
594
5bd0eb9fa1fa rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents: 516
diff changeset
101
     (sk-compile self :stream out)))
91
a0d966c3a576 skel no longer package inferred
ellis <ellis@rwest.io>
parents:
diff changeset
102
 
162
cc74c0054bc1 prelude
ellis <ellis@rwest.io>
parents: 96
diff changeset
103
 (defmethod sk-read-file ((self makefile) path)
163
ellis <ellis@rwest.io>
parents: 162
diff changeset
104
   (with-open-file (in path :direction :input)))
384
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
105
 
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
106
 ;;; Readtable
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
107
 (defreadtable :makefile
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
108
   (:merge :std))
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
109
 
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
110
 ;;; Auto Vars
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
111
 
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
112
 ;; simplified version of GNU Make Automatic Variables
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
113
 
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
114
 ;; don't need these: $% $? $+ $*
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
115
 
439
ea4f008ad13f packy work, added json-trailing-whitespace-p variable for json readers
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
116
 ;; (defmacro def-mk-auto (sym ll &body body))
384
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
117
 
439
ea4f008ad13f packy work, added json-trailing-whitespace-p variable for json readers
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
118
 ;; (def-mk-auto $@ (rule) (sk-rule-target rule))
ea4f008ad13f packy work, added json-trailing-whitespace-p variable for json readers
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
119
 ;; (def-mk-auto $< (rule) (car (sk-rule-source rule)))
ea4f008ad13f packy work, added json-trailing-whitespace-p variable for json readers
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
120
 ;; (def-mk-auto $^ (rule) (sk-rule-source rule))
384
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 163
diff changeset
121