@@ -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
0 commit comments