加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读