最近有一汽车客户试用Coverity,开发IDE为FreeScale CodeWarrior,目标平台为mppc,编译器为 mwcceppc,在Build过程中发现,Coverity无法监控到编译器活动,查看build-log,发现IDE根本没有调用编译器,或者调用了没有监控到。
联想到之前一个客户使用ARM的CodeWarrior,也有这个问题,但好在ARM提供了一个mcp2make(CodeWarrior的project文件扩展名为.mcp)的小工具,可以将工程文件直接转换成makefile。但FreeScale好像没有那么好心,各种baidu/360/google/。。。都没有找到答案,反而搜出一大堆类似的问题。
好吧,只能自己解决了,不过我可没想着搞出一个非常完善的makefile,那不是我的目的,我只想着解决我眼前的问题,也就是让coverity能顺利分析代码,仅此而已。
说干就干,
Python是首选的工具,一个小时后,搞定!下面是Python脚本,在2.7版本调试通过。
import os
import glob
folderList = []
optionI = ''
optionO = ' '
def listyoudir(level,path):
for i in os.listdir(path):
print ' '*(level+1)+i
if os.path.isdir(path+'\\'+i):
listyoudir(level+1, path+'\\'+i)
def listFolderDir(path):
for i in os.listdir(path):
if os.path.isdir(path+'\\'+i):
folderList.append(path+'\\'+i)
listFolderDir(path+'\\'+i)
def incOption(folder):
ptionI = ''
for ds in folder:
optionI += '-I\"' + ds + '\"' + ' '
return optionI
def listSrcDir(path):
os.chdir(path)
return glob.glob('*.c') + glob.glob('*.cpp') + glob.glob('*.cxx')
rootpath = os.path.abspath('d:\\coverity\\codewarrior')
listFolderDir(rootpath)
optionI = incOption(folderList)
with open(rootpath+'\\options.ini') as f1:
(tmp, compiler) = f1.readline().split(' = ')
for line in f1:
optionO += line.rstrip() + ' '
folderList.append(rootpath)
compiler = compiler.rstrip() + ' '
#print folderList
with open(rootpath+'\\make.bat', mode='w') as f2:
src = ''
for folder in folderList:
f2.write('cd /d ' + folder + '\n')
srcList = listSrcDir(folder)
print srcList
for src in srcList:
f2.write(compiler + optionI + optionO + src + '\n')
生成的简易的批处理make.bat如下
cd /d d:\coverity\codewarrior\c
mwcceppc -I"d:\coverity\codewarrior\c" -I"d:\coverity\codewarrior\c1" -I"d:\coverity\codewarrior\c1\inc" -I"d:\coverity\codewarrior\c2" -I"d:\coverity\codewarrior\c2\in" -I"C:\Program Files (x86)\Google\Google Pinyin 2" -DCPU=MPPC52XX --c99 --gnu --cxx=1 t.cpp
cd /d d:\coverity\codewarrior\c1
mwcceppc -I"d:\coverity\codewarrior\c" -I"d:\coverity\codewarrior\c1" -I"d:\coverity\codewarrior\c1\inc" -I"d:\coverity\codewarrior\c2" -I"d:\coverity\codewarrior\c2\in" -I"C:\Program Files (x86)\Google\Google Pinyin 2" -DCPU=MPPC52XX --c99 --gnu --cxx=1 c1b.c
cd /d d:\coverity\codewarrior\c1\inc
mwcceppc -I"d:\coverity\codewarrior\c" -I"d:\coverity\codewarrior\c1" -I"d:\coverity\codewarrior\c1\inc" -I"d:\coverity\codewarrior\c2" -I"d:\coverity\codewarrior\c2\in" -I"C:\Program Files (x86)\Google\Google Pinyin 2" -DCPU=MPPC52XX --c99 --gnu --cxx=1 a.c
cd /d d:\coverity\codewarrior\c2
mwcceppc -I"d:\coverity\codewarrior\c" -I"d:\coverity\codewarrior\c1" -I"d:\coverity\codewarrior\c1\inc" -I"d:\coverity\codewarrior\c2" -I"d:\coverity\codewarrior\c2\in" -I"C:\Program Files (x86)\Google\Google Pinyin 2" -DCPU=MPPC52XX --c99 --gnu --cxx=1 c2a.c
cd /d d:\coverity\codewarrior\c2\in
mwcceppc -I"d:\coverity\codewarrior\c" -I"d:\coverity\codewarrior\c1" -I"d:\coverity\codewarrior\c1\inc" -I"d:\coverity\codewarrior\c2" -I"d:\coverity\codewarrior\c2\in" -I"C:\Program Files (x86)\Google\Google Pinyin 2" -DCPU=MPPC52XX --c99 --gnu --cxx=1 ab.cxx
cd /d d:\coverity\codewarrior
mwcceppc -I"d:\coverity\codewarrior\c" -I"d:\coverity\codewarrior\c1" -I"d:\coverity\codewarrior\c1\inc" -I"d:\coverity\codewarrior\c2" -I"d:\coverity\codewarrior\c2\in" -I"C:\Program Files (x86)\Google\Google Pinyin 2" -DCPU=MPPC52XX --c99 --gnu --cxx=1 missing_indent_source.c
mwcceppc -I"d:\coverity\codewarrior\c" -I"d:\coverity\codewarrior\c1" -I"d:\coverity\codewarrior\c1\inc" -I"d:\coverity\codewarrior\c2" -I"d:\coverity\codewarrior\c2\in" -I"C:\Program Files (x86)\Google\Google Pinyin 2" -DCPU=MPPC52XX --c99 --gnu --cxx=1 too_many_characters.c
好吧,我的问题解决了,Coverity可以顺利分析代码了。
结束。
对了,补充一句,如果你想编一个完善的可以直接生成目标文件的make,可以参考 http://wenku.baidu.com/view/c85edffefab069dc50220131.html