Есть ли лучшая практика для поддержки зависимостей от флагов препроцессора 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
. Недостатком является то, что теперь я должен включать FooDefines.h
в любой исходный файл, который использует #ifdef
, а также у меня есть новый, динамически генерируемый заголовочный файл для каждого #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)