翻譯|使用教程|編輯:吳園園|2020-02-26 11:18:12.057|閱讀 2200 次
概述:在CLion中處理Makefile項(xiàng)目:狀態(tài)更新。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
CLion是一款專為開發(fā)C及C++所設(shè)計(jì)的跨平臺(tái)IDE。它是以IntelliJ為基礎(chǔ)設(shè)計(jì)的,包含了許多智能功能來(lái)提高開發(fā)人員的生產(chǎn)力。這種強(qiáng)大的IDE幫助開發(fā)人員在Linux、OS X和Windows上來(lái)開發(fā)C/C++,同時(shí)它還使用智能編輯器來(lái)提高代碼質(zhì)量、自動(dòng)代碼重構(gòu)并且深度整合CMake編譯系統(tǒng),從而提高開發(fā)人員的工作效率。
CLion中項(xiàng)目模型的演變
如您所知,CLion中的所有工作都是在項(xiàng)目上下文中完成的。項(xiàng)目是編碼幫助,批量重構(gòu),編碼樣式一致性和其他智能功能的基礎(chǔ)。為了了解項(xiàng)目模型,CLion不僅收集項(xiàng)目文件列表,還收集編譯標(biāo)志,標(biāo)頭搜索路徑和特定于項(xiàng)目模型的變量。IDE可以創(chuàng)建聚合這些參數(shù)的多個(gè)解析配置,您可以在必要時(shí)在編輯器中進(jìn)行切換。
5年前,CLion在僅CMake的項(xiàng)目中啟動(dòng),我們在博客中分享了做出該決定的理由。從那時(shí)起,CMake在C ++社區(qū)中穩(wěn)定增長(zhǎng),并最終超過(guò)Visual Studio,成為C ++開發(fā)中最受歡迎的項(xiàng)目模型/構(gòu)建系統(tǒng)。
但是,在C ++世界中,沒有單一的標(biāo)準(zhǔn)項(xiàng)目模型。有Makefile項(xiàng)目,qmake,msbuild,Bazel,Scons等。Makefile項(xiàng)目位于前三名中,在OSS和嵌入式項(xiàng)目中很受歡迎,并且廣泛用于跨平臺(tái)C ++開發(fā),這使它們成為添加到CLion的最佳人選。
在支持Makefile項(xiàng)目的過(guò)程中,我們采取了以下步驟:
現(xiàn)在,可以使用“自定義構(gòu)建目標(biāo)”在CLion中構(gòu)建,運(yùn)行和調(diào)試任何項(xiàng)目(包括基于Makefile的項(xiàng)目),但它需要準(zhǔn)確的手動(dòng)設(shè)置。CMake項(xiàng)目的經(jīng)驗(yàn)要好得多– CLion自動(dòng)檢測(cè)可用的目標(biāo)來(lái)構(gòu)建,以及可執(zhí)行文件來(lái)運(yùn)行/調(diào)試。我們也傾向于為基于Makefile的項(xiàng)目提供這種體驗(yàn),但是,這需要大量的啟發(fā)和調(diào)整。同時(shí),您可以使用現(xiàn)有的Makefile插件來(lái)運(yùn)行make目標(biāo)(請(qǐng)注意,它不允許運(yùn)行或調(diào)試可執(zhí)行文件,為此您仍應(yīng)使用“自定義構(gòu)建目標(biāo)”)。
這使我們進(jìn)入了工作流程,用戶可以在 File Watchers和編譯數(shù)據(jù)庫(kù)的幫助下處理 Makefile項(xiàng)目。主要的痛點(diǎn)是您必須安裝工具才能從Makefile中提取編譯數(shù)據(jù)庫(kù)。但是,工作流是通用的,并且可以在本機(jī)不支持的任何項(xiàng)目模型(例如build2或其他模型)上順利運(yùn)行,如本視頻中的Phil Nash所示。
支持Makefile項(xiàng)目:操作方法
現(xiàn)代C ++工具在IDE中沒有統(tǒng)一的方式來(lái)處理Makefile項(xiàng)目。我們已經(jīng)確定了幾種方法(可在其他IDE和編輯器中使用),概述如下:
選項(xiàng)1:編譯器包裝
有一個(gè)名為scan-build的工具,可以通過(guò)在構(gòu)建過(guò)程中攔截編譯器調(diào)用來(lái)幫助您獲取編譯數(shù)據(jù)庫(kù)。第一種方法使用類似的概念– IDE用包裝器(使用CC和CXX環(huán)境變量,也通過(guò)PATH)替換實(shí)際的編譯器,該包裝器將記錄編譯命令,然后調(diào)用實(shí)際的編譯器。
這種方法的主要好處是它不僅適用于Makefile項(xiàng)目,而且適用于任何構(gòu)建系統(tǒng)。但是,這需要完整的構(gòu)建,這可能會(huì)花費(fèi)很長(zhǎng)時(shí)間,并且可能無(wú)法在運(yùn)行IDE的計(jì)算機(jī)上執(zhí)行。
選項(xiàng)2:LD_PRELOAD
這種方法還從當(dāng)前的工具Bear中獲取了想法,該工具類似于選項(xiàng)1。簡(jiǎn)而言之,在類Unix系統(tǒng)上,可以設(shè)置LD_PRELOAD環(huán)境變量并指定一個(gè)動(dòng)態(tài)庫(kù)。在執(zhí)行任何構(gòu)建過(guò)程之前加載。這將允許攔截對(duì)編譯器的任何調(diào)用。
這種方法對(duì)構(gòu)建過(guò)程的干擾較小,這對(duì)某些脆弱的配置很重要。但這是特定于Unix的(也可在macOS上使用,但需要一些特殊權(quán)限)。
選項(xiàng)3:解析Make的輸出
Make命令在其工作期間會(huì)打印出許多有用的輸出,可以將其收集并重用于獲取有關(guān)項(xiàng)目的信息。這個(gè)想法是第三種方法的基礎(chǔ)。還有一個(gè)有用的--just-print選項(xiàng),它有助于避免在項(xiàng)目重新加載期間實(shí)際構(gòu)建項(xiàng)目,因此與常規(guī)的Make調(diào)用相比,可以獲得更好的性能。
這種方法看起來(lái)不錯(cuò),因?yàn)樗粫?huì)影響構(gòu)建過(guò)程,并且使我們可以比完整項(xiàng)目構(gòu)建更快地收集信息。這也是一個(gè)“便攜式”選項(xiàng),因?yàn)槔碚撋螴DE可以從記錄在另一臺(tái)計(jì)算機(jī)上的Make輸出開始。因此,盡管這種方法無(wú)法擴(kuò)展到其他構(gòu)建系統(tǒng),但在我們看來(lái),它似乎是我們?cè)缙谘芯康氖走x解決方案。
支持Makefile項(xiàng)目:CLion的原型
正如我們上面提到的,我們決定采用解析Make輸出的方法,而不是通過(guò)將用于攔截編譯器調(diào)用的工具帶到用戶環(huán)境來(lái)使用針對(duì)Makefile項(xiàng)目的編譯數(shù)據(jù)庫(kù)來(lái)自動(dòng)化解決方法。在這條路線上,我們必須處理許多有趣的子任務(wù):將編譯命令與其他shell命令區(qū)分開;了解工作目錄及其混亂的輸出;以及許多其他需要實(shí)現(xiàn)特定啟發(fā)式的事情。但畢竟,我們已經(jīng)將其釘牢,并在CLion中獲得了Makefile項(xiàng)目分析器的有效原型:
可能出現(xiàn)的問題
這是真正令人興奮的地方!對(duì)大量Makefile項(xiàng)目的內(nèi)部測(cè)試為我們提供了有關(guān)如何調(diào)整啟發(fā)式方法的許多提示。讓我們仔細(xì)看一下算法細(xì)節(jié),以了解可能出了什么問題。
CLion運(yùn)行Make,讀取其輸出,然后嘗試解析它,以提取編譯命令和工作目錄。Entering/Leaving directory <dir>輸出中的消息標(biāo)識(shí)我們當(dāng)前所在的工作目錄。此信息是了解實(shí)際正在構(gòu)建哪個(gè)源文件所必需的,因?yàn)橥ǔO鄬?duì)于工作目錄指定文件名。在某些項(xiàng)目中,這些消息也被替換為cd <directory> && gcc <file>。準(zhǔn)確地提取此信息是算法的關(guān)鍵部分。
在這里很容易失敗,因?yàn)橛泻芏?/span>使Make靜音的技巧。讓我們更深入地了解“制作”選項(xiàng)!GNU Make的默認(rèn)行為是打印目錄。Makefile可以通過(guò)使用.SILENT偽指令來(lái)抑制它,但是調(diào)用Make with --print-directories會(huì)覆蓋它。但是,Makefile可以通過(guò)設(shè)置來(lái)覆蓋它GNUMAKEFLAGS=--no-print-directory,而在GNUMAKEFLAGS=--print-directory調(diào)用Make時(shí),可以通過(guò)將其作為命令行選項(xiàng)傳遞來(lái)覆蓋它。
在目錄內(nèi)部,輸出消息被視為潛在的編譯命令。CLion嘗試解析它們,尋找已知的編譯器及其標(biāo)志。在失敗的情況下,該行被視為只是一個(gè)文本字符串,因此將被跳過(guò)。有趣的是,有一些包裝程序(如libtool)會(huì)隱藏編譯標(biāo)志并干擾Make的輸出,從而使我們當(dāng)前的方法失敗。Shell和鏈接命令也會(huì)產(chǎn)生干擾,但是可以教導(dǎo)算法準(zhǔn)確地跳過(guò)它們。
=====================================================
溫馨提示:疫情期間返崗上班需戴口罩、勤洗手、常通風(fēng),做好防護(hù)措施!
想要購(gòu)買Clion正版授權(quán)的朋友可以。
更多精彩內(nèi)容,敬請(qǐng)關(guān)注下方的微信公眾號(hào),及時(shí)獲取產(chǎn)品最新資訊▼▼▼
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: