2016-06-02 6 views
0

ソースファイルのディレクトリリストを解析してメイクファイルにエコーして、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に混合スタイルパスを強制的に生成させるにはどうすればよいですか?

+1

GCCを呼び出すときに放出される実際のコマンドを見たことがありますか?私の推測は '-I'指令であり、犯人です。 GCC '-MMD' /' -MD'オプションは、その場で依存関係を生成する可能性があります。 – user657267

+0

はい、 '-I'のパスはすべて混合されたスタイルのパスなので、悲しいことではありません。私は 'cygpath -m'に' $ sourcePaths'と '$ path'をラップしても、問題は解決しません。私は '-MMD' /' -MD'オプションを見るつもりですが、それを稼働させることは私のリストatmの最初のものです。 – Soukyuu

答えて

0

私のプロジェクトで同じ問題が発生することがあります。私はWindowsのCygwinからgmake.exeを使用しています。

gcc -MMを1回呼び出すと、Windowsスタイルのパス(C:/project/file.h)とCygwinスタイルのパス(/cygdrive/c/project/file.h)の両方が出力されます。

これを修正する方法はわかりませんが、私はCygwinスタイルのパスへの変更を引き起こすものを発見しました。これはインクルードが相対パスを使用している場合に発生します。したがって、ファイルに#include "../file.h"が含まれている場合、gcc -MMの出力には、file.hという絶対パスが含まれ、Cygwin形式のパスが使用されます。