依赖#defines的最佳实践?

Wal*_*sen 7 c c++ conditional-compilation c-preprocessor

是否有支持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>
Run Code Online (Sandbox Code Playgroud)

我想要做的是让所有依赖#ifdef语句的文件重新编译:

> setenv COMPILE_WITHOUT_FOO
> make
  g++ FileWithIfdefFoo.cpp
Run Code Online (Sandbox Code Playgroud)

如果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)
Run Code Online (Sandbox Code Playgroud)

Jay*_*Jay 0

在文件上的日期时间戳上触发。依赖文件比依赖它的文件更新会触发它重新编译。您必须将每个选项的定义放在单独的 .h 文件中,并确保这些依赖项在 makefile 中得到体现。然后,如果您更改选项,则依赖于该选项的文件将自动重新编译。

如果它考虑到包含文件的包含文件,您将不必更改源的结构。您可以包含一个“BuildSettings.h”文件,其中包含所有单独的设置文件。

唯一棘手的问题是你是否让它足够聪明来解析包含守卫。我见过由于包含文件名冲突和包含目录搜索顺序而出现的编译问题。

既然你提到了它,我应该检查一下我的 IDE 是否足够智能,可以自动为我创建这些依赖项。听起来像是添加到 IDE 中的一个很棒的东西。