🏌️♂️
Checked C clang の環境を用意する
はじめに
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を作られている方がいました。
こちらを参考にします。
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