c – 依赖#defines的最佳实践?
发布时间:2020-12-16 04:52:40 所属栏目:百科 来源:网络整理
导读:是否有支持C/C++预处理程序标志依赖项的最佳实践,如-DCOMPILE_WITHOUT_FOO?这是我的问题: setenv COMPILE_WITHOUT_FOO make Make system reads environment,sets -DCOMPILE_WITHOUT_FOO Compiles nothing,since no source file has changed 我想要做的是让
|
是否有支持C/C++预处理程序标志依赖项的最佳实践,如-DCOMPILE_WITHOUT_FOO?这是我的问题:
> setenv COMPILE_WITHOUT_FOO > make <Make system reads environment,sets -DCOMPILE_WITHOUT_FOO> <Compiles nothing,since no source file has changed> 我想要做的是让依赖#ifdef语句的所有文件都被重新编译: > setenv COMPILE_WITHOUT_FOO > make g++ FileWithIfdefFoo.cpp 如果COMPILE_WITHOUT_FOO的值没有改变,我不想要重新编译所有内容. 我有一个原始的Python脚本工作(见下文),它基本上写了一个头文件FooDefines.h然后对它进行区分以查看是否有任何不同.如果是,它将替换FooDefines.h,然后传统的源文件依赖接管.不使用-D在命令行上传递define.缺点是我现在必须在任何使用#ifdef的源文件中包含FooDefines.h,并且每个#ifdef都有一个新的,动态生成的头文件.如果有一个工具可以做到这一点,或者是一种避免使用预处理器的方法,我会全力以赴. import os,sys
def makeDefineFile(filename,text):
tmpDefineFile = "/tmp/%s%s"%(os.getenv("USER"),filename) #Use os.tempnam?
existingDefineFile = filename
output = open(tmpDefineFile,'w')
output.write(text)
output.close()
status = os.system("diff -q %s %s"%(tmpDefineFile,existingDefineFile))
def checkStatus(status):
failed = False
if os.WIFEXITED(status):
#Check return code
returnCode = os.WEXITSTATUS(status)
failed = returnCode != 0
else:
#Caught a signal,coredump,etc.
failed = True
return failed,status
#If we failed for any reason (file didn't exist,different,etc.)
if checkStatus(status)[0]:
#Copy our tmp into the new file
status = os.system("cp %s %s"%(tmpDefineFile,existingDefineFile))
failed,status = checkStatus(status)
print failed,status
if failed:
print "ERROR: Could not update define in makeDefine.py"
sys.exit(status)
解决方法
这肯定不是最好的方法,但它可以工作:
find . -name '*cpp' -o -name '*h' -exec grep -l COMPILE_WITHOUT_FOO {} ; | xargs touch
这将查看宏COMPILE_WITHOUT_FOO的源代码,并“触摸”每个文件,这将更新时间戳.然后,当您运行make时,这些文件将重新编译. 如果安装了ack,则可以简化此命令: ack -l --cpp COMPILE_WITHOUT_FOO | xargs touch (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
