Subject: bug#40272: linux-module-build-system don't support an inferior package as a kernel

From: Maxime Devos <[email-masked]>
Date: Mon, 02 Aug 2021 19:12:18 +0200

Brice Waegeneire schreef op zo 01-08-2021 om 22:59 [+0200]:
> ice-9/boot-9.scm:1685:16: In procedure raise-exception:
> In procedure package-name: Wrong type argument: #<inferior-package [email-masked] 7f8aed887420>
> --8<---------------cut here---------------end--------------->8---
> 
> > If we want to go further, we’ll have to end up with GOOPS…
> > [...]
> 
> Building a parent class of <package> and <inferior-package> looks really
> involved to just fix this issue.  Is there another way, or are we forced to
> use GOOPS in that case?

Going full GOOPS isn't necessary.  Something like 'define-gexp-compiler'
could be useful here, to make 'package-inputs' and the like support
inferior packages.  More specifically, something like this:

;; In (guix packages)
(define %inputs-hashtable (make-hash-table 2))

(define (package-inputs package)
  ;; Fast path: package is actually a <package>
  (if (eq? (struct-vtable package) <package>)
      (%package-inputs package) ; expects a <package>
      ((hashq-ref %inputs-hashtable (struct-vtable package)) package)))

;; In (guix inferior):
(hashq-set! %inputs-hashtable <inferior-package> %inferior-package-inputs)

and likewise for native-inputs, propagated-inputs, name, version, ...
(some macroology is recommended).

Or, simpler, but less extensible (but probably good enough):

(define-module (guix packages)
  [...]
  #:autoload (guix inferior) (inferior-package-inputs [...]))

[...]
(define (package-inputs package)
  (cond ((package? package) (%package-inputs package)) 
        ((inferior-package? package) (inferior-package-inputs package))
        (#t (error (G_ "tried to use 'package-inputs' on a non-package object ~a") package))))

The idea of both suggestions is to let 'package-name', 'package-native-inputs',
... work on both regular <package> and <inferior-package> objects.

Greetings,
Maxime.