c – 依赖#defines的最佳实践?
发布时间:2020-12-16 04:52:40 所属栏目:百科 来源:网络整理
导读:是否有支持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 我想要做的是让
是否有支持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) 解决方法
这肯定不是最好的方法,但它可以工作:
find . -name '*cpp' -o -name '*h' -exec grep -l COMPILE_WITHOUT_FOO {} ; | xargs touch 这将查看宏COMPILE_WITHOUT_FOO的源代码,并“触摸”每个文件,这将更新时间戳.然后,当您运行make时,这些文件将重新编译. 如果安装了ack,则可以简化此命令: ack -l --cpp COMPILE_WITHOUT_FOO | xargs touch (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |