如何使用Sphinx生成C++文檔

寫(xiě)文檔很重要嗎簿煌?

當(dāng)你寫(xiě)了上萬(wàn)行代碼,幾十幾百個(gè)函數(shù)和類(lèi)褒侧,然后面對(duì)源文件一臉懵逼的時(shí)候你就不會(huì)有這個(gè)疑問(wèn)了良风。如果規(guī)模較小,那么文檔系統(tǒng)可能對(duì)自己沒(méi)有太大幫助闷供。但是寫(xiě)文檔總可以幫助自己總結(jié)和記錄工作烟央。對(duì)其他人而言,要知道你的軟件和代碼如何使用歪脏,首先就是看你的說(shuō)明文檔疑俭,就和產(chǎn)品說(shuō)明書(shū)一樣,所以寫(xiě)文檔是非常重要的婿失。文檔系統(tǒng)是什么呢钞艇?隨著軟件系統(tǒng)的復(fù)雜度日益增大,人們迫切需要一種規(guī)范的軟件文檔使維護(hù)和使用他人軟件代碼更加方便和標(biāo)準(zhǔn)化豪硅。這就催生了文檔系統(tǒng)香璃,例如Javadoc。通過(guò)在源代碼中特殊的注釋方式舟误,就可以通過(guò)Javadoc生成非常標(biāo)準(zhǔn)化的注釋文檔,并且文檔系統(tǒng)會(huì)分析類(lèi)之間的繼承關(guān)系姻乓,區(qū)分類(lèi)型嵌溢,形成查詢(xún)索引,大大減輕了人工創(chuàng)建和維護(hù)文檔的負(fù)擔(dān)蹋岩。更方便地是赖草,它可以直接生成在線(xiàn)的網(wǎng)頁(yè)使得文檔的查閱變得很方便。

文檔系統(tǒng)是什么呢剪个?

隨著軟件系統(tǒng)的復(fù)雜度日益增大秧骑,人們迫切需要一種規(guī)范的軟件文檔使維護(hù)和使用他人軟件代碼更加方便和標(biāo)準(zhǔn)化。這就催生了文檔系統(tǒng),例如Javadoc乎折。通過(guò)在源代碼中特殊的注釋方式绒疗,就可以通過(guò)Javadoc生成非常標(biāo)準(zhǔn)化的注釋文檔,并且文檔系統(tǒng)會(huì)分析類(lèi)之間的繼承關(guān)系骂澄,區(qū)分類(lèi)型吓蘑,形成查詢(xún)索引,大大減輕了人工創(chuàng)建和維護(hù)文檔的負(fù)擔(dān)坟冲。更方便地是磨镶,它可以直接生成在線(xiàn)的網(wǎng)頁(yè)使得文檔的查閱變得很方便。


Customnpc 的Javadoc截圖

為什么使用Sphinx

C++標(biāo)準(zhǔn)的文檔系統(tǒng)是Doxygen健提,而且Doxygen也可以支持很多其他語(yǔ)言琳猫。而Sphinx主要是寫(xiě)python文檔用的。那么為什么還要使用Sphinx呢私痹?原因有:

  1. Doxygen生成的文檔很丑脐嫂。這讓你的工程看起來(lái)活在90年代。而Sphinx的文檔主題(readthedoc主題)看起來(lái)很現(xiàn)代侄榴。


    Eigen的Doxygen文檔

    Tornado的Sphinx文檔
  2. Sphinx可以在Readthedoc網(wǎng)站上在線(xiàn)編譯并托管發(fā)布雹锣,不需要建立自己的網(wǎng)站就可以在線(xiàn)發(fā)布文檔了。

那么問(wèn)題來(lái)了癞蚕,Sphinx是python的文檔系統(tǒng)蕊爵,一個(gè)Python的文檔系統(tǒng),怎么就跑去生成C++文檔了呢桦山,主要還是這個(gè)顏值和Sphinx的強(qiáng)大功能攒射。接下來(lái)就簡(jiǎn)單說(shuō)下怎么做。

Doxygen+breathe+Sphinx

由于C++文檔需要Doxygen去生成恒水,因此有人發(fā)明了breathe去橋接Sphinx和Doxygen兩個(gè)文檔系統(tǒng)会放。可以把Doxygen的輸出作為輸入給Sphinx钉凌。后來(lái)又有人做了簡(jiǎn)化的工具exhale咧最,只需要如下命令:

pip install exhale

就可以集成到Sphinx里去了(不過(guò)Doxygen還得另外下載安裝)。具體參見(jiàn)文檔御雕。

根據(jù)網(wǎng)站介紹矢沿,你的c++工程需要這樣的結(jié)構(gòu)。


工程結(jié)構(gòu)

其中includesrc是你的c++工程酸纲,和文檔系統(tǒng)其實(shí)沒(méi)有關(guān)系捣鲸,只是文檔系統(tǒng)需要分析的對(duì)象。只有docs文件夾里的內(nèi)容才是文檔系統(tǒng)的主體闽坡。其中又可以看到index.rst栽惶,這個(gè)文件是Sphinx文檔的主頁(yè)愁溜,規(guī)定要顯示的頁(yè)面內(nèi)容。conf.py是Sphinx的配置文件外厂,里面需要包括插件配置以及其他參數(shù)的設(shè)置冕象。需要注意的是,實(shí)際上我們首先應(yīng)該做的是在doc文件夾下運(yùn)行sphinx-quickstart生成文檔編譯所需的各項(xiàng)文件酣衷,再去修改這些配置交惯。然后在conf.py中添加網(wǎng)站所述樣例代碼,就成功配置exhale的文檔插件了穿仪。

# The `extensions` list should already be in here from `sphinx-quickstart`
extensions = [
    # there may be others here already, e.g. 'sphinx.ext.mathjax'
    'breathe',
    'exhale'
]

# Setup the breathe extension
breathe_projects = {
    "My Project": "./doxyoutput/xml"
}
breathe_default_project = "My Project"

# Setup the exhale extension
exhale_args = {
    # These arguments are required
    "containmentFolder":     "./api",
    "rootFileName":          "library_root.rst",
    "rootFileTitle":         "Library API",
    "doxygenStripFromPath":  "..",
    # Suggested optional arguments
    "createTreeView":        True,
    # TIP: if using the sphinx-bootstrap-theme, you need
    # "treeViewIsBootstrap": True,
    "exhaleExecutesDoxygen": True,
    "exhaleDoxygenStdin":    "INPUT = ../include"
}

# Tell sphinx what the primary language being documented is.
primary_domain = 'cpp'

# Tell sphinx what the pygments highlight language should be.
highlight_language = 'cpp'

在這里席爽,其實(shí)最重要的一個(gè)參數(shù)就是 exhaleDoxygenStdin 中的INPUT參數(shù)。它指向你想生成文檔的頭文件啊片。這時(shí)只锻,文檔系統(tǒng)以及可以調(diào)用doxygen并生成文檔了,但是還需要讓他在頁(yè)面上顯示出來(lái)紫谷。這就需要在index.rst中添加exhale_args對(duì)象中定義的rootFileName齐饮。如下圖中的api/library_root:

添加根文件

需要注意的是這些文件必須放在toctree指令下面,并且不能和上面冒號(hào)所表示的選項(xiàng)相連笤昨,要空一行祖驱。另外,Sphinx也可以支持markdownrst混合瞒窒,但是這需要recommonmark插件支持捺僻。完成這一步,就以及可以生成文檔了崇裁!

Sphinx RTD Theme

為了擁有readthedoc那樣的漂亮主題匕坯,還需要pip install sphinx_rtd_theme并且在conf.py中添加相應(yīng)代碼:

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
#
import os 
# on_rtd is whether we are on readthedocs.org, this line of code grabbed from docs.readthedocs.org
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'

if not on_rtd:  # only import and set the theme if we're building docs locally
    import sphinx_rtd_theme
    html_theme = 'sphinx_rtd_theme'
    html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]

文檔生成

在doc文件夾下執(zhí)行make html就可以得到html網(wǎng)頁(yè)版的documentation。效果非常贊拔稳!需要注意的是默認(rèn)doxygen是不會(huì)輸出類(lèi)的private成員的葛峻,需要修改doxygen的配置或參數(shù)。

image.png

在文檔系統(tǒng)中巴比,我們不僅僅可以寫(xiě)代碼注釋說(shuō)明术奖,還可以加入公式甚至圖片,相比另外寫(xiě)一個(gè)單獨(dú)的說(shuō)明文檔轻绞,不知道高到哪里去了腰耙!在別人在代碼和word之間來(lái)回穿梭時(shí)你只需要好好寫(xiě)注釋?zhuān)缓髆ake一下,然后就可以和小姐姐談笑風(fēng)生去了铲球,回來(lái)就可以看到最新且完美的文檔網(wǎng)頁(yè)!并且所有類(lèi)型的鏈接都自動(dòng)關(guān)聯(lián)好了晰赞,非常好查詢(xún)稼病。比如下圖中我們可以顯示LaTeX选侨,并注釋函數(shù)參數(shù)。具體如何去寫(xiě)這種文檔注釋?zhuān)泻芏囡L(fēng)格然走,請(qǐng)參考Doxygen的官方文檔援制。

你們搞的這個(gè)文檔系統(tǒng)啊,Excited!

還有很多其他功能和配置芍瑞,就不在這里一一展示了晨仑。

總結(jié)

Sphinx文檔系統(tǒng)非常好用,而且網(wǎng)頁(yè)很漂亮拆檬,讀起來(lái)非常愉悅洪己。利用exhale構(gòu)建文檔系統(tǒng)的方法也很簡(jiǎn)單,只需要做三件小事(不談安裝):1.sphinx-quickstart竟贯;2.修改indexconf.py答捕;3.make!真的非常方便了屑那。那么拱镐,大家一起努力來(lái)寫(xiě)出精美漂亮的工程文檔吧!

作者:高壓電力電容器
https://www.bilibili.com/read/cv3247399
略有修改

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市持际,隨后出現(xiàn)的幾起案子沃琅,更是在濱河造成了極大的恐慌,老刑警劉巖蜘欲,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件益眉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芒填,警方通過(guò)查閱死者的電腦和手機(jī)呜叫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)殿衰,“玉大人朱庆,你說(shuō)我怎么就攤上這事∶葡椋” “怎么了娱颊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凯砍。 經(jīng)常有香客問(wèn)我箱硕,道長(zhǎng),這世上最難降的妖魔是什么悟衩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任剧罩,我火速辦了婚禮,結(jié)果婚禮上座泳,老公的妹妹穿的比我還像新娘惠昔。我一直安慰自己幕与,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布镇防。 她就那樣靜靜地躺著啦鸣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪来氧。 梳的紋絲不亂的頭發(fā)上诫给,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音啦扬,去河邊找鬼中狂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛考传,可吹牛的內(nèi)容都是我干的吃型。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼僚楞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勤晚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起泉褐,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赐写,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后膜赃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挺邀,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年跳座,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了端铛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疲眷,死狀恐怖禾蚕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狂丝,我是刑警寧澤换淆,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站几颜,受9級(jí)特大地震影響倍试,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛋哭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一县习、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦躁愿、人聲如沸哈蝇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至怜跑,卻和暖如春样勃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背性芬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工峡眶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人植锉。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓辫樱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親俊庇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狮暑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360