Có cách nào tốt nhất để hỗ trợ các phụ thuộc vào các cờ tiền xử lý C/C++ như -DCOMPILE_WITHOUT_FOO
? Dưới đây là vấn đề của tôi:Thực tiễn tốt nhất cho các phụ thuộc vào #defines?
> setenv COMPILE_WITHOUT_FOO
> make <Make system reads environment, sets -DCOMPILE_WITHOUT_FOO>
<Compiles nothing, since no source file has changed>
Những gì tôi muốn làm là có tất cả các file mà dựa vào #ifdef
báo cáo được biên dịch lại:
> setenv COMPILE_WITHOUT_FOO
> make
g++ FileWithIfdefFoo.cpp
Những gì tôi không muốn là phải biên dịch lại tất cả mọi thứ nếu giá trị của COMPILE_WITHOUT_FOO chưa thay đổi.
Tôi có một tập lệnh Python nguyên thủy hoạt động (xem bên dưới) về cơ bản viết một tệp tiêu đề FooDefines.h
và sau đó phân biệt nó để xem có điều gì khác biệt không. Nếu có, nó sẽ thay thế FooDefines.h
và sau đó phụ thuộc vào tệp nguồn thông thường sẽ thay thế. Định nghĩa là không phải được truyền trên dòng lệnh với -D
. Điểm bất lợi là bây giờ tôi phải bao gồm FooDefines.h
trong bất kỳ tệp nguồn nào sử dụng #ifdef
và tôi cũng có tệp tiêu đề mới được tạo động cho mỗi #ifdef
. Nếu có một công cụ để làm điều này, hoặc một cách để tránh sử dụng bộ tiền xử lý, tôi là tất cả các tai.
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)
đã thêm báo cáo lỗi cho IDE mà tôi sử dụng. Với bất kỳ may mắn nào họ có thể sửa chữa nó sớm – Jay