2010-03-14 127 views
19

使用scons的我可以很容易地把我包括路徑:如何設置scons的系統包括路徑

env.Append(CPPPATH=['foo']) 

這傳遞標誌

-Ifoo 

與gcc

但是我正在努力編譯時會啓用很多警告。 特別是與

env.Append(CPPFLAGS=['-Werror', '-Wall', '-Wextra']) 

這可怕的死亡在一定提振包括...我可以通過添加升壓解決這個問題包括對系統的include路徑,而不是GCC對待包括道路系統包括不同。

所以我需要什麼,以獲得通過,以海灣合作委員會,而不是-Ifoo是

-isystem foo 

我想我可以與CPPFLAGS變量做到這一點,但不知道是否有內置scons的一個更好的解決方案。

回答

12

在SCons中沒有內置方式來傳遞-isystem包含路徑,主要是因爲它非常適合編譯器/平臺。

將它放入CXXFLAGS將會起作用,但是請注意,這將隱藏SCons的依賴項掃描程序的頭文件,該掃描程序僅查看CPPPATH。

如果您不希望這些標頭髮生更改,那麼這可能是確定的,但如果您使用構建結果緩存和/或隱式依賴關係緩存,則可能會導致出現奇怪的問題。

+0

感謝您對我期望的內容的確認(但希望是錯誤的) – 2010-03-14 05:44:45

+1

很好的答案,但實際上,我認爲這些內容都包含在依賴鏈中是一件好事,因爲它們會減慢整個構建過程的no真正的收益。有很多Boost頭文件,而且這些頭文件不會改變(當他們這樣做時,你知道它並可以決定清除所有內容)。 – ereOn 2012-10-25 08:25:48

+1

確實,排除「只讀」標題是加速構建的好方法。一個好的做法是確保庫版本是其目錄路徑的一部分(即./foo/bar/boost/1.38/include)。這樣,編譯命令行上就會顯示boost版本號。由於SCons在其簽名中包含命令行,因此任何升級升級都將落入不同的目錄,從而使任何現有的構建產品無效。這使得構建緩存更加健壯,特別是對於大型團隊。 – BenG 2012-10-25 13:44:26

6

如果你

print env.Dump() 

你會看到_CPPINCFLAGS,你會看到在CCCOM(或_CCCOMCOM)使用的變量。 _CPPINCFLAGS通常是這樣的:

'$(${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' 

從這裏就可以大概看你怎麼可以添加一個「ISYSTEM」設置的包括,以及像_CPPSYSTEMINCFLAGS或一些這樣的。只需定義您自己的前綴,路徑var名稱(例如CPPSYSTEMPATH)和後綴並使用上面的成語連接前綴。然後,將您的_CPPSYSTEMINCFLAGS附加到CCCOM或_CCCOMCOM,然後關閉。

當然,這是系統特有的,但您可以在編譯器命令行中有條件地將您的新變量包含在您想要的時間。

2

根據the SCons release notes,自從版本2.3.4開始,環境的CCFLAGS支持「-isystem」。

所以,你可以,例如,請執行下列操作:

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

不過,你需要確保你的編譯器支持選項。

+0

發行說明說,ParseFlags現在可以解析-isystem,這並不意味着下列工作。你試過了嗎? – bdbaddog 2017-03-23 17:39:04

+0

我試過了,它適用於我,至少與scons 2.5.0。 – LangerJan 2017-03-24 14:41:48

+0

是否有任何文件出現在依賴關係樹中(輸出來自--tree = prune)?或者如果你這樣做,他們會被忽略? – bdbaddog 2017-03-24 21:16:49

0

擴展@LangerJan和@BenG提出的想法...這是一個完整的跨平臺例如(更換env['IS_WINDOWS']使用Windows平臺檢查)

from SCons.Util import is_List 
def enable_extlib_headers(env, include_paths): 
    """Enables C++ builders with current 'env' to include external headers 
    specified in the include_paths (list or string value). 
    Special treatment to avoid scanning these for changes and/or warnings. 
    This speeds up the C++-related build configuration. 
    """ 
    if not is_List(include_paths): 
     include_paths = [include_paths] 

    include_options = [] 
    if env['IS_WINDOWS']: 
     # Simply go around SCons scanners and add compiler options directly 
     include_options = ['-I' + p for p in include_paths] 
    else: 
     # Tag these includes as system, to avoid scanning them for dependencies, 
     # and make compiler ignore any warnings 
     for p in include_paths: 
      include_options.append('-isystem') 
      include_options.append(p) 
    env.Append(CXXFLAGS = include_options) 

現在,配置使用外部庫的時候,而不是

env.AppendUnique(CPPPATH=include_paths) 

呼叫

enable_extlib_headers(env, include_paths) 

在我的情況下,這在Linux上將修剪後的依賴關係樹(如用--tree=prune生成)減少了1000倍和Windows上的3000倍!它加快了無動作編譯時間(即所有目標爲最新)5-7x 修改之前的修剪依賴樹有400萬包括來自Boost。這太瘋狂了。