2016-01-20 171 views
3

我正在構建一個使用CMake的開源項目(kst,v2.0.8)。我使用CMake v2.8.12.2和MSVC 2008作爲編譯器,並生成NMake makefile以在命令行上構建它。我可以通過此設置成功構建它。這些版本是強制性的,所以我目前不能使用CMake或MSVC的更高版本。如何強制cmake使用沒有完整路徑的cl.exe?

我需要能夠執行使用惠普Fortify的KST的源代碼分析,並能夠從它工作在以下兩種方式之一在命令行中使用它:

  1. 非接觸模式,它創建它自己的「cl.exe」,在實際cl.exe的路徑之前設置它的路徑,因此在構建期間啓動。

  2. 將makefile中的編譯器設置爲Fortify命令行,例如, sourceanalyzer -b build_id cl而不是cl

無論哪種方式,我需要強制編譯器,cmake生成到其makefiles是cmake不會自動檢測的東西。

我試着按照this question中的相同方法運行cmake時設置編譯器,但cmake仍然堅持把makefile中的MSVC cl.exe的完整路徑。

cmake -DCMAKE_C_COMPILER=cl -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER=cl -DCMAKE_CXX_COMPILER_FORCED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%CFITSIO_DIR% -G"NMake Makefiles" ..\cfit3250 

我也嘗試設置編譯調用Fortify的,但是當cmake的測試編譯失敗說,它無法找到編譯器。 (我也試過這種沒有強制= ON參數,並在這種情況下,它說的編譯器失敗。)

cmake -DCMAKE_C_COMPILER="sourceanalyzer -b %BUILDID% cl" -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER="sourceanalyzer -b %BUILDID% cl" -DCMAKE_CXX_COMPILER_FORCED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%CFITSIO_DIR% -G"NMake Makefiles" ..\cfit3250 

我大概可以搜索並替換在生成文件中的所有編譯器調用,但我必須要記住在每個cmake之後都要這樣做,並且如果有多個項目/ makefiles /調用cl(而不是在makefile中定義CC變量),將會很乏味。我寧願有一種方法讓cmake使用偏移量所需的編譯器。

+1

據我所知,CMake總是傾向於生成具有程序絕對路徑的makefile。至於你的情況,你可以創建**包裝**腳本,並告訴CMake將其用作編譯器。在腳本內部,您可以使用編譯器的相對路徑(通過'PATH'變量分派),或者使用其他機制來選擇實際的編譯器。 – Tsyvarev

回答

2

更新:測試顯示原始建議的方法至少在某些平臺上無法按預期工作。看起來使用包裝腳本可能是一條可行的路。

如果你真的想強制一個特定的編譯器和旁路CMake的編譯器檢查,CMakeForceCompiler module可能是你正在尋找的。與CMake文檔的鏈接包含一個簡單的工具鏈文件示例,其中顯示瞭如何使用特定的編譯器作爲不帶路徑的簡單命令調用。 不幸的是,CMake仍將其轉換爲絕對路徑,因此它本身並不能解決您的問題。但是,您可以使用工具鏈文件指向包裝腳本並使用CMakeForceCompiler來繞過編譯器檢查。這種組合應該產生你所要求的行爲。

注意使用CMakeForceCompiler模塊時,你承擔告訴CMake的信息,特別是你想用強制的特定的編譯器的編譯器ID多一點責任,但是從CMake docs似乎很清楚這只是MSVC你的情況。

要使用工具鏈文件,請使用指向您自己的自定義工具鏈文件的-DCMAKE_TOOLCHAIN_FILE=path/to/file選項調用CMake。CMake文檔有一個覆蓋工具鏈使用的specific section,雖然它確實覆蓋了一些重要的細節信息。

正如@ Tsyvarev的評論中所提到的那樣,使用包裝腳本很可能是處理這個問題的最佳方法。該包裝腳本只需要將調用轉發到通常的編譯器命令而不指定路徑。然後,當您構建時,您需要負責確保該命令將位於PATH上。作爲東西下面簡單應足以作爲在Windows(未經測試)的包裝批處理文件:現在

cl %* 

,你可以控制在Visual Studio編譯器或Fortify的被通過構建看到PATH純粹調用是否。我個人認爲這有點脆弱,但這是你要求的。 ;)

作爲一個更強大的替代品,是否可以使用兩個完全獨立的版本?如果是這樣,那麼我建議,作爲一個更好的選擇。使用默認的Visual Studio編譯器構建一個正常的編譯器,並使用工具鏈文件指向Fortify編譯器,讓CMake繞過它的編譯器檢查。這樣你就不依賴於以特定方式建立的構建環境。