Thanks for taking a look Carlo! On 2/7/24 22:37, Carlo Zancanaro wrote:
Hi Jesse,I know very little about what you're trying to do, but there's one thing that looked wrong to me: On Wed, Feb 07 2024, Jesse wrote:... (build-system crosstool-ng) ...This isn't a build system, right? It's just the package? I think you may want crosstool-ng-build-system here.
You are totally correct here. I changed this to "(build-system crosstool-ng-build-system)" and I don't get the same error now. I also then realized I was missing " #:use-module (embedded-dev build-system crosstool-ng)" from the list of modules in the package define-module expression in the packages/crosstool-ng.scm file. I also tracked down some other missing modules.
However, now I get this: guix build -v3 -L embedded-dev ct-ng-riscv64-unknown-elf guix build: warning: invalid argument list guix build: warning: source expression failed to match any pattern error: crosstool-ng-build-system: unbound variablehint: Did you forget `(use-modules (embedded-dev build-system crosstool-ng))'?
guix build: error: ct-ng-riscv64-unknown-elf: unknown packageThis confuses me a bit because it says that it is an unbound variable but it is defined in embedded-dev/build-system/crosstool-ng.scm. I believe I should be importing this module with the "#:use-module (embedded-dev build-system crosstool-ng)" line in the package file. The symbol should be exported with:
(define-module (embedded-dev build-system crosstool-ng) #:use-module (guix build-system) #:use-module (guix build-system gnu) #:export (%crosstool-ng-build-system-modules crosstool-ng-build crosstool-ng-build-system))which is in the embedded-dev/build-system/crosstool-ng.scm file of my channel. I was mainly trying to follow some build-system setups like ruby where there are build/ruby-build-system.scm, which is used by build-system/ruby.scm, which defines and exports the ruby-build-system symbol, and that is used by the packages in packages/ruby.scm.
If I was to manually trace how the build system guile files are used from a package definition, it would look like this:
1. In packages/crosstool-ng.scm I have a package definition that uses (build-system crosstool-ng-build-system)2. In that same file I have a line that should include the entry point to the crosstool-ng build system:
#:use-module (embedded-dev build-system crosstool-ng)3. That line should use the guile module located at embedded-dev/build-system/crosstool-ng.scm, since my build invocation looks like: "guix build -v3 -L embedded-dev ct-ng-riscv64-unknown-elf" and my channel is in a directory called "embedded-dev". So the fulll path would be embedded-dev/embedded-dev/build-system/crosstool-ng.scm
4. In build-system/crosstool-ng.scm the beginning is defined as: (define-module (embedded-dev build-system crosstool-ng) #:use-module (guix build-system) #:use-module (guix build-system gnu) #:export (%crosstool-ng-build-system-modules crosstool-ng-build crosstool-ng-build-system)) (define %crosstool-ng-build-system-modules ;; Build-side modules imported by default. `((embedded-dev build crosstool-ng-build-system) ,@%gnu-build-system-modules)) (define (default-crosstool-ng ) "Return the default crosstool-ng package"(let ((crosstool-ng (resolve-interface '(embedded-dev packages crosstool-ng))))
(module-ref crosstool-ng 'crosstool-ng)))Here I should be exporting the "crosstool-ng-build-system" symbol to be used by a guile script that uses it. The crosstool-ng-build-system-modules should be looking at embedded-dev/build/crosstool-ng-build-system.scm, again taking inspiration from other build system files like the ones associated with ruby. The default-crosstool-ng symbol should be grabbing from the embedded-dev/packages/crosstool-ng.scm file.
5. Later in that file I pass the crosstool-ng-build-system-modules symbol to the crosstool-ng-build function as well as the module located at embedded-dev/build/crosstool-ng-build-system.scm
(define* (crosstool-ng-build name inputs #:key (sample "unknown") (test-target "test") (tests? #t) (phases '%standard-phases) (outputs '("out")) (search-paths '()) (system (%current-system)) (guile #f)(imported-modules %crosstool-ng-build-system-modules) (modules '((embedded-dev build crosstool-ng-build-system)
(guix build utils))) )6. Then the actual build system symbol that is exported from the top is defined at the bottom of this file:
(define crosstool-ng-build-system (build-system (name 'crosstool-ng) (description "Crosstool-ng build system") (lower lower)))It all seems just as threaded together as the ones in the guix source. I must be missing something small here.
I'm also confused about the "guix build: warning: invalid argument list". It looks like I'm invoking the build command properly.
Is there something else you have to do when setting up a channel to pull in the build and build-system directories? I thought that by adding my channel to the load path with "-L", the elements passed to use-module were essentially directory paths.
That might be what's causing the error:... In guix/build-system.scm: 94:2 3 (make-bag _ _ #:source _ #:inputs _ #:native-inputs _ # …) In ice-9/boot-9.scm: 1685:16 2 (raise-exception _ #:continuable? _) 1685:16 1 (raise-exception _ #:continuable? _) 1685:16 0 (raise-exception _ #:continuable? _) ice-9/boot-9.scm:1685:16: In procedure raise-exception: Throw to key `match-error' with args `("match" "no matching pattern" #<package crosstool-ng@1.26.0 embedded-dev/embedded-dev/packages/crosstool-ng.scm:26 7fd09cb334d0>)'.Looking in make-bag (in guix/build-system.scm), the first think it does it pattern match on the build system expecting a record of the <build-system> type. Your package doesn't match that pattern, so this error is raised.
Thanks for pointing this out, I didn't dig in enough.
Carlo
I've attached the version with the changes mentioned. Thanks, Jesse
embedded-dev.tar.gz
Description: application/gzip