是否有支持C/C++預處理器標誌(如-DCOMPILE_WITHOUT_FOO
)的依賴關係的最佳做法?這裏是我的問題:#defines依賴關係的最佳實踐?
> 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)
爲我使用的IDE添加了一個錯誤報告。如果運氣好的話,他們可能會盡快修復 – Jay