Comments (12)
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.
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.
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.
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.
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.
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.
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.
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.
A C shim with some #ifdef
s 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.
@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.
@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.
FWIW this is no longer a concern for us, RHEL 8 ships with GPGME 1.13 now.
from gpgme.
Related Issues (12)
- Issues with building on Windows HOT 13
- Finding Keys on Windows HOT 3
- Does not build on Travis-CI [Linux] HOT 6
- tag official releases HOT 2
- Decrypt test fails with "No Data". HOT 4
- Linking with older versions of GPGME should use the -lgpgme-pthread library HOT 2
- compilation terminated HOT 1
- macOS `fatal error: 'gpgme.h' file not found` HOT 2
- lb: library not found for -lassuan HOT 15
- Compilation on RHEL/CentOS 7 fails on pkg-config HOT 4
- could not import C (cgo preprocessing failed)) HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gpgme.