はじめに
VSCodeでHelloWorldがmakefileを使ってビルドできたので、今回は調子にのってMind 8 for WindowsのKernelをVSCodeでビルドしてみます。
前提条件
VSCodeはなんらかのバージョンが既にインストールされていることが前提です。
MSCは2008バージョンのVisualStudioのVisualC++がインストールされていることが前提です。
今回は具体的には下記のバージョンを想定してお話が進みます。前回の記事でVS Code Makefile Toolsを構成して[Makefile Tools]ビューでビルドできるようになったところからお話が進みます。
Windows11 Pro 22H2
VSCode(Visual Studo Code) 1.86.1
Microsoft Visual C++ 2008 Express Edition
Mind Version 8.0.08 for Windows
VSCodeの拡張機能
VSCodeの拡張機能も下記の通り入っていることが前提です。
C/C++ for Visual Studio Code 1.18.5 Microsoft
C/C++ Extension Pack 1.3.0 Microsoft
C/C++ Extension UI Themes 2.0.0 Microsoft
VS Code Makefile Tools 0.8.22 Microsoft
参考情報
Makefile
Mind 8 for Windowsのmakefileを下図のように簡略化します。ビルド対象からはずしたモジュールに使用されていた変数も削除します。Mind 8 for Windowsのソースコードはオープンですが利用条件不明のため(本件開発者の@killyさんのご了解いただいている認識ですが)コピーライト記載させていただきます。
# Copyright(C) 1985 Scripts Lab. Inc.
CC = cl
OBJDIR = obj
WARNING = -W2
#OPT1 = -Ze ←VC++ 9.0から抑制#
WINLIBS_FOR_NOT_GUI = WSOCK32.LIB advapi32.lib
CFLAGS_LINK = $(WARNING) $(OPT1) /link
CFLAGS_NOLINK = $(WARNING) $(OPT1)
#↑注:"-c"は上位側で付けること#
LINKFLAGS = /DEBUG:none /SUBSYSTEM:console /MACHINE:IX86
USERKERNEL = kernel
COMPKERNEL = compker
OSFUNC = osfunc
WINCONSOLE = wincons
WINCONSOLE_0 = wincons0
WINCONSOLE_D = winconsd
MINDEXEC = mindexec
EXECUTERSUB = mindex
EXECUTERSUBSUB = mindex_readmcode
KICKEREXCUTABLE = mindex.exe
STARTUP = startup
KERMAIN = kermain
SRCRUNTNO = runtno
SRCRUNTNO2 = runtno2
MINDCOMPILER = mind
#------------------------------------------------------#
include sources
#------------------------------------------------------#
usage:
@echo ''
@echo Usage:
@echo '-----------'
@echo make all ユーザ用カーネルとコンパイラ用カーネルのコンパイル
@echo ''
@echo make userkernel ユーザ用カーネル
@echo make compilerkernel コンパイラ用カーネル
@echo ''
@echo '-----------'
@echo make install ユーザ用カーネルとコンパイラ用カーネルのインストール
@echo ''
@echo make install-userkernel ユーザ用カーネルのインストール
@echo make install-compilerkernel コンパイラ用カーネルのインストール @echo ''
# -- make --------------------- #
all: userkernel compilerkernel
userkernel: $(OBJDIR)\$(USERKERNEL).exe $(OBJDIR)\$(MINDEXEC).exe
compilerkernel: $(OBJDIR)\$(COMPKERNEL).exe $(OBJDIR)\$(MINDEXEC).exe
# -- words -------------------- #
allwords: userwords compilerwords
userwords: c_words.wrd
compilerwords: c_words2.wrd
#------------------------------------------------------#
# カーネル本体 #
#------------------------------------------------------#
#--exe--#
$(OBJDIR)\$(USERKERNEL).exe: \
$(OBJDIR)\$(*B).obj $(OBJDIR)\$(STARTUP).obj \
$(OBJDIR)\$(OSFUNC).obj $(OBJDIR)\$(WINCONSOLE_0).obj \
$(OBJDIR)\regquery_lib.obj
link $(LINKFLAGS) /OUT:$(OBJDIR)\$(*B).exe \
$(OBJDIR)\$(*B).obj $(OBJDIR)\$(STARTUP).obj \
$(OBJDIR)\$(OSFUNC).obj $(OBJDIR)\$(WINCONSOLE_0).obj \
$(OBJDIR)\regquery_lib.obj \
$(WINLIBS_FOR_NOT_GUI)
$(OBJDIR)\$(COMPKERNEL).exe: \
$(OBJDIR)\$(*B).obj $(OBJDIR)\$(STARTUP).obj \
$(OBJDIR)\$(OSFUNC).obj \
$(OBJDIR)\regquery_lib.obj
link $(LINKFLAGS) /OUT:$(OBJDIR)\$(*B).exe \
$(OBJDIR)\$(*B).obj $(OBJDIR)\$(STARTUP).obj \
$(OBJDIR)\$(OSFUNC).obj \
$(OBJDIR)\regquery_lib.obj \
advapi32.lib
#--obj--#
$(OBJDIR)\$(USERKERNEL).obj: $(*B).c \
$(NOMIND_SOURCES) $(MINDWORD_SOURCES_NOT_DLL) \
$(SRCRUNTNO).c c_words.def serialno.def \
$(OSFUNC).h $(WINCONSOLE_0).h \
regquery.c regquery_lib.h
$(CC) -c $(CFLAGS_NOLINK) $(*B).c /Fo$(OBJDIR)\$(*B).obj
$(OBJDIR)\$(COMPKERNEL).obj: $(*B).c \
$(NOMIND_SOURCES) $(MINDWORD_SOURCES_COMPILER) \
$(SRCRUNTNO2).c c_words2.def serialno2.def \
$(OSFUNC).h \
regquery.c regquery_lib.h
$(CC) -c $(CFLAGS_NOLINK) $(*B).c /Fo$(OBJDIR)\$(*B).obj
#--共通ライブラリ--#
$(OBJDIR)\$(STARTUP).obj: $(*B).c $(WINCONSOLE_0).h $(KERMAIN).h
$(CC) -c $(CFLAGS_NOLINK) $(*B).c /Fo$(OBJDIR)\$(*B).obj
$(OBJDIR)\$(WINSSTARTUP).obj: $(*B).c $(WINCONSOLE).h $(KERMAIN).h
$(CC) -c $(CFLAGS_NOLINK) $(*B).c /Fo$(OBJDIR)\$(*B).obj
$(OBJDIR)\$(OSFUNC).obj: $(*B).c $(*B).h common.def
$(CC) -c $(CFLAGS_NOLINK) $(*B).c /Fo$(OBJDIR)\$(*B).obj
$(OBJDIR)\$(WINCONSOLE_0).obj:$(*B).c $(*B).h
$(CC) -c $(CFLAGS_NOLINK) $(*B).c /Fo$(OBJDIR)\$(*B).obj
$(OBJDIR)\$(WINCONSOLE_D).obj:$(WINCONSOLE).c $(WINCONSOLE).h
$(CC) -c $(CFLAGS_NOLINK) $(WINCONSOLE).c /Fo$(OBJDIR)\$(*B).obj
$(OBJDIR)\regquery_lib.obj: $(*B).c $(*B).h
$(CC) -c $(CFLAGS_NOLINK) $(*B).c /Fo$(OBJDIR)\$(*B).obj
#------------------------------------------------------#
# カーネル起動プログラム #
#------------------------------------------------------#
#--通常カーネル起動用--#
$(OBJDIR)\$(MINDEXEC).exe: $(*B).c $(EXECUTERSUB).c $(EXECUTERSUBSUB).c try_multipath_exec.c \
common.def $(OSFUNC).h kernel.def filenamehandle.c
$(CC) $(*B).c $(OBJDIR)\$(OSFUNC).obj /Fo$(OBJDIR)\$(*B).obj \
$(CFLAGS_LINK) /OUT:$(OBJDIR)\$(*B).exe \
advapi32.lib
#------------------------------------------------------#
# clean操作 #
#------------------------------------------------------#
clean:
$(RM) $(OBJDIR)\*.obj
$(RM) $(OBJDIR)\*.exe
clean-userwords:
$(RM) c_words.*
clean-compilerwords:
$(RM) c_words2.*
clean-kernels:
$(RM) $(OBJDIR)\$(USERKERNEL).exe
$(RM) $(OBJDIR)\$(USERKERNEL).obj
$(RM) $(OBJDIR)\$(COMPKERNEL).exe
$(RM) $(OBJDIR)\$(COMPKERNEL).obj
#------------------------------------------------------#
# words操作 #
#------------------------------------------------------#
c_words.wrd: \
$(MINDWORD_SOURCES_NOT_DLL) kerbody.c \
$(SRCRUNTNO).c
echo "c2wordsかけますか?"
pause
c2words $(USERKERNEL).c c_words
..\bin\incrserial u
c_words2.wrd: \
$(MINDWORD_SOURCES_COMPILER) kerbody.c
c2words $(COMPKERNEL).c c_words2
..\bin\incrserial 2
c_wordsg.wrd: \
$(MINDWORD_SOURCES_NOT_DLL) kerbody.c \
$(SRCRUNTNOCGI).c
c2words $(CGIKERNEL).c c_wordsg
..\bin\incrserial g
#------------------------------------------------------#
# install操作 #
#------------------------------------------------------#
install: install-userkernel install-compilerkernel
#-----
install-userkernel:
..\bin\copyrunt c_words.wrd obj ..\bin
..\bin\mcpC $(OBJDIR)\$(MINDEXEC).exe ..\bin\$(KICKEREXCUTABLE) -puvn
install-compilerkernel:
..\bin\copyrunt c_words2.wrd obj ..\bin
..\bin\mcpC $(OBJDIR)\$(MINDEXEC).exe ..\bin\$(KICKEREXCUTABLE) -puvn
#EOF#
強烈に複雑であったMind8のmakefileも、ビルド対象のモジュールを2つに限定することで、構造が見えてくるものがあります。
下図のようなフォルダ構成でobjフォルダは空の状態とします。
Visual Studio 2008 command promptを開いて、mind8kernelをカレントディレクトリとしてcode .でVSCodeを起動します。
C:\developments\vscode\mind8kernel>tree
C:.
├─.vscode
└─obj
下図のような感じでVSCodeが開きます。
Make実行
[Makefile Tools]ビューで、「ターゲットのビルド」をクリックすると「all」が選択できますので、それを選択します。
[Makefile Tools]ビューのツールバーの左端の↓が凹にささっているみたいなアイコンをクリックするとmakeが開始されます。
Copyright (C) Microsoft Corporation. All rights reserved.
kernel.c
c:\developments\vscode\mind8kernel\compword.c(2346) : warning C4047: '=' : 間接参照のレベルが 'char *' と 'ULONG' で異なっています。
c:\developments\vscode\mind8kernel\compword.c(2349) : warning C4047: '関 数' : 間接参照のレベルが 'char **' と 'char *' で異なっています。
c:\developments\vscode\mind8kernel\compword.c(2349) : warning C4024: 'strtod' : の型が 2 の仮引数および実引数と異なります。
c:\developments\vscode\mind8kernel\dispword.c(273) : warning C4090: '関数' : 異なる 'const' 修飾子です。
c:\developments\vscode\mind8kernel\dispword.c(357) : warning C4090: '関数' : 異なる 'const' 修飾子です。
c:\developments\vscode\mind8kernel\dispword.c(365) : warning C4090: '関数' : 異なる 'const' 修飾子です。
c:\developments\vscode\mind8kernel\dispword.c(376) : warning C4090: '関数' : 異なる 'const' 修飾子です。
c:\developments\vscode\mind8kernel\dispword.c(384) : warning C4090: '関数' : 異なる 'const' 修飾子です。
c:\developments\vscode\mind8kernel\3ker.c(303) : warning C4028: パラメー
タの型 1 が関数宣言と一致しません。
c:\developments\vscode\mind8kernel\3ker.c(309) : warning C4028: パラメー タの型 1 が関数宣言と一致しません。
c:\developments\vscode\mind8kernel\3ker.c(316) : warning C4028: パラメー
タの型 1 が関数宣言と一致しません。
c:\developments\vscode\mind8kernel\dosdep.c(888) : warning C4133: '関数' : 'int *' と 'char *' の間で型に互換性がありません。
cl -c -W2 startup.c /Foobj\startup.obj
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
startup.c
cl -c -W2 osfunc.c /Foobj\osfunc.obj
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
osfunc.c
cl -c -W2 wincons0.c /Foobj\wincons0.obj
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
wincons0.c
cl -c -W2 regquery_lib.c /Foobj\regquery_lib.obj
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
regquery_lib.c
link /DEBUG:none /SUBSYSTEM:console /MACHINE:IX86 /OUT:obj\kernel.exe obj\kernel.obj obj\startup.obj obj\osfunc.obj obj\wincons0.obj obj\regquery_lib.obj WSOCK32.LIB advapi32.lib
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
cl mindexec.c obj\osfunc.obj /Foobj\mindexec.obj -W2 /link /OUT:obj\mindexec.exe advapi32.lib
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
mindexec.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:mindexec.exe
/OUT:obj\mindexec.exe
advapi32.lib
obj\mindexec.obj
obj\osfunc.obj
cl -c -W2 compker.c /Foobj\compker.obj
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
compker.c
c:\developments\vscode\mind8kernel\compword.c(2346) : warning C4047: '=' : 間接参照のレベルが 'char *' と 'ULONG' で異なっています。
c:\developments\vscode\mind8kernel\compword.c(2349) : warning C4047: '関 数' : 間接参照のレベルが 'char **' と 'char *' で異なっています。
c:\developments\vscode\mind8kernel\compword.c(2349) : warning C4024: 'strtod' : の型が 2 の仮引数および実引数と異なります。
c:\developments\vscode\mind8kernel\dispword.c(273) : warning C4090: '関数' : 異なる 'const' 修飾子です。
c:\developments\vscode\mind8kernel\dispword.c(357) : warning C4090: '関数' : 異なる 'const' 修飾子です。
c:\developments\vscode\mind8kernel\dispword.c(365) : warning C4090: '関数' : 異なる 'const' 修飾子です。
c:\developments\vscode\mind8kernel\dispword.c(376) : warning C4090: '関数' : 異なる 'const' 修飾子です。
c:\developments\vscode\mind8kernel\dispword.c(384) : warning C4090: '関数' : 異なる 'const' 修飾子です。
c:\developments\vscode\mind8kernel\3ker.c(303) : warning C4028: パラメー
タの型 1 が関数宣言と一致しません。
c:\developments\vscode\mind8kernel\3ker.c(309) : warning C4028: パラメー タの型 1 が関数宣言と一致しません。
c:\developments\vscode\mind8kernel\3ker.c(316) : warning C4028: パラメー
タの型 1 が関数宣言と一致しません。
link /DEBUG:none /SUBSYSTEM:console /MACHINE:IX86 /OUT:obj\compker.exe obj\compker.obj obj\startup.obj obj\osfunc.obj obj\regquery_lib.obj advapi32.lib
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
* ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。
けっこう警告はでていますが、すっからかんだったObjフォルダに下記のファイルができていますので、ビルドは成功したようです。
C:\developments\vscode\mind8kernel\obj>dir
C:\developments\vscode\mind8kernel\obj のディレクトリ
2024/02/15 23:30 <DIR> .
2024/02/15 22:50 <DIR> ..
2024/02/15 23:30 181,760 compker.exe
2024/02/15 23:30 167,848 compker.obj
2024/02/15 23:30 291,840 kernel.exe
2024/02/15 23:30 239,452 kernel.obj
2024/02/15 23:30 74,752 mindexec.exe
2024/02/15 23:30 9,234 mindexec.obj
2024/02/15 23:30 1,785 osfunc.obj
2024/02/15 23:30 993 regquery_lib.obj
2024/02/15 23:30 1,166 startup.obj
2024/02/15 23:30 724 wincons0.obj
10 個のファイル 969,554 バイト
おわりに
とりあえずVSCodeエディタの環境からMind8のkernelがビルドできるようになったのでうれしいです。実はまだこの環境でデバッグ開始できるよう構成できていないのですが、近いうちにデバッグ実行できるようにして、Mind8コンパイラのインサイドな動きを勉強させていただきたいと妄想しております。