Skip to content

Commit 43730e9

Browse files
committed
Testing automated windows DLL packaging
1 parent 63b5a41 commit 43730e9

File tree

2 files changed

+98
-35
lines changed

2 files changed

+98
-35
lines changed

.github/workflows/c-cpp-windows-i686.yml

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ jobs:
2121
base-devel
2222
git
2323
mingw-w64-i686-gcc
24+
mingw-w64-i686-nodejs
2425
mingw-w64-i686-openssl
2526
mingw-w64-i686-v8
2627
mingw-w64-i686-icu
@@ -35,41 +36,7 @@ jobs:
3536
- shell: msys2 {0}
3637
run: |
3738
make -j 4
38-
cp /mingw32/bin/libgcc_s_dw2-1.dll ./
39-
cp /mingw32/bin/libstdc++-*.dll ./
40-
cp /mingw32/bin/libwinpthread-1.dll ./
41-
cp /mingw32/bin/libfreetype-6.dll ./
42-
cp /mingw32/bin/liblcms2-*.dll ./
43-
cp /mingw32/bin/glew32.dll ./
44-
cp /mingw32/bin/libpng*.dll ./
45-
cp /mingw32/bin/libv8.dll ./
46-
cp /mingw32/bin/SDL2_image.dll ./
47-
cp /mingw32/bin/SDL2.dll ./
48-
cp /mingw32/bin/libv8_libplatform.dll ./
49-
cp /mingw32/bin/libbz2-*.dll ./
50-
cp /mingw32/bin/libbrotli*.dll ./
51-
cp /mingw32/bin/libharfbuzz-*.dll ./
52-
cp /mingw32/bin/zlib1.dll ./
53-
cp /mingw32/bin/libwebp-*.dll ./
54-
cp /mingw32/bin/libjpeg-*.dll ./
55-
cp /mingw32/bin/libtiff-*.dll ./
56-
cp /mingw32/bin/libv8_libbase.dll ./
57-
cp /mingw32/bin/libcrypto-*.dll ./
58-
cp /mingw32/bin/libssl-*.dll ./
59-
cp /mingw32/bin/libicuin*.dll ./
60-
cp /mingw32/bin/libicuuc*.dll ./
61-
cp /mingw32/bin/libicudt*.dll ./
62-
cp /mingw32/bin/libpcre*.dll ./
63-
cp /mingw32/bin/libintl-*.dll ./
64-
cp /mingw32/bin/libiconv-*.dll ./
65-
cp /mingw32/bin/libglib-*.dll ./
66-
cp /mingw32/bin/libgraphite2.dll ./
67-
cp /mingw32/bin/libdeflate.dll ./
68-
cp /mingw32/bin/libjbig-*.dll ./
69-
cp /mingw32/bin/libjxl*.dll ./
70-
cp /mingw32/bin/libLerc.dll ./
71-
cp /mingw32/bin/libzstd.dll ./
72-
cp /mingw32/bin/liblzma-*.dll ./
39+
node package_win.js dotto.exe
7340
cp /mingw32/bin/snapshot_blob.bin ./
7441
- name: Archive production artifacts
7542
uses: actions/upload-artifact@v2

package_win.js

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
const path = require('path');
2+
const fs = require('fs');
3+
const {env} = require('process');
4+
const searchDir = env.PATH.split(path.delimiter);
5+
const blacklist = [
6+
"advapi32.dll", "kernel32.dll", "msvcrt.dll", "ole32.dll", "user32.dll",
7+
"ws2_32.dll", "comdlg32.dll", "gdi32.dll", "imm32.dll", "oleaut32.dll",
8+
"shell32.dll", "winmm.dll", "winspool.drv", "wldap32.dll",
9+
"ntdll.dll", "d3d9.dll", "mpr.dll", "crypt32.dll", "dnsapi.dll",
10+
"shlwapi.dll", "version.dll", "iphlpapi.dll", "msimg32.dll", "setupapi.dll",
11+
"opengl32.dll", "dwmapi.dll", "uxtheme.dll", "secur32.dll", "gdiplus.dll",
12+
"usp10.dll", "comctl32.dll", "wsock32.dll", "netapi32.dll", "userenv.dll",
13+
"avicap32.dll", "avrt.dll", "psapi.dll", "mswsock.dll", "glu32.dll",
14+
"bcrypt.dll", "rpcrt4.dll", "hid.dll", "dbghelp.dll",
15+
"d3d11.dll", "dxgi.dll", "dwrite.dll"
16+
];
17+
18+
async function call(file, {args, grep, callback}) {
19+
const {spawn} = require('child_process');
20+
return new Promise((resolve, fail) => {
21+
const proc = spawn(file, args);
22+
let aborted = false;
23+
let stdout = '';
24+
let stderr = '';
25+
proc.stdout.on('data', data => {
26+
try {
27+
stdout = (stdout += data).replace(/^.*$/gm, line => {
28+
line.replace(grep, callback);
29+
return '';
30+
})
31+
} catch (abort) {
32+
aborted = true;
33+
proc.kill();
34+
}
35+
});
36+
proc.stderr.on('data', (data) => stderr += data);
37+
proc.on('close', (error) => {
38+
if (aborted) {
39+
resolve(stdout);
40+
} else {
41+
if (error) fail({file, args, error, stdout, stderr})
42+
else resolve(stdout);
43+
}
44+
});
45+
});
46+
}
47+
48+
function copyDependencies(exe, target) {
49+
call('objdump', {
50+
args:['-p', exe],
51+
grep:/DLL Name: (.*)|PE File Base Relocations/gi,
52+
callback: (_, dll) => {
53+
if (!dll)
54+
throw 0;
55+
if (!blacklist.includes(dll.toLowerCase())) {
56+
blacklist.push(dll.toLowerCase());
57+
addImport(dll, [...searchDir]);
58+
}
59+
}
60+
});
61+
62+
function addImport(dll, searchQueue) {
63+
if (!searchQueue || !searchQueue.length) {
64+
if (dll.toLowerCase() != dll) addImport(dll.toLowerCase(), [...searchDir]);
65+
else {
66+
blacklist.push(dll);
67+
console.log('could not find', dll);
68+
}
69+
return;
70+
}
71+
const src = path.join(searchQueue.pop(), dll);
72+
fs.copyFile(src, path.join(target, dll), fs.constants.COPYFILE_FICLONE, (err) => {
73+
if (err) addImport(dll, searchQueue);
74+
else {
75+
console.log('copied', src);
76+
copyDependencies(src, target);
77+
}
78+
});
79+
}
80+
}
81+
82+
async function main(exe) {
83+
if (!exe) {
84+
console.log('No exe given');
85+
} else try {
86+
await copyDependencies(exe, path.dirname(exe));
87+
} catch (ex) {
88+
if (ex && ex.stderr) {
89+
console.error(`Running ${ex.file} ${ex.args.join(" ")}:\n${ex.error}`);
90+
} else {
91+
console.error(ex);
92+
}
93+
}
94+
}
95+
96+
main(require('process').argv[2]);

0 commit comments

Comments
 (0)