Subject: Help with packaging c3c-lang

From: Ashvith Shetty <[email-masked]>
Date: Thu, 06 Mar 2025 13:52:20 +0530

Hello,
This is my second attempt at packaging c3-lang (https://github.com/c3lang/c3c). I am planning to refer zig to build all the way from 0.5.1 to the lastest version. In the earlier patches, miniz was unbundled and replaced with the input-provided zlib - however, this time was able to make it work with the input-provided miniz (patch not provided).

1) In the earlier patch I have worked on, I just noticed that I had to substitute ${LLVM_LIBRARY_DIRS}:

--8<---------------cut here---------------start------------->8---
+       (snippet #~(begin
+                    (use-modules (guix build utils))
+                    (substitute* "CMakeLists.txt"
+                      (("\\$\\{LLVM_LIBRARY_DIRS\\}")
+                       (string-append #$lld-18 "/lib/ "
+                                      #$llvm-18 "/lib/")))))))
--8<---------------cut here---------------start------------->8---

However, this seems to me like an improper way to deal with it.

I have a limited understanding of CMake, so please bear with me: Variable ${LLVM_LIBRARY_DIRS} (which I am assuming is a combination of variables including, but not limited to ${LLVM_DIR} and ${LLD_DIR}) seems to include only /gnu/store/z0abzsad781af8qp2wzqq8icwwyxb4ms-llvm-18.1.8/lib/ (${LLVM_DIR}?), but not /gnu/store/62jn91571kx31hqza7c9jzsc3sinkxjr-lld-18.1.8/lib/ (${LLD_DIR}?). When I try printing ${LLD_DIR} in CMakeLists.txt (patch not provided), it appears to be an empty string. Is there anything wrong with the way CMake is configured in c3c?

2) c3c assumes that there exists a compiler or an alias `cc`, but there isn't any such variable in Guix (at least to my knowledge). How do I deal with this issue? Because if not resolved, it also causes the tests to fail. Do I patch cc to gcc/clang/#$(cc-for-target)?

--8<---------------cut here---------------start------------->8---
+               (substitute* '("src/compiler/target.c"
+                              "src/compiler/linker.c")
+                 (("\"cc\"") (string-append "\"" #$(cc-for-target) "\"")))
+               (substitute* "resources/testproject/project.json"
+                 (("\"cc\" : \"cc\",") ""))))
--8<---------------cut here---------------start------------->8---

Or is there a better way to deal with this? By the way, commit 297a6c9 (https://github.com/c3lang/c3c/commit/297a6c93481e2f3b62bf0250750e20549108129d) in v0.6.3 includes support for C3C_LIB and C3C_CC - can this be re-used for earlier patches?

3) Tests in C3C don't run (or maybe I am doing something wrong), so I had to add this instead (this is specific to v0.6.1):
--8<---------------cut here---------------start------------->8---
(replace 'check
                     (lambda* (#:key tests? #:allow-other-keys)
                       (when tests?
                         ;; Compile and run some examples
                         (display "# Compile and run some examples #\n")
                         (with-directory-excursion "../source/resources"
                           (for-each (lambda (file)
                                       (invoke "../../build/c3c" "compile"
                                               file))
                                     '("examples/base64.c3"
                                       "examples/binarydigits.c3"
                                       "examples/brainfk.c3"
                                       "examples/factorial_macro.c3"
                                       "examples/fasta.c3"
                                       "examples/gameoflife.c3"
                                       "examples/hash.c3"
                                       "examples/levenshtein.c3"
                                       "examples/load_world.c3"
                                       "examples/map.c3"
                                       "examples/mandelbrot.c3"
                                       "examples/plus_minus.c3"
                                       "examples/nbodies.c3"
                                       "examples/spectralnorm.c3"
                                       "examples/swap.c3"
                                       "examples/contextfree/boolerr.c3"
                                       "examples/contextfree/dynscope.c3"
                                       "examples/contextfree/guess_number.c3"
                                       "examples/contextfree/multi.c3"
                                       "examples/contextfree/cleanup.c3"))

                           (for-each (lambda (file)
                                       (invoke "../../build/c3c" "compile-run"
                                               file))
                                     '("examples/hello_world_many.c3"
                                       "examples/time.c3"
                                       "examples/fannkuch-redux.c3"
                                       "examples/contextfree/boolerr.c3"
                                       "examples/load_world.c3"
                                       "examples/process.c3"
                                       "examples/ls.c3"
                                       "linux_stack.c3"))

                           (invoke "../../build/c3c" "compile-run"
                                   "--linker=builtin" "linux_stack.c3"))

                         ;; Compile run unit tests
                         (display "# Compile run unit tests #\n")
                         (invoke "./c3c" "compile-test" "../source/test/unit")

                         (with-directory-excursion "../source/resources/testproject"
                           ;; Build testproject
                           (display "# Build testproject #\n")
                           (invoke "../../../build/c3c" "build" "--debug-log")

                           ;; Build testproject direct linker
                           (display "# Build testproject direct linker #\n")
                           (invoke "../../../build/c3c" "build" "--debug-log"
                                   "--linker=builtin"))

                         ;; Run compiler tests
                         (display "# Run compiler tests #\n")
                         (invoke "python3" "../source/test/src/tester.py"
                                 "./c3c" "../source/test/test_suite")))))))
--8<---------------cut here---------------start------------->8---

These tests come from `.github/workflows/main.yml`. I feel like there has to be a better way to do this.

Regards,
Ashvith