zig cc メモ

2024/06/12に公開

固有のはまりポイントがあるのでメモ。

zig-0.13.0

coff does not support linking multiple objects into one

zig cc -c hoge.cpp に対して複数のソースファイルを渡すと発生。

https://github.com/ziglang/zig/issues/7547

実例。

うっかり msvc の引数を漏らすと発生した。だいぶ悩む。

zig cc /utf-8 -c hoge.cpp

👆 "/utf-8" がファイルと誤認!

実行時に illegal instruction

zig cc というか clang の挙動らしい。

https://github.com/ziglang/zig/issues/4830

実例。

float x = -1.0f;
reinterpret_cast<unsinged char>(x); // 負の値を unsigned に cast できない?

meson から使う

meson-1.4.1

meson には --native-file--cross-file 設定で別のコンパイラを指定する機能がある。
これに、 zig cczig c++ を指定できる。

# zig.ini
# 配列 [] で指定するのがポイント
[binaries]
c = ['zig', 'cc']
cpp = ['zig', 'c++']
ar = ['zig', 'ar']
dlltool = ['zig', 'dlltool']
lib = ['zig', 'lib']
ranlib = ['zig', 'ranlib']
# 'Could not find Windows resource compiler'
windres = ['zig', 'rc']
# `zig cc` をツールチェインとして指定する
$ meson setup builddir --native-file zig.ini

linker の検出

linker の検出でこける。

Unable to detect linker for compiler

meson 改造。

https://github.com/mesonbuild/meson/pull/11918

\Python312\lib\site-packages\mesonbuild\linkers\detect.py
    elif 'Snapdragon' in e and 'LLVM' in e:
        linker = linkers.QualcommLLVMDynamicLinker(
            compiler, for_machine, comp_class.LINKER_PREFIX, override, version=v)
    # 👇これ
    elif o.startswith('zig ld '):
        linker = linkers.QualcommLLVMDynamicLinker(
            compiler, for_machine, comp_class.LINKER_PREFIX, override, version=v)

リソースコンパイラーの検出

Could not determine type of Windows resource compiler

meson 改造。

\Python312\lib\site-packages\mesonbuild\modules\windows.py
        for (arg, match, rc_type) in [
                ('/?', '^.*Microsoft.*Resource Compiler.*$', ResourceCompilerType.rc),
                ('/?', 'LLVM Resource Converter.*$', ResourceCompilerType.rc),
                # 👇これ
                ('/?', '^.*zig rc.*$', ResourceCompilerType.rc),
                ('--version', '^.*GNU windres.*$', ResourceCompilerType.windres),
                ('--version', '^.*Wine Resource Compiler.*$', ResourceCompilerType.wrc),
        ]:
            p, o, e = mesonlib.Popen_safe(rescomp.get_command() + [arg])
            # 👇 o => o or e。[zig, rc, /?] が stderr にメッセージを出すので
            m = re.search(match, o or e, re.MULTILINE)
            if m:
                mlog.log('Windows resource compiler: %s' % m.group())
                self._rescomp = (rescomp, rc_type)
                break
        else:
            raise MesonException('Could not determine type of Windows resource compiler')

Discussion