@echo off rem 汎用簡易make用依存関係ファイル作成script for VisualC++/nmake Ver.1.21 rem .C/.CPP/.Hから.Hをincludeしている部分を抽出し、nmake用に吐き出す rem 対象はカレントdir以下, サブディレクトリは再帰検索 setlocal enabledelayedexpansion :出力ファイルとテンポラリ(変更可能だが空白は動作しない というか破滅的動作) set OUTFILE=Makedepends.txt set TMPFILE=deptmp.txt for /f "DELIMS=" %%A IN ('cd') DO SET BASEDIR=%%A type nul > %TMPFILE% :ディレクトリを再帰検索してテンポラリに溜めておく for /R /D %%i in (*) do ( set FP=%%i set RP=!FP:%BASEDIR%\=! set TARGETEXTS= if exist !RP!\*.c set TARGETEXTS=!TARGETEXTS! !RP!\*.c if exist !RP!\*.cpp set TARGETEXTS=!TARGETEXTS! !RP!\*.cpp if exist !RP!\*.h set TARGETEXTS=!TARGETEXTS! !RP!\*.h if not "!TARGETEXTS!"=="" ( find "#include" !TARGETEXTS! >> %TMPFILE% ) ) :Cソースからincludeプリプロをfindして終端を追加 :MEMO:findコマンドの出力ファイル名が英大文字でないVer.では不具合が出る set TARGETEXTS= if exist *.c set TARGETEXTS=%TARGETEXTS% *.c if exist *.cpp set TARGETEXTS=%TARGETEXTS% *.cpp if exist *.h set TARGETEXTS=%TARGETEXTS% *.h find "#include" %TARGETEXTS% >> %TMPFILE% echo endoffinds >> %TMPFILE% set DEPLINE= del !OUTFILE! > NUL 2>&1 :コマンド「del ""」は「del *」と同じ結果になるので注意 FOR /F "usebackq tokens=1,2" %%i IN (%TMPFILE%) do ( if "%%i"=="#include" ( set INCNAME=%%j if not "!INCNAME:~-1!" == ">" ( :doublequoteで括られているので、依存する.hをobjの後ろに並べる set DEPLINE=!DEPLINE! !INCNAME:~1,-1! ) ) else ( :次のファイル if not "!DEPLINE!"=="" ( :新しいファイルに移行or終端なので、依存関係をmakefileに出力 echo !DEPLINE!>> !OUTFILE! ) :C/CPPソースファイルからobjファイル名を作る set CSCNAME=%%j if "!CSCNAME:~-2!" == ".H" ( :拡張子.hはobjでないので自分自身の名前を加える必要がない set DEPLINE=!CSCNAME!: ) else ( set OBJNAME=!CSCNAME:.cpp=.obj! set DEPLINE=!OBJNAME:.c=.obj!: !CSCNAME! ) ) ) del %TMPFILE%