Skip to content

Commit a066696

Browse files
committed
feat: meson build
1 parent 2b39550 commit a066696

File tree

7 files changed

+101
-4
lines changed

7 files changed

+101
-4
lines changed

deno.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,17 @@
1818
"demo": "deno run --allow-read --allow-write demo-deno.ts",
1919
"test": "deno test --allow-read --allow-write --no-check tests/deno/",
2020
"benchmark": "deno run --allow-read --allow-write bench/tiff.bench.ts",
21-
"build": "deno task build:wasm",
22-
"build:wasm": "./build-dual.sh all",
21+
"build": "deno task build:wasm:meson",
22+
"build:main:meson": "meson setup build-main --cross-file=scripts/emscripten.cross --prefix=$PWD/install -Dlibdir=wasm -Dbindir=wasm && meson compile -C build-main libtiff-main && meson install -C build-main",
23+
"build:side:meson": "meson setup build-side --cross-file=scripts/emscripten.cross --prefix=$PWD/install -Dlibdir=wasm -Dbindir=wasm && meson compile -C build-side libtiff-side && meson install -C build-side",
24+
"build:wasm:meson": "deno task build:main:meson && deno task build:side:meson",
2325
"build:npm": "deno run --allow-all _build_npm.ts",
24-
"clean": "rm -rf build*/ dist/ npm/ && echo '✅ Cleaned all build artifacts'",
26+
"clean": "rm -rf build-* install/ dist/ npm/ && echo '✅ Cleaned all build artifacts'",
2527
"check": "deno check src/lib/index.ts"
2628
},
2729
"compilerOptions": {
2830
"lib": ["deno.ns", "dom", "es2022", "deno.unstable"],
2931
"strict": true,
3032
"noImplicitReturns": true
3133
}
32-
}
34+
}

meson.build

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
project('libtiff.wasm', 'c', version: '4.7.0', meson_version: '>=1.3.0')
2+
3+
simd = get_option('simd')
4+
5+
incs = include_directories('.', 'libtiff')
6+
7+
tiff_sources = files(
8+
'libtiff/tif_aux.c','libtiff/tif_close.c','libtiff/tif_codec.c','libtiff/tif_color.c','libtiff/tif_compress.c','libtiff/tif_dir.c','libtiff/tif_dirinfo.c','libtiff/tif_dirread.c','libtiff/tif_dirwrite.c','libtiff/tif_dumpmode.c','libtiff/tif_error.c','libtiff/tif_extension.c','libtiff/tif_flush.c','libtiff/tif_getimage.c','libtiff/tif_luv.c','libtiff/tif_lzw.c','libtiff/tif_next.c','libtiff/tif_open.c','libtiff/tif_packbits.c','libtiff/tif_pixarlog.c','libtiff/tif_predict.c','libtiff/tif_print.c','libtiff/tif_read.c','libtiff/tif_strip.c','libtiff/tif_swab.c','libtiff/tif_thunder.c','libtiff/tif_tile.c','libtiff/tif_version.c','libtiff/tif_warning.c','libtiff/tif_write.c','libtiff/tif_zip.c'
9+
)
10+
11+
cargs = []
12+
if simd
13+
cargs += ['-msimd128']
14+
endif
15+
16+
# MAIN links to Emscripten zlib and libjpeg
17+
executable('libtiff-main',
18+
files('wasm/libtiff_wasm_module.c') + tiff_sources,
19+
include_directories: incs,
20+
c_args: cargs,
21+
link_args: [
22+
'-sUSE_ZLIB=1','-sUSE_LIBJPEG=1','-sWASM=1','-sMODULARIZE=1','-sEXPORT_ES6=1','-sEXPORT_NAME=LibtiffModule',
23+
'-sALLOW_MEMORY_GROWTH=1','-sNO_FILESYSTEM=1','-sEXPORTED_RUNTIME_METHODS=["cwrap","ccall","UTF8ToString"]','-O3','-flto'
24+
],
25+
install: true,
26+
install_dir: get_option('bindir')
27+
)
28+
29+
# SIDE leaves zlib/jpeg to host
30+
shared_module('libtiff-side',
31+
files('wasm/libtiff_wasm_side.c') + tiff_sources,
32+
include_directories: incs,
33+
name_prefix: '',
34+
c_args: cargs,
35+
link_args: ['-sSIDE_MODULE=2','-fPIC','-O3','-flto','-sERROR_ON_UNDEFINED_SYMBOLS=0','-sEXPORTED_FUNCTIONS=["_libtiff_wasm_version"]'],
36+
install: true,
37+
install_dir: get_option('libdir')
38+
)
39+

meson.options

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
option('main_module', type: 'boolean', value: true)
2+
option('side_module', type: 'boolean', value: true)
3+
option('simd', type: 'boolean', value: true)

scripts/emscripten.cross

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[binaries]
2+
c = 'emcc'
3+
cpp = 'em++'
4+
ar = 'emar'
5+
ranlib = 'emranlib'
6+
strip = 'llvm-strip'
7+
pkgconfig = 'em-pkg-config'
8+
9+
[built-in options]
10+
c_args = []
11+
c_link_args = []
12+
13+
[host_machine]
14+
system = 'emscripten'
15+
cpu_family = 'wasm32'
16+
cpu = 'wasm32'
17+
endian = 'little'

scripts/postinstall.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env python3
2+
import os, sys, shutil
3+
4+
def main():
5+
prefix = os.environ.get('MESON_INSTALL_DESTDIR_PREFIX') or (sys.argv[1] if len(sys.argv) > 1 else None)
6+
if not prefix:
7+
prefix = os.getcwd()
8+
wasm_dir = os.path.join(prefix, 'wasm')
9+
if not os.path.isdir(wasm_dir):
10+
return 0
11+
target = os.path.join(wasm_dir, 'libtiff-side.wasm')
12+
if os.path.exists(target):
13+
return 0
14+
for f in os.listdir(wasm_dir):
15+
if f.endswith('.wasm'):
16+
shutil.copy2(os.path.join(wasm_dir,f), target)
17+
break
18+
return 0
19+
20+
if __name__ == '__main__':
21+
raise SystemExit(main())
22+

wasm/libtiff_wasm_module.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#include <emscripten.h>
2+
#include "libtiff/tiffio.h"
3+
4+
EMSCRIPTEN_KEEPALIVE
5+
const char* libtiff_wasm_version(void) {
6+
return TIFFGetVersion();
7+
}
8+

wasm/libtiff_wasm_side.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#include "libtiff/tiffio.h"
2+
3+
const char* libtiff_wasm_version(void) {
4+
return TIFFGetVersion();
5+
}
6+

0 commit comments

Comments
 (0)