ソースファイルのディレクトリリストを解析してメイクファイルにエコーして、gcc -MM
の実際のメーカーを作成するbashスクリプト(レガシー)があります。スクリプトは正常に動作しますが、問題は、生成されたmakefile上でmake
を実行すると、メーカールに一貫性のないパス形式が生成されるということです - ほとんどのメーカーが混合スタイルパス(ok)、cygwinスタイルパス(ok)これはcygwinの非常に古い(〜2002リリース)では起こりませんでした。ここでgcc -MM on cygwin:Unixスタイルのパス
はスクリプトです:
#!/bin/bash
fn_source=SourceFileList
fn_depmake=depMakefile
fn_orgMake=Makefile
fn_depIncl=Depend.incl
fn_optIncl=OptimizationCflags.incl
#
# create a Makefile to determine the dependencies
echo -n create dep-makefile ...\
#
# generate include for Optimization-File
#
echo > $fn_depIncl
echo include $fn_optIncl >> $fn_depIncl
echo >> $fn_depIncl
#
touch $fn_optIncl
#
echo > $fn_depmake
# CFLAGS options from Makefile
grep "^CFLAGS[ =]" $fn_orgMake | grep $BUILD_SPEC >> $fn_depmake
grep "^CFLAGS_AS[ =]" $fn_orgMake | grep $BUILD_SPEC >> $fn_depmake
grep "^CFLAGS_GCC[ =]" $fn_orgMake | grep $BUILD_SPEC >> $fn_depmake
echo -n generate depMakefile ...
echo >> $fn_depmake
# the default rule
echo all: >> $fn_depmake
FileList=`cat $fn_source`
incPath=""
rawIncPath=""
for fn in $FileList; do
incPath=$incPath" -I"${fn%/*}
rawIncPath=$rawIncPath" "${fn%/*}
done
# filter out redundant paths
echo $incPath | \
sed -n -e 's/ /\
/gp' | \
sort -u > _tmp
incPath=`cat _tmp`
# filter out redundant paths
echo $rawIncPath | \
sed -n -e 's/ /\
/gp' | \
sort -u > _tmp
rawIncPath=`cat _tmp`
#
# create file with include paths
#
echo LibIncludes=$incPath > LibIncludes
#
# put all source files with the same path in one gcc command
#
for path in $rawIncPath; do
sourceFiles=`grep $path/ $fn_source`
echo " "echo do $path >> $fn_depmake
echo " "gcc -MM '$(CFLAGS_GCC)' -I$path $sourceFiles \>\> _tmp >> $fn_depmake
done
# start the Makefile
echo start Makefile ...
rm _tmp; touch _tmp
make -s -f $fn_depmake
# add ./obj/xxxxx*.o to the make-rules
sed -e 's/\(^[a-zA-Z]\)/.\/obj\/\1/' <_tmp> _tmp1
# add command to the make-rules
sed -e '/\\/!a\
$(CC) $($(*F)CFLAGS) -I$(<D) $(CFLAGS) -c $< -o [email protected]' <_tmp1>> $fn_depIncl
# workaround for gcc generating cygdrive paths for some paths only
sed -i 's#/cygdrive/d#d:#' $fn_depIncl
rm _tmp _tmp1
rm $fn_depmake
echo done.
あなたが見ることができるように、私は現在sed
を用いて混合スタイルのものにそれらのパスを変換するための回避策を使用していますが、私はこれが最初で起こる理由を知りたいです場所? 「間違っている」行っルールの
例:
some.o: d:/some/path/A/some.cpp \
d:/some/path/A/some.h \
/cygdrive/d/some/path/B/subpathA/anotherheader.h \
/cygdrive/d/some/path/B/subpathA/yetanotherheader.h \
D:/some/path/B/subpathB/header.h
これについての主な問題は、得られたメイクファイルをすることになっているもの/cygdrive/d/path
ないアイデアを持っていないWindowsネイティブMAKE.EXEに供給されていることです。
私は各ステップの後のパスを見ていて、それらはすべてmake -s -f $fn_depmake
まで実行されます。つまり、cygwinスタイルのパスへの時折の変換は、生成されたmakefileのgcc -MM
コマンドによって行われます。
これは、常に/cygdrive/d/pathA/somefile.cpp
パスのスタイルに変換されるディレクトリの同じリストです。パスに珍しいものはありません。スペースはありません。名前にa-z/A-Zのみ、パスの長さは短く、最長パスはファイル名を含めて76文字です。ベースパスは34文字です。
gccに混合スタイルパスを強制的に生成させるにはどうすればよいですか?
GCCを呼び出すときに放出される実際のコマンドを見たことがありますか?私の推測は '-I'指令であり、犯人です。 GCC '-MMD' /' -MD'オプションは、その場で依存関係を生成する可能性があります。 – user657267
はい、 '-I'のパスはすべて混合されたスタイルのパスなので、悲しいことではありません。私は 'cygpath -m'に' $ sourcePaths'と '$ path'をラップしても、問題は解決しません。私は '-MMD' /' -MD'オプションを見るつもりですが、それを稼働させることは私のリストatmの最初のものです。 – Soukyuu