Code Monkey home page Code Monkey logo

Comments (12)

proglottis avatar proglottis commented on July 1, 2024

Yeah. I thought we'd hit this issue eventually. I think build tags can handle this https://golang.org/pkg/go/build/

I'd imagine splitting out things like pinentry into their own file and adding the build tag like this:

// +build !gpgme1.3.2

And use go build -tags 'gpgme1.3.2'. Would this suit you?

Another option might be to package the gpgme.h file in the repo. I think this would work fine for constants, but we'd have to conditionally stub out the C functions that don't exist. Also I'm not sure licensing allows this.

from gpgme.

mtrmac avatar mtrmac commented on July 1, 2024

And use go build -tags 'gpgme1.3.2'. Would this suit you?

If I understand the go build system correctly, this would leak into users of this module, and worse, transitively their users; go build $user-of-user-of-user-of-gpgme would still need to include -tags gpgme1.3.2, even when $user-of-user-of-user-of-gpgme has no idea gpgme is even used somewhere down in the stack. A simple go get of a package would not work without telling the user about -tags gpgme1.3.2.

In my particular case, we use make anyway, and I do know that I am using gpgme, so yes, using build tags would work for me.

I don’t particularly like this, but then none of the other options I can see are appealing either.

(Using the mtrmac/gpgme:master branch has the advantage of keeping go get working without asking the user, or anyone else, to do anything extra, OTOH it leads to a long-term fork which might become unmaintained.)

from gpgme.

proglottis avatar proglottis commented on July 1, 2024

Here's another idea that at least puts the gpgme version requirement with the application writer. You create separate packages for functions and constants that only newer gpgme versions support. Then they only get compiled when explicitly included by the application dev.

Here's a test I wrote to check. Still go get-able even though the thing package wont compile.
https://github.com/proglottis/cgopackage

It would be trivial to split out pinentry, but pretty hard to split out new constants. It would also not be backwards compatible

from gpgme.

mtrmac avatar mtrmac commented on July 1, 2024

It would also not be backwards compatible

Yeah. The mtrmac/gpgme repository kind of implements this (by having mtrmac/gpgme be the limited package and proglottis/gpgme the full-featured one).

So, basically, I have a good enough solution for my needs, and hopefully over time the version drift will diminish or cgo will grow more conditional compilation capabilities. Until/unless that happens, this issue can serve just as a convenient URL to refer to the problem space.

from gpgme.

ikrabbe avatar ikrabbe commented on July 1, 2024

I may be able to help here, but I'm still not perfect, using C here, too. Maybe we should also include a vendor library for gpgme, so we don't need to link against the systems one.
On my system (gentoo) the error was, that gpgme.h could not be found, as it is installed in /usr/include/gpgme/gpgme.h, so the include statement would be #include <gpgme/gpgme.h>.
After fixing these include statements, your package compiled.

from gpgme.

mtrmac avatar mtrmac commented on July 1, 2024

Maybe we should also include a vendor library for gpgme, so we don't need to link against the systems one.

I don’t think that would make the build issues any easier; instead of figuring out how to build the Go library against the OS libgpgme, now everyone would have to figure out how to build the Go library + the bundled libgpgme against the rest of the OS ecosystem.

We could just add a Makefile to this repo to detect a gpgme version and set Go build tags; and that would be much simpler than bundling libgpgme. But, as discussed above, that would still break go build and so far seems to be not worth it.

from gpgme.

ikrabbe avatar ikrabbe commented on July 1, 2024

Actually the gpgme has a quite stable and simple upstream.
What OS vendors make from that is completely different.
It is not just the version but also the way the vendor distributes include files and else in the system.

But as stated, fixing the includes allows to compile the tool against a gpgme-1.5.5 on my system.

What's the error on your side?

from gpgme.

proglottis avatar proglottis commented on July 1, 2024

Some constants and some new features don't exist on old gpgme versions.

See mtrmac@e883484 and mtrmac@808bb5b

Conditionally building those is practically impossible I think. I have wondered if it would be possible to write a C shim since it could use the preprocessor to version check.

from gpgme.

mtrmac avatar mtrmac commented on July 1, 2024

A C shim with some #ifdefs might allow C code to build, but would not make the definitions of Golang constants conditional. That needs Golang tags, as discussed in #6 (comment) .

This is all fairly unrelated to @ikrabbe ’s issue that the #include path differs between distributions. I don’t know how to fix that other than giving up on go build and using either a plain shell script or make to call gpgme-config.

from gpgme.

proglottis avatar proglottis commented on July 1, 2024

@mtrmac is this still a problem for you since #17 (comment) ?

I now run this on travis-ci using libgpgme11-dev - I broke backwards compat to make this work (just constants) https://travis-ci.org/proglottis/gpgme

from gpgme.

mtrmac avatar mtrmac commented on July 1, 2024

@proglottis Looking at current master, it removes the symbols added after 1.4.3 (old Fedoras), but not between 1.3.2 and 1.4.3 (relevant for CentOS 7). I’m afraid CentOS 7 still uses 1.3.2.

from gpgme.

mtrmac avatar mtrmac commented on July 1, 2024

FWIW this is no longer a concern for us, RHEL 8 ships with GPGME 1.13 now.

from gpgme.

Related Issues (12)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.