changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > infra / annotate scripts/check.lisp

changeset 371: 7dcabf3e0edc
parent: 71ac00213ae3
author: Richard Westhaver <ellis@rwest.io>
date: Tue, 24 Sep 2024 15:53:24 -0400
permissions: -rwxr-xr-x
description: no link in bootstrap.sh
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
1
 ;;; scripts/check.lisp --- check host features
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
3
 ;; This script runs some basic checks to ensure the host is ready for
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
4
 ;; bootstrapping.
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
5
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
6
 ;;; Code:
284
71ac00213ae3 updates, rm scripts/autogen.lisp
Richard Westhaver <ellis@rwest.io>
parents: 30
diff changeset
7
 (defpackage :infra/check
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
8
   (:nicknames :check)
25
ellis <ellis@rwest.io>
parents: 21
diff changeset
9
   (:use :cl :std :sb-alien :cli :log)
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
10
   (:export :main
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
11
            :*results*
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
12
            :check))
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
13
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
14
 (in-package :infra/scripts/check)
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
15
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
16
 (defvar *results* (make-hash-table :size 32 :test 'equal))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
17
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
18
 (defparameter *library-path* (ld-library-path-list))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
19
 (defparameter *exec-path* (exec-path-list))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
20
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
21
 (defun get-result (k) (gethash k *results*))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
22
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
23
 (defun push-result (k &optional v) 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
24
   (setf (gethash k *results*) v))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
25
 
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
26
 (defmacro check-err (is-warn ctrl name)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
27
   `(if ,is-warn
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
28
        (and
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
29
          (warn 'simple-warning 
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
30
                :format-control ,ctrl
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
31
                :format-arguments (list ,name))
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
32
          (push-result ,name))
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
33
        (error 'simple-program-error 
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
34
               :format-control ,ctrl
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
35
               :format-arguments (list ,name))))
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
36
        
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
37
 (defun check-for-shared-lib (name &optional warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
38
   "Check for a shared library by loading it in the current session with dlopen.
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
39
 
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
40
 When WARN is non-nil, signal a warning instead of an error."
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
41
   (if-let ((lib (ignore-errors (load-shared-object (format nil "lib~a.so" name)))))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
42
     (prog1
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
43
         (push-result name lib)
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
44
       (unload-shared-object lib))
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
45
     (check-err warn "shared library missing: ~x" name)))
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
46
 
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
47
 (defun check-for-bin (name &optional warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
48
   (if-let ((exe (find-exe name)))
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
49
     (push-result name exe)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
50
     (check-err warn "executable program missing: ~x" name)))
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
51
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
52
 (defun check-for-src (name)
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
53
   (push-result name))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
54
 
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
55
 (defun check-hostname () (push-result "hostname" (machine-instance)))
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
56
 
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
57
 (defun check-user () (push-result "user" (cons (sb-posix:getenv "USER") (user-homedir-pathname))))
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
58
   
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
59
 (defun check-system ()
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
60
   (destructuring-bind (lisp version features)
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
61
       (my-lisp-implementation)
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
62
     (push-result "lisp" (list lisp version features)
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
63
     #-sbcl (push-result "lisp" "unsupported")
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
64
     #-sb-core-compression (println "WARNING: feature sb-core-compression disabled")
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
65
     #-mark-region-gc (println "WARNING: feature mark-region-gc disabled")
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
66
 )))
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
67
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
68
 (defun check-shell ()
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
69
   (push-result "shell" (sb-posix:getenv "SHELL")))
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
70
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
71
 (defun check-display ()
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
72
   (push-result "display" (sb-posix:getenv "DISPLAY")))
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
73
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
74
 (defun check-net ()
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
75
   (push-result "net"))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
76
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
77
 (defun check-cpu ()
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
78
   (push-result "cpu" (machine-version)))
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
79
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
80
 (defmethod print-object ((object hash-table) stream)
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
81
   (format stream "#HOST-FEATURES{~{~{~%(~a . ~a)~}~^ ~}}"
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
82
           (loop for k being the hash-keys of *results*
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
83
                   using (hash-value v)
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
84
                 unless (null v) 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
85
                   collect (list k v))))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
86
 
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
87
 (defun check (&optional warn)
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
88
   "Check the host for required features."
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
89
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
90
   (setq *library-path* (ld-library-path-list)
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
91
         *exec-path* (exec-path-list))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
92
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
93
   (debug! (format nil "LD_LIBRARY_PATH: ~A~%" *library-path*))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
94
   (debug! (format nil "PATH: ~A~%" *exec-path*))
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
95
   (check-system)
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
96
   (check-user)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
97
   (check-net)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
98
   (check-hostname)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
99
   (check-cpu)
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
100
   (check-shell)
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
101
   (check-display)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
102
   (check-for-bin "sbcl" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
103
   (check-for-bin "rustc" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
104
   (check-for-bin "clang" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
105
   (check-for-bin "gcc" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
106
   (check-for-bin "emacs" warn)
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
107
   ;; vcs
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
108
   (check-for-bin "hg" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
109
   (check-for-bin "git" warn)
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
110
   ;; virt
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
111
   (check-for-bin "podman" warn)
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
112
 
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
113
   (check-for-src "core")
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
114
   ;; core dependencies
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
115
   (check-for-shared-lib "rocksdb" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
116
   (check-for-shared-lib "uring" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
117
   (check-for-shared-lib "btrfs" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
118
   (check-for-shared-lib "btrfsutil" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
119
   (check-for-shared-lib "tree-sitter" warn)
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
120
   ;; extras
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
121
   (check-for-shared-lib "gtk-4" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
122
   (check-for-shared-lib "blake3" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
123
   (check-for-shared-lib "k" warn)
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
124
   (check-for-shared-lib "cbqn" warn)
15
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
125
   *results*)
17a70918610c scripts
ellis <ellis@rwest.io>
parents:
diff changeset
126
 
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 15
diff changeset
127
 (defmain () (println (check)))