[C++] 228 Visual C++ : Makefile NMAKE版

[Windows11, Visual C++2017, FLTK 1.3.8, NMAKE 14.30, NO IDE]

カラーアプリのMakefileをGNU Make版からMicrosoft NMAKE版に書き換えました。

まずMakefileの文字コードをUTF-8からShift-JISに変更しました。変更しておかないと” U1033 fatal error : ‘:’ unexpected”という意味不明なエラーに悩まされます。

NMAKEではaddprefixやpatsubstのようなこじゃれた関数は用意されていなかったので元のもっさりした書き方に戻しました。あと全依存ファイルを意味する自動変数$^を$**に書き換えました。

修正はこの3点のみでした。これなら普段はGNU Makeで開発し、公開するときだけNMAKEを使っても良さそうです。

StackOverflow英語版ではNMAKEは低機能で使い物にならないなど散々な書かれようですが、ライセンス抵触回避のために存在してくれるだけありがたいです。

なおMacOSで製作したアプリをソースコード公開なしで頒布したい場合は修正BSDライセンスのCMakeでビルドするのが適切かと思われます。

今回のWindowsのケースでもCMakeを使うという選択肢はありましたが、手間を考えてNMAKEにしました。実際初めてでも1時間足らずで移行できました。コツを掴んだので次回からはものの数分でしょう。

# NMAKE版
# コンパイラ設定他
COMPILER = cl
DEBUG = /D "_DEBUG"
CONSOLE = /SUBSYSTEM:CONSOLE
WINDOWS = /SUBSYSTEM:WINDOWS
LINKER = LINK
RESOURCE = "ColorSampleJP.res"

# オプション設定
CPPFLAGS = /std:c++17 /GS /W3 /Zc:wchar_t /ZI /Gm- /Od /sdl  /Zc:inline /fp:precise /D "_UNICODE" \
/errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /FC /c /diagnostics:column /EHsc
LDFLAGS = /DEBUG /MACHINE:X64 /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libcmtd.lib /OPT:REF /INCREMENTAL:NO

# includeパス(-I)
INCLUDE = /I"C:\packages\fltk-1.3.8\include" \
/I"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\atlmfc\include" \
/I"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" \
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\cppwinrt" \
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\ucrt" \
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared" \
/I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\Include\um" \
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um" \
/I"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\include" \
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\winrt"

INCLUDE2 = /I"D:\code\VC++\Projects\ColorSampleJP\include" \
/I"D:\code\VC++\Projects\ColorConvert\ColorConvert" \
/I"D:\code\VC++\Projects\Split\Split" \
/I"D:\code\VC++\mylib_vc\include" \
/I"D:\code\VC++\Projects\ColorSampleJP\images" \

# ライブラリ(-l)
LIBRARY_l = /DYNAMICBASE "wsock32.lib" "comctl32.lib" \
"kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" \
"comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" \
"uuid.lib" "odbc32.lib" "odbccp32.lib" \
"CharExtract.lib" "Funcs.lib" "ColorConvert.lib" "Split.lib"

LIBRARY_l_Debug = "fltkd.lib" "fltk_jpegd.lib" "fltk_imagesd.lib" "fltk_pngd.lib" "fltk_formsd.lib" "fltk_gld.lib" "fltk_zd.lib"
LIBRARY_l_Release = "fltk.lib" "fltk_jpeg.lib" "fltk_images.lib" "fltk_png.lib" "fltk_forms.lib" "fltk_gl.lib" "fltk_z.lib"

# ライブラリパス(-L)
LIBRARY_L = /LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\ATLMFC\lib\x64" \
/LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\lib\x64" \
/LIBPATH:"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" \
/LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.22000.0\ucrt\x64" \
/LIBPATH:"C:\Program Files (x86)\Windows Kits\10\\lib\10.0.22000.0\\um\x64" \
/LIBPATH:"D:\code\VC++\mylib_vc\lib"

LIBRARY_L_Debug = /LIBPATH:"C:\packages\fltk-1.3.8\lib\Debug" \
/LIBPATH:"D:\code\VC++\Projects\ColorConvert\x64\Debug" \
/LIBPATH:"D:\code\VC++\Projects\Split\x64\Debug"
LIBRARY_L_Release = /LIBPATH:"C:\packages\fltk-1.3.8\lib\Release" \
/LIBPATH:"D:\code\VC++\Projects\ColorConvert\x64\Release" \
/LIBPATH:"D:\code\VC++\Projects\Split\x64\Release"

# ソースファイル
SRCDIR = .\src
SRCS = $(SRCDIR)\btnAction.cpp $(SRCDIR)\FileChooser.cpp $(SRCDIR)\FileChooser2.cpp $(SRCDIR)\main.cpp \
$(SRCDIR)\modalDialog.cpp $(SRCDIR)\searchLocation.cpp $(SRCDIR)\csvProcessChar.cpp $(SRCDIR)\AddOn.cpp \
$(SRCDIR)\AddOnDialog.cpp $(SRCDIR)\AddOnPurchase.cpp

# オブジェクトファイル
OBJDIR = .\obj
OBJS = $(OBJDIR)\btnAction.obj $(OBJDIR)\FileChooser.obj $(OBJDIR)\FileChooser2.obj $(OBJDIR)\main.obj \
$(OBJDIR)\modalDialog.obj $(OBJDIR)\searchLocation.obj $(OBJDIR)\csvProcessChar.obj $(OBJDIR)\AddOn.obj \
$(OBJDIR)\AddOnDialog.obj $(OBJDIR)\AddOnPurchase.obj

# 実行ファイル
TARGETDIR = .\bin
TARGET = ColorSampleJP.exe

# cppファイルからobjファイル作成 $**:全依存ファイル
# デバッグ
$(OBJS): $(SRCS)
	$(COMPILER) $(CPPFLAGS) $(DEBUG) $(INCLUDE) $(INCLUDE2) $**
	move *.obj $(OBJDIR) >nul

# リリース
# $(OBJS): $(SRCS)
# 	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(INCLUDE2) $^
# 	move *.obj $(OBJDIR) >nul

# objファイルから実行ファイル作成
# デバッグ
$(TARGET):
	$(LINKER) $(CONSOLE) $(LIBRARY_l) $(LIBRARY_l_Debug) $(LIBRARY_L) $(LIBRARY_L_Debug) $(OBJS) $(LDFLAGS) $(RESOURCE)
	rename btnAction.exe $(TARGET)
	move $(TARGET) $(TARGETDIR) >nul

# リリース
# $(TARGET):
# 	$(LINKER) $(WINDOWS) $(RELEASE) $(LIBRARY_l) $(LIBRARY_l_Release) $(LIBRARY_L) $(LIBRARY_L_Release) $(OBJS) $(LDFLAGS) $(RESOURCE)
# 	rename btnAction.exe $(TARGET)
# 	move $(TARGET) $(TARGETDIR) >nul

# ビルド
.PHONY:all
all: obj $(TARGET)

.PHONY:all2
all2: clean obj $(TARGET)

# objファイル作成
.PHONY:obj
obj: $(OBJS)

# ファイル削除
.PHONY:clean
clean:
	del /Q $(TARGETDIR)\$(TARGET) $(OBJS) vc140.idb vc140.pdb btnAction.pdb

# 変数確認
.PHONY:var
var:
	echo $(SRCS)
	echo $(OBJS)