🏌️‍♂️

Checked C clang の環境を用意する

2022/04/17に公開約13,100字

はじめに

Checked C clangの環境を用意します。
ここでは以下の環境を用意します。

  • OS : Windows 11 Pro
  • clang --version
    clang version 12.0.1 (https://github.com/Microsoft/checkedc-clang 249894cbba5f05cdbb634bc2dd1f414923d8d6b6)
    Target: x86_64-pc-windows-msvc
    Thread model: posix
    InstalledDir: C:\Program Files\CheckedC-Clang\bin

まずはLua 5.4.4 をビルドできる
環境を目指します。

前提

Visual Studio と Microsoft C/C++ ツールをインストールします。
インストール方法はこのあたりが参考になります。

Checked C clangのインストール

ここからCheckedC-Clang-12.0.1-rel3-win64.exeをダウンロードしてインストールします。

Lua 5.4.4のビルド

Visual Studioをインストールすると、nmakeがインストールされます。
Gnu makeとはちょっと違うので、
Lua 5.4.4のソースツリー内に入っているMakefileはそのまま使えません。

探したら、nmake用のMakefileを作られている方がいました。

https://github.com/eel3/lua_nmake_template

こちらを参考にします。

Makefileの作成

以下のようにMakefile.nmakeを作成しました。
https://github.com/eel3/lua_nmake_templateとの差分は
exeを作るようにしたくらいです。

Makefile.nmake
CORE_O=	lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o
LIB_O=	lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o

# -- copy from original Makefile : end ---------------------------------

OBJS    = $(CORE_O) $(LIB_O)

LUAV        = 5.4.4
LUALIB      = liblua$(LUAV).lib
LUADLLBASE  = lua$(LUAV)
LUADLL      = $(LUADLLBASE).dll
LUADLLLIB   = $(LUADLLBASE).lib
LUADLLEXP   = $(LUADLLBASE).exp
LUAEXE      = $(LUADLLBASE).exe
LUA_O       = lua.o

RESULT  = $(LUALIB) $(LUADLL) $(LUADLLLIB) $(LUADLLEXP)

# ----------------------------------------------------------------------
CC= clang-cl
WARN    = /W4
RUNTIME = /MT
OPTIM   = /Od

CFLAGS  = /GS $(WARN) $(RUNTIME) $(OPTIM) /DWIN32 /D_WINDOWS /D_MBCS \
          /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL

LDFLAGS = /LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.31.31103\lib\x64" \
          /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64" \
          /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64"

# ----------------------------------------------------------------------

usage:
	@echo usage: nmake /f ^<this_makefile_name^> [all^|dll^|lib]

all: lib dll exe
lib: $(LUALIB)
dll: $(LUADLL)
exe: $(LUAEXE)

$(LUALIB): $(OBJS)
	lib.exe /OUT:$@ $(OBJS)

$(LUADLL): $(OBJS)
	link.exe /OUT:$@ /DLL $(LDFLAGS) $(OBJS)

$(LUAEXE): $(LUA_O) $(LUADLL)
	link.exe /OUT:$@ $(LUA_O) $(LDFLAGS) $(LUALIB) $(LUADLLLIB)

clean:
	del $(OBJS) $(RESULT)

.c.o:
	$(CC) $(CFLAGS) /Fo$@ /c $<

# -- copy from original Makefile : begin -------------------------------

lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \
 lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \
 ltable.h lundump.h lvm.h
lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h
lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \
 llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \
 ldo.h lgc.h lstring.h ltable.h lvm.h
lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h
ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \
 lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \
 ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h
ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \
 lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \
 lparser.h lstring.h ltable.h lundump.h lvm.h
ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \
 ltm.h lzio.h lmem.h lundump.h
lfunc.o: lfunc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
 llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h
lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
 llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h
linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h
liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \
 lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lgc.h llex.h lparser.h \
 lstring.h ltable.h
lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
 llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h
loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \
 ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \
 lvm.h
lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h
loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \
 llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \
 ldo.h lfunc.h lstring.h lgc.h ltable.h
lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \
 lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \
 lstring.h ltable.h
lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \
 lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h
lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
 llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h
ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
 llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h
lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
luac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h ldebug.h lstate.h \
 lobject.h llimits.h ltm.h lzio.h lmem.h lopcodes.h lopnames.h lundump.h
lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \
 lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \
 lundump.h
lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h
lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \
 llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \
 ltable.h lvm.h ljumptab.h
lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \
 lobject.h ltm.h lzio.h

ビルド

以下のようにnmakeコマンドを実行します。

>nmake /f Makefile.nmake all

Microsoft(R) Program Maintenance Utility Version 14.31.31105.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folapi.o /c lapi.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folcode.o /c lcode.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folctype.o /c lctype.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Foldebug.o /c ldebug.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Foldo.o /c ldo.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Foldump.o /c ldump.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folfunc.o /c lfunc.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folgc.o /c lgc.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Follex.o /c llex.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folmem.o /c lmem.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folobject.o /c lobject.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folopcodes.o /c lopcodes.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folparser.o /c lparser.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folstate.o /c lstate.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folstring.o /c lstring.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Foltable.o /c ltable.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Foltm.o /c ltm.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folundump.o /c lundump.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folvm.o /c lvm.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folzio.o /c lzio.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folauxlib.o /c lauxlib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folbaselib.o /c lbaselib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folcorolib.o /c lcorolib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Foldblib.o /c ldblib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Foliolib.o /c liolib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folmathlib.o /c lmathlib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Foloadlib.o /c loadlib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Foloslib.o /c loslib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folstrlib.o /c lstrlib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Foltablib.o /c ltablib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folutf8lib.o /c lutf8lib.c
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folinit.o /c linit.c
        lib.exe /OUT:liblua5.4.4.lib lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
Microsoft (R) Library Manager Version 14.31.31105.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        link.exe /OUT:lua5.4.4.dll /DLL /LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.31.31103\lib\x64"  /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64"  /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64" lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
Microsoft (R) Incremental Linker Version 14.31.31105.0
Copyright (C) Microsoft Corporation.  All rights reserved.

   ライブラリ lua5.4.4.lib とオブジェクト lua5.4.4.exp を作成中
        clang-cl /GS /W4 /MT /Od /DWIN32 /D_WINDOWS /D_MBCS  /DNDEBUG /DLUA_COMPAT_5_4 /DLUA_BUILD_AS_DLL /Folua.o /c lua.c
        link.exe /OUT:lua5.4.4.exe lua.o /LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.31.31103\lib\x64"  /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64"  /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64" liblua5.4.4.lib lua5.4.4.lib
Microsoft (R) Incremental Linker Version 14.31.31105.0
Copyright (C) Microsoft Corporation.  All rights reserved.

ちゃんと実行できるようになりました。

lua5.4.4.exe 
Lua 5.4.4  Copyright (C) 1994-2022 Lua.org, PUC-Rio
> print("hello")
hello
>

まとめ

まずは、Checked C clangの環境を作ることができました。
これからいろいろ試してみようかと思います。

Discussion

ログインするとコメントできます