[討論] 可以不要再手刻Makefile 改用cmake, meson不好嗎

軟工

38240

#1a1f6YB1 (Soft_Job) [ptt.cc] Fw: [問卦] C++到底難學在哪?
: 推 wizmelo: 我覺得C++一開始CMake建置環境就會勸退很多人 然後報錯 03/09 09:22
: → wizmelo: 的異常很難看懂 導入別的包使用function 也寫的很難讓人 03/09 09:22
: → wizmelo: 看懂 如果以一個沒使用過的人來說 03/09 09:22
: 推 ko27tye: 沒跨平台需求老實說make夠用了 03/09 13:19
: 推 wulouise: cmake比make簡單,但是要是不懂make有時候出問題,難查 03/10 22:57
: → superpandal: go的很不統一 import個包要全網址 03/13 17:36
: → superpandal: 原生makefile比cmake好多了 簡潔有力 03/13 17:38
: → superpandal: 而且現在一堆這樣的都很肥大cmake meson都是 03/13 17:39
: → superpandal: 裝一裝一堆沒用到的語言都裝上去 03/13 17:40
: → superpandal: 當然都可以用shell來產makefile就像 03/13 17:49
: → superpandal: cmake configure那種亂寫的除外 03/13 17:50

我非常同意CMake的報錯信息難看懂,所以我都改用meson了。
先不戰CMake和meson

Makefile不是不可以跨平臺,如FFmpeg。我也不是完全反對Makefile,
kernel, buildroot(openwrt),最上層用用Makefile還行。不過後者我改
OpenEmbedded了。

我們先不講跨平臺,C++一個header編譯到懷疑人生的久,不用PCH處理早晚吐血。
你試看看Makefile寫個recipe來處理。

很多人Makeilfe的link規範寫不對盤,bsd linker, gold linker, lld,最老的bsd隨便你
寫順序都能link上。後面要速度換了一個。
結果一個shared library A依賴shared library B。你構建target的時候,B寫在A的前面了,
馬上gold linker報錯。

static library不是當作object輸入的,當作一個library,結果死活有一個symbol unresolve。

還有很多肚爛的的先把objects全部都archive,然後再製造出executable或者shared library。
突然提示symbol unresolve,幾百個objects我要在長長的log中找出來哪個symbol。
為什麼compiling的時候不提示?因為header file中有這個declaration,結果symbol的
definition完全不同。

又為什麼會這樣呢?因為Makefile的cflags, cxx flags和ld flags這些傳遞都是沒有保障的,
可能莫名奇妙的被另外一個file給override了。後面的target全部死光光。

meson雖然沒有明顯區分local variable和global的,但是這些flags是可以一個target一個
設定的。CMake有個非常複雜的naming scope機制,我基本上理解到放棄。

另外就是所謂的options功能了,每次都重新編譯大項目沒幾個人受得了。而Makefile的
string解析真是爛,要call shell來又可能會造成env和本地變數衝突,語法可能有不正確的
解析。


以上都是工作中的碎碎念。實際的場景比這個更複雜

--
你比較喜歡哪一個?
當年不是黨國大老但是被江浙財團捧紅的中國帥哥
跟同樣擁兵一方的諸侯約會裁軍結果半途諸侯們爽約,平常有在寫日記的莊嚴男人開始發飆
在旁邊讀著荒漠甘泉冷眼旁觀看著薔薇戰爭的人,為了中國的事情爭吵
別國調侃是不是中國總統,義正詞嚴的說著我是民族的燈塔的威嚴老先生

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 192.147.44.15 (美國) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1678777673.A.15D.html
Apache1樓都用Bazel 03/14 15:40
Bazel語法沒法理解,我覺得bazel更像bitbake了。
pacino2樓autoconf 很好用啊 03/14 15:50
大哥,貓王死了啊。九十年代過了
tennyleaz3樓我常常都用動態DllImport比較懶XD 03/14 16:04
Windows派是吧,多來幾個你試看看,還有你多來幾個C++ ABI
labbat4樓docker 萬用解 03/14 16:18
docker只能幫你準備environment,這些不基本上不用來準備environment的
labbat5樓題外話,好奇你引用的那些留言串出自那篇文章呀 03/14 16:27
其實就在本版上面一點,我補上了
timmerix6樓你這些都還好, 有些公司有自己內部的make系統, 完全沒有 03/14 16:48
timmerix7樓詳細的使用說明, build報錯只能猜或自己做實驗試 03/14 16:49
有些是拿Makfile改的,那已經夠吐血了。
superpandal8樓這不就是專案規範的鍋 靜態的是打包所有object沒錯 03/14 17:28
superpandal9樓object沒錯 用shell不是指在makefile裡用 而是如同co 03/14 17:29
superpandal10樓用 而是如同configure 但不會是如此糟糕的寫法 03/14 17:30
superpandal11樓的寫法 makefile本身就不適合動態 而shell 03/14 17:31
superpandal12樓shell很動態 本身還是個web仔就是 03/14 17:32
superpandal13樓不過如果慢可以多job 或不用c++ XD 03/14 17:44
loadingN14樓確實 有維護過 舊的Makefile... 03/14 17:47
superpandal15樓上面那串是表示私下研究覺得相關的都太臃腫 03/14 17:48
superpandal16樓臃腫 cmake meson都是 03/14 17:49
superpandal17樓反正我都自己寫shell框架了 03/14 17:51
superpandal18樓cmake本身都是生出makefile或在win下可能是vs專案 03/14 17:56
superpandal19樓能是vs專案 03/14 17:56
superpandal20樓躺平的web仔 但shell功力越來越出神入化了 03/14 18:02
superpandal21樓 03/14 18:02
Web如果是Java的話,老老實實用maven gradle。我們不需要package management。 我們的環境是要用linker的,麥類比。
Bencrie22樓我寫的東西不夠大,自己刻 Makefile 還蠻好用的 03/14 19:37
gino071723樓我都用qmake 03/14 19:40
alongalone24樓老哥 你內行的誒... 直接丟出去給別人解就好啦 03/14 23:11
Lipraxde25樓工具本身設計可能確實是會導致最終變得難用...不過也有 03/14 23:43
Lipraxde26樓蠻多時候是使用者的問題... 03/14 23:43
zetexp27樓可以用用看xmake 03/15 00:03
meson已經足夠了,xmake反而是中國式的All in One
shomingchang28樓我只會用python寫建置腳本 03/15 00:05
setuptool沒有什麼問題
mmonkeyboyy29樓看大小吧.....殺雞不用牛刀 牛刀也要磨很久啊 03/15 00:41
superpandal30樓給你倚天劍和屠龍刀你要選哪個? 都是利器 03/15 01:02