C++ 如何设置scons系统包含路径

C++ 如何设置scons系统包含路径,c++,scons,C++,Scons,使用SCON,我可以轻松设置包含路径: env.Append( CPPPATH=['foo'] ) 这件事已经过去了 -Ifoo 海湾合作委员会 然而,我试图在编译时启用很多警告。 尤其是 env.Append( CPPFLAGS=['-Werror', '-Wall', '-Wextra'] ) 在某些刺激下会可怕地死去,包括。。。我可以通过将boostinclude添加到系统包含路径而不是gcc以不同方式对待系统包含的include路径来解决这个问题 所以我需要传递给gcc而不是-If

使用SCON,我可以轻松设置包含路径:

env.Append( CPPPATH=['foo'] )
这件事已经过去了

-Ifoo
海湾合作委员会

然而,我试图在编译时启用很多警告。 尤其是

env.Append( CPPFLAGS=['-Werror', '-Wall', '-Wextra'] )
在某些刺激下会可怕地死去,包括。。。我可以通过将boostinclude添加到系统包含路径而不是gcc以不同方式对待系统包含的include路径来解决这个问题

所以我需要传递给gcc而不是-Ifoo的是

-isystem foo

我想我可以用CPPFLAGS变量来实现这一点,但我想知道是否有更好的解决方案内置于SCON中。

没有内置的传递方式-isystem include path内置于SCON中,主要是因为它非常特定于编译器/平台

将其放在CXXFLAGS中会起作用,但请注意,这将从SCons的依赖项扫描程序(只查看CPPPATH)中隐藏标题

如果您不希望这些头发生更改,这可能是正常的,但是如果您使用生成结果缓存和/或隐式依赖缓存,则可能会导致奇怪的问题。

如果您这样做

  print env.Dump()
您将看到
\u cppinckflags
,您将看到在CCCOM(或_CCCOMCOM)中使用的变量_CPPINCFLAGS通常如下所示:

  '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
从中,您可能还可以看到如何添加一组“isystem”包含,如_CPPSYSTEMINCFLAGS或类似的内容。只需定义您自己的前缀、路径变量名称(例如CPPSYSTEMPATH)和后缀,并使用上述习惯用法连接前缀。然后只需将您的_CPPSYSTEMINCFLAGS附加到CCCOM或_CCCOMCOM,然后就可以开始了

当然,这是特定于系统的,但您可以在需要时有条件地在编译器命令行中包含新变量。

根据,自2.3.4版起,环境的CCFLAGS就支持“-isSystem”

例如,您可以执行以下操作:

env.AppendUnique(CCFLAGS=('-isystem', '/your/path/to/boost'))

不过,您需要确保编译器支持该选项。

扩展@LangerJan和@BenG提出的想法。。。下面是一个完整的跨平台示例(用WINDOWS平台检查替换
env['IS\u WINDOWS']

现在,在配置外部库的使用时

env.AppendUnique(CPPPATH=include_paths)
召唤

在我的例子中,这将经过修剪的依赖关系树(由
--tree=prune
生成)在Linux上减少了1000倍,在Windows上减少了3000倍!它将无操作构建时间(即所有目标都是最新的)加快了5-7倍
此更改之前经过修剪的依赖关系树有来自Boost的400万个包含。这太疯狂了。

感谢您确认了我的预期(但希望是错误的)好答案,但事实上,我认为将这些包含从依赖链中排除是件好事,因为它们会减慢整个构建过程,而不会带来任何实际收益。有很多Boost头文件,它们不太可能改变(当它们改变时,你知道并且可以决定清理所有文件)。事实上,排除“只读”头文件是加快构建速度的一个好方法。一个好的做法是确保库版本是其目录路径的一部分(即/foo/bar/boost/1.38/include)。这样,boost版本号就会显示在编译命令行上。由于SCons在其签名中包含命令行,因此任何boost升级都将位于不同的目录中,从而使任何现有构建产品无效。这使得构建缓存更加健壮,特别是对于大型团队。是的,对于这种很少更改的库,依赖库版本号更有效。假设库更新是严格的,并且版本从不混合:)顺便说一句,有人知道Microsoft编译器的相应选项吗?发行说明说ParseFlags现在可以解析-isSystem,但这并不意味着下面的工作。你试过了吗?我试过了,它对我很有效,至少对scons 2.5.0是这样。依赖关系树中是否显示了任何文件(从--tree=prune输出)?或者如果你做了以上的事情,它们会被省略吗?你是说不洁?事实上,它们被省略了。
env.AppendUnique(CPPPATH=include_paths)
enable_extlib_headers(env, include_paths)