【发布时间】:2011-10-15 08:57:44
【问题描述】:
是否有支持依赖于 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 传递。缺点是我现在必须在任何使用#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)
【问题讨论】:
标签: c++ c c-preprocessor conditional-compilation