Skip to content

Commit 95d5a39

Browse files
authored
ci:cross-compilation linux (#454)
1 parent a65c7b8 commit 95d5a39

4 files changed

Lines changed: 98 additions & 4 deletions

File tree

.github/workflows/nightly.yml

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,60 @@ jobs:
4040
curl -fsSL "$PCSC_URL/pcsclite.h.in" -o "$PCSC_DIR/include/pcsclite.h"
4141
sed -i '' 's/@VERSION@/1.9.0/' "$PCSC_DIR/include/pcsclite.h"
4242
43-
# Create pkg-config file (headers-only, no library needed for cross-compilation)
43+
# Build stub library — the real libpcsclite is loaded at runtime on the user's system,
44+
# but the linker needs symbols to resolve during cross-compilation.
45+
cat > "$RUNNER_TEMP/pcsclite_stub.c" << 'STUB'
46+
#include <stddef.h>
47+
typedef long LONG;
48+
typedef unsigned long DWORD;
49+
typedef void *LPCVOID;
50+
typedef char *LPSTR;
51+
typedef const char *LPCSTR;
52+
typedef unsigned char *LPBYTE;
53+
typedef unsigned char BYTE;
54+
typedef LONG SCARDCONTEXT;
55+
typedef LONG SCARDHANDLE;
56+
typedef struct { DWORD dwProtocol; DWORD cbPciLength; } SCARD_IO_REQUEST;
57+
typedef struct { LPCSTR szReader; DWORD dwCurrentState; DWORD dwEventState; DWORD cbAtr; unsigned char rgbAtr[36]; void *pvUserData; } SCARD_READERSTATE;
58+
LONG SCardEstablishContext(DWORD s, LPCVOID r1, LPCVOID r2, SCARDCONTEXT *c) { return 0; }
59+
LONG SCardReleaseContext(SCARDCONTEXT c) { return 0; }
60+
LONG SCardIsValidContext(SCARDCONTEXT c) { return 0; }
61+
LONG SCardCancel(SCARDCONTEXT c) { return 0; }
62+
LONG SCardConnect(SCARDCONTEXT c, LPCSTR r, DWORD s, DWORD p, SCARDHANDLE *h, DWORD *ap) { return 0; }
63+
LONG SCardReconnect(SCARDHANDLE h, DWORD s, DWORD p, DWORD d, DWORD *ap) { return 0; }
64+
LONG SCardDisconnect(SCARDHANDLE h, DWORD d) { return 0; }
65+
LONG SCardBeginTransaction(SCARDHANDLE h) { return 0; }
66+
LONG SCardEndTransaction(SCARDHANDLE h, DWORD d) { return 0; }
67+
LONG SCardStatus(SCARDHANDLE h, LPSTR r, DWORD *rl, DWORD *s, DWORD *p, LPBYTE a, DWORD *al) { return 0; }
68+
LONG SCardTransmit(SCARDHANDLE h, const SCARD_IO_REQUEST *si, const BYTE *s, DWORD sl, SCARD_IO_REQUEST *ri, BYTE *r, DWORD *rl) { return 0; }
69+
LONG SCardControl(SCARDHANDLE h, DWORD c, LPCVOID i, DWORD il, void *o, DWORD ol, DWORD *br) { return 0; }
70+
LONG SCardGetAttrib(SCARDHANDLE h, DWORD a, LPBYTE b, DWORD *bl) { return 0; }
71+
LONG SCardSetAttrib(SCARDHANDLE h, DWORD a, const BYTE *b, DWORD bl) { return 0; }
72+
LONG SCardListReaders(SCARDCONTEXT c, LPCSTR g, LPSTR r, DWORD *rl) { return 0; }
73+
LONG SCardListReaderGroups(SCARDCONTEXT c, LPSTR g, DWORD *gl) { return 0; }
74+
LONG SCardGetStatusChange(SCARDCONTEXT c, DWORD t, SCARD_READERSTATE *s, DWORD n) { return 0; }
75+
LONG SCardFreeMemory(SCARDCONTEXT c, LPCVOID m) { return 0; }
76+
const char *pcsc_stringify_error(LONG e) { return "stub"; }
77+
STUB
78+
79+
zig cc -c -target x86_64-linux-musl -o "$RUNNER_TEMP/pcsclite_stub_amd64.o" "$RUNNER_TEMP/pcsclite_stub.c"
80+
zig cc -c -target aarch64-linux-musl -o "$RUNNER_TEMP/pcsclite_stub_arm64.o" "$RUNNER_TEMP/pcsclite_stub.c"
81+
82+
mkdir -p "$PCSC_DIR/lib/amd64" "$PCSC_DIR/lib/arm64"
83+
ar rcs "$PCSC_DIR/lib/amd64/libpcsclite.a" "$RUNNER_TEMP/pcsclite_stub_amd64.o"
84+
ar rcs "$PCSC_DIR/lib/arm64/libpcsclite.a" "$RUNNER_TEMP/pcsclite_stub_arm64.o"
85+
86+
# Create pkg-config file — Libs will be overridden per-arch via CGO_LDFLAGS in goreleaser
4487
cat > "$PCSC_DIR/lib/pkgconfig/libpcsclite.pc" << EOF
4588
Name: libpcsclite
4689
Description: PC/SC Lite
4790
Version: 1.9.0
4891
Cflags: -I$PCSC_DIR/include
92+
Libs: -L$PCSC_DIR/lib/amd64 -lpcsclite
4993
EOF
5094
5195
echo "PKG_CONFIG_PATH=$PCSC_DIR/lib/pkgconfig" >> $GITHUB_ENV
96+
echo "PCSC_DIR=$PCSC_DIR" >> $GITHUB_ENV
5297
5398
- name: Get macOS SDK path
5499
id: macos_sdk

.github/workflows/release.yml

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,60 @@ jobs:
5050
curl -fsSL "$PCSC_URL/pcsclite.h.in" -o "$PCSC_DIR/include/pcsclite.h"
5151
sed -i '' 's/@VERSION@/1.9.0/' "$PCSC_DIR/include/pcsclite.h"
5252
53-
# Create pkg-config file (headers-only, no library needed for cross-compilation)
53+
# Build stub library — the real libpcsclite is loaded at runtime on the user's system,
54+
# but the linker needs symbols to resolve during cross-compilation.
55+
cat > "$RUNNER_TEMP/pcsclite_stub.c" << 'STUB'
56+
#include <stddef.h>
57+
typedef long LONG;
58+
typedef unsigned long DWORD;
59+
typedef void *LPCVOID;
60+
typedef char *LPSTR;
61+
typedef const char *LPCSTR;
62+
typedef unsigned char *LPBYTE;
63+
typedef unsigned char BYTE;
64+
typedef LONG SCARDCONTEXT;
65+
typedef LONG SCARDHANDLE;
66+
typedef struct { DWORD dwProtocol; DWORD cbPciLength; } SCARD_IO_REQUEST;
67+
typedef struct { LPCSTR szReader; DWORD dwCurrentState; DWORD dwEventState; DWORD cbAtr; unsigned char rgbAtr[36]; void *pvUserData; } SCARD_READERSTATE;
68+
LONG SCardEstablishContext(DWORD s, LPCVOID r1, LPCVOID r2, SCARDCONTEXT *c) { return 0; }
69+
LONG SCardReleaseContext(SCARDCONTEXT c) { return 0; }
70+
LONG SCardIsValidContext(SCARDCONTEXT c) { return 0; }
71+
LONG SCardCancel(SCARDCONTEXT c) { return 0; }
72+
LONG SCardConnect(SCARDCONTEXT c, LPCSTR r, DWORD s, DWORD p, SCARDHANDLE *h, DWORD *ap) { return 0; }
73+
LONG SCardReconnect(SCARDHANDLE h, DWORD s, DWORD p, DWORD d, DWORD *ap) { return 0; }
74+
LONG SCardDisconnect(SCARDHANDLE h, DWORD d) { return 0; }
75+
LONG SCardBeginTransaction(SCARDHANDLE h) { return 0; }
76+
LONG SCardEndTransaction(SCARDHANDLE h, DWORD d) { return 0; }
77+
LONG SCardStatus(SCARDHANDLE h, LPSTR r, DWORD *rl, DWORD *s, DWORD *p, LPBYTE a, DWORD *al) { return 0; }
78+
LONG SCardTransmit(SCARDHANDLE h, const SCARD_IO_REQUEST *si, const BYTE *s, DWORD sl, SCARD_IO_REQUEST *ri, BYTE *r, DWORD *rl) { return 0; }
79+
LONG SCardControl(SCARDHANDLE h, DWORD c, LPCVOID i, DWORD il, void *o, DWORD ol, DWORD *br) { return 0; }
80+
LONG SCardGetAttrib(SCARDHANDLE h, DWORD a, LPBYTE b, DWORD *bl) { return 0; }
81+
LONG SCardSetAttrib(SCARDHANDLE h, DWORD a, const BYTE *b, DWORD bl) { return 0; }
82+
LONG SCardListReaders(SCARDCONTEXT c, LPCSTR g, LPSTR r, DWORD *rl) { return 0; }
83+
LONG SCardListReaderGroups(SCARDCONTEXT c, LPSTR g, DWORD *gl) { return 0; }
84+
LONG SCardGetStatusChange(SCARDCONTEXT c, DWORD t, SCARD_READERSTATE *s, DWORD n) { return 0; }
85+
LONG SCardFreeMemory(SCARDCONTEXT c, LPCVOID m) { return 0; }
86+
const char *pcsc_stringify_error(LONG e) { return "stub"; }
87+
STUB
88+
89+
zig cc -c -target x86_64-linux-musl -o "$RUNNER_TEMP/pcsclite_stub_amd64.o" "$RUNNER_TEMP/pcsclite_stub.c"
90+
zig cc -c -target aarch64-linux-musl -o "$RUNNER_TEMP/pcsclite_stub_arm64.o" "$RUNNER_TEMP/pcsclite_stub.c"
91+
92+
mkdir -p "$PCSC_DIR/lib/amd64" "$PCSC_DIR/lib/arm64"
93+
ar rcs "$PCSC_DIR/lib/amd64/libpcsclite.a" "$RUNNER_TEMP/pcsclite_stub_amd64.o"
94+
ar rcs "$PCSC_DIR/lib/arm64/libpcsclite.a" "$RUNNER_TEMP/pcsclite_stub_arm64.o"
95+
96+
# Create pkg-config file
5497
cat > "$PCSC_DIR/lib/pkgconfig/libpcsclite.pc" << EOF
5598
Name: libpcsclite
5699
Description: PC/SC Lite
57100
Version: 1.9.0
58101
Cflags: -I$PCSC_DIR/include
102+
Libs: -L$PCSC_DIR/lib/amd64 -lpcsclite
59103
EOF
60104
61105
echo "PKG_CONFIG_PATH=$PCSC_DIR/lib/pkgconfig" >> $GITHUB_ENV
106+
echo "PCSC_DIR=$PCSC_DIR" >> $GITHUB_ENV
62107
63108
- name: Get macOS SDK path
64109
id: macos_sdk

.goreleaser.nightly.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ builds:
3131
- >-
3232
{{- if eq .Os "darwin" }}CGO_CFLAGS=-isysroot {{ .Env.SDK_PATH }} -mmacosx-version-min=11.0{{- end }}
3333
- >-
34-
{{- if eq .Os "darwin" }}CGO_LDFLAGS=-isysroot {{ .Env.SDK_PATH }}{{- end }}
34+
{{- if eq .Os "darwin" }}CGO_LDFLAGS=-isysroot {{ .Env.SDK_PATH }}
35+
{{- else if eq .Os "linux" }}CGO_LDFLAGS=-L{{ .Env.PCSC_DIR }}/lib/{{ .Arch }}
36+
{{- end }}
3537
- >-
3638
{{- if eq .Os "darwin" }}
3739
{{- if eq .Arch "amd64"}}CC=clang -arch x86_64 -isysroot {{ .Env.SDK_PATH }}{{- end }}

.goreleaser.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ builds:
4040
- >-
4141
{{- if eq .Os "darwin" }}CGO_CFLAGS=-isysroot {{ .Env.SDK_PATH }} -mmacosx-version-min=11.0{{- end }}
4242
- >-
43-
{{- if eq .Os "darwin" }}CGO_LDFLAGS=-isysroot {{ .Env.SDK_PATH }}{{- end }}
43+
{{- if eq .Os "darwin" }}CGO_LDFLAGS=-isysroot {{ .Env.SDK_PATH }}
44+
{{- else if eq .Os "linux" }}CGO_LDFLAGS=-L{{ .Env.PCSC_DIR }}/lib/{{ .Arch }}
45+
{{- end }}
4446
- >-
4547
{{- if eq .Os "darwin" }}
4648
{{- if eq .Arch "amd64"}}CC=clang -arch x86_64 -isysroot {{ .Env.SDK_PATH }}{{- end }}

0 commit comments

Comments
 (0)