是否有支持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)