Hi Christoph! Christoph Buck <buck.christ...@googlemail.com> writes:
>> (define gcc-cross-aarch64-linux-toolchain >> (let ((chain (cross-gcc-toolchain "aarch64-linux-gnu"))) >> (package >> (inherit chain) >> (native-search-paths >> (package-search-paths >> (lookup-package-input chain "gcc-cross-aarch64-linux-gnu")))))) >> >> (packages->manifest `(,gcc-cross-aarch64-linux-toolchain ,libpng)) >> >> (define* (enable-cross-compilation entry system target) >> (manifest-entry >> (inherit entry) >> (name (string-append (manifest-entry-name entry) "." system >> (if target >> (string-append "." target) >> ""))) >> (item (with-parameters ((%current-system system) >> (%current-target-system target)) >> (manifest-entry-item entry))) >> (dependencies (if (not (null? (manifest-entry-dependencies entry))) >> (map (lambda (dep) (enable-cross-compilation dep >> system target)) >> (manifest-entry-dependencies entry)) >> '())))) >> >> (define (cross-build-package package) >> (manifest (list (enable-cross-compilation (package->manifest-entry >> package) "x86_64-linux" "aarch64-linux-gnu")))) > >> (concatenate-manifests (list (specifications->manifest '("cmake")) >> (cross-build-package libpng) >> (packages->manifest >> `(,gcc-cross-aarch64-linux-toolchain)))) > > From my rudimentary understanding of guile, this goes recursively > through all manifest entries of the wrapped dependency and resets the > `target` to "aarch64-linux-gnu". And indeed, this seems to work: > > Is this the correct way to set this up? Is there a simpler way? It is > such a common problem and my solution looks rather complicated. Are > there any insights and tips of people with similiar uses cases? I also unfortunately don't know of a better solution. I'm not fluent with how cross-compilation works in Guix, but I think it would be valuable proposing this (or something like it) as a patch and/or cookbook entry! It seems too useful to leave hidden away in the mailing list. (I assume your inspiration was [1], but in my opinion this is different enough in both context and content to deserve its own section.) The closest I can think of is wrapping your Guix software as a package and using --target, but this is often too much of a barrier to entry when all you want is a simple development environment. Anything making cross-compilation easier is a good thing in my eyes. [1]: https://guix.gnu.org/en/cookbook/en/guix-cookbook.html#Build-Manifest -- Take it easy, Richard Sent Making my computer weirder one commit at a time.