Slight request: instead of 'which' as a keyword, why not use the already-extant 
extended srfi-0 feature identifier for pkgconfig presence?

Second: how will this be affected in cross-compilation where the target system 
has and the host system does not, or vice versa? Will it matter, both in the 
case of standard and non-standard locations? (Well, really, in the four cases.)

-elf

On 15 September 2024 08:40:10 GMT-04:00, Kristian Lein-Mathisen 
<[email protected]> wrote:
>Hi!
>
>We've been discussing adding pkg-config support here at the Gosling
>2024 chicken meetup. Here is a proposal.
>
>Using pkg-config can simplify adding foreign dependencies to
>eggs. Ideally, a single pkg-config identifier is sufficient to supply
>the chicken compiler with all the flags necessary to compile an egg
>which uses a foreign-dependency. The aim is to eliminate the need for
>custom-build scripts like
>[this](
>https://bugs.call-cc.org/browser/project/release/5/svn-client/trunk/build-svn-client
>).
>
>However, here are some of the downsides:
>
>(1) `pkg-config` may not be present on the build machine. We probably
>do not wish to have this as a hard dependency. However, it may be
>reasonable to depend on it to automatically build certain eggs with
>foreign dependencies. We try to adressed this below.
>
>(2) One concern is that the `pkg-config` identifiers may differ on
>different systems. If this turns out to be a problem in practice, I
>don't know if there is a clean solution for this.
>
>As far as I know, thre are two `pkg-config` implementations:
>pkg-config and pkgconf, the latter being a rewrite. The good news is
>that both provide a `pkg-config` executable which appear to be
>compatible.
>
>Taking the zstd egg as an example, here's a proposal of the new
>structure:
>
>```
>((synopsis "ZStandard bindings")
> (author "Kristian Lein-Mathisen")
> (category data)
> (license "BSD")
> (dependencies)
> (test-dependencies test)
> (components (extension zstd-loq-level
>                        (source "zstd-module.scm")
>                        (source-dependencies "zstd.scm")
>                        ;;(csc-options "-L" "-lzstd") ;; <-- must be
>removed (would introduce duplicates)
>                        (foreign-dependencies (pkg-config libzstd)))
>             (extension zstd-nicer-api
>                        (source "zstd-nicer-api.scm"))
>             (program "zcompress")))
>```
>
>So in practice,
>    (csc-options "-L" "-lzstd")
>turns into
>    (foreign-dependencies (pkg-config libzstd))
>
>Some remarks:
>
>- `foreign-dependencies` can now provide native library resolution using
>`pkg-config`
>- `foreign-dependencies` can appear inside components and instead of
>top-level
>- `foreign-dependencies` is still allowed top-level for compatibility but
>is still ignored (and should be deprecated?)
>- `foreign-dependencies` can contain a `(pkg-config pkg …)` specification
>- `foreign-dependencies` can be extended in the future to support other
>specifications, e.g. `(nixos nixpackage …)`
>- `pkg` is passed to `pkg-config --libs --cflags $pkg` unless overridden
>- the output of `pkg-config --libs $pgk` can be overridden with environment
>variables (even if `pkg-config` is present)
>- if `pkg-config` isn't present, we can provide an informative error say
>which environment-variable to set
>- note: we assume `pkg` identifiers are representable as environment
>variables (should be ok, they are already filenames)
>
>Here's an imaginary implementation:
>
>```scheme
>(define (resolve-pkg-config pkg)
>  (let* ((var (conc "CHICKEN_INSTALL_PKG_CONFIG_" pkg))
>         (libs (get-environment-variable var)))
>  (if libs libs
>      (if (which "pkg-config")
>          (shell "pkg-config" "--libs" "--cflags" pkg)
>          (error (conc "pkg-config not found. install it, or set the
>environment variable " var
>                       " to reflect the required CSC_OPTIONS.\n"
>                       "for example: export \"" var "=-L -l" (remove-suffix
>pkg "lib") "\""))))))
>```
>
>So, for example:
>
>```
># defaults work as expected
>$ pkg-config --libs libzstd
>-lzstd
>$ chicken-install zstd
>csc ... -lzstd ...
>$ ldd zstd.so
>libzstd.so.1 => ...
>...
>
>$ apt remove pkg-config
>$ chicken-install zstd
>error: pkg-config not found. install it, or set the environment variable
>CHICKEN_INSTALL_PKG_CONFIG_zstd.
>for example export "CHICKEN_INSTALL_PKG_CONFIG_zstd=-L -lzstd"
>
># using pkg-config foreign-dependencies without pkg-config
>$ env CHICKEN_INSTALL_PKG_CONFIG_libzstd="-L -lzstd" chicken-install zstd
>...
>$ ldd zstd.so
>libzstd.so.1 => ...
>
># even with pkg-config installed, it can be useful to override foreign
>dependencies:
>$ env "CHICKEN_INSTALL_PKG_CONFIG_zstd=-L -l/tmp/libzstd1.1.so"
>chicken-install zstd
>...
>$ ldd zstd.so
>libzstd1.1.so => /tmp/libzstd1.1.so
>```
>
>Cheers,
>K.

Reply via email to