Czy istnieje najlepsza praktyka dla obsługi zależności od flag preprocesora C/C++, takich jak -DCOMPILE_WITHOUT_FOO
? Oto mój problem:Najlepsza praktyka zależności od #defines?
> setenv COMPILE_WITHOUT_FOO
> make <Make system reads environment, sets -DCOMPILE_WITHOUT_FOO>
<Compiles nothing, since no source file has changed>
Co chciałbym zrobić, to mieć wszystkie pliki, które opierają się na #ifdef
sprawozdania uzyskać zrekompilowane:
> setenv COMPILE_WITHOUT_FOO
> make
g++ FileWithIfdefFoo.cpp
Co mi się nie chce, to mieć przekompilować wszystko, jeśli wartość COMPILE_WITHOUT_FOO nie zmienił się.
Mam prymitywny skrypt w języku Python działający (patrz poniżej), który zasadniczo zapisuje plik nagłówkowy FooDefines.h
, a następnie porównuje go, aby zobaczyć, czy coś jest inne. Jeśli tak jest, zastępuje on FooDefines.h
, a następnie przejmuje konwencjonalna zależność od pliku źródłowego. Zdefiniowany jest , a nie przekazany w linii poleceń z -D
. Wadą jest to, że muszę teraz dołączyć FooDefines.h
w dowolnym pliku źródłowym, który używa #ifdef
, a także mam nowy, dynamicznie generowany plik nagłówkowy dla każdego #ifdef
. Jeśli istnieje narzędzie do tego, lub sposób, aby uniknąć korzystania z preprocesora, jestem uszy.
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)
dodał raport o błędzie dla używanego IDE. Przy odrobinie szczęścia mogą to naprawić wkrótce – Jay