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

作者: hizuki (ayaka)   2023-03-14 15:07:46
#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和本地變數衝突,語法可能有不正確的
解析。
以上都是工作中的碎碎念。實際的場景比這個更複雜
作者: Apache (阿帕契)   2023-03-14 15:40:00
都用Bazel
作者: pacino (carry me)   2023-03-14 15:50:00
autoconf 很好用啊
作者: tennyleaz (tenny)   2023-03-14 16:04:00
我常常都用動態DllImport比較懶XD
作者: labbat (labbat)   2023-03-14 16:18:00
docker 萬用解題外話,好奇你引用的那些留言串出自那篇文章呀
作者: timmerix (GAIA)   2023-03-14 16:48:00
你這些都還好, 有些公司有自己內部的make系統, 完全沒有詳細的使用說明, build報錯只能猜或自己做實驗試
作者: superpandal   2023-03-14 17:28:00
這不就是專案規範的鍋 靜態的是打包所有object沒錯object沒錯 用shell不是指在makefile裡用 而是如同co用 而是如同configure 但不會是如此糟糕的寫法的寫法 makefile本身就不適合動態 而shellshell很動態 本身還是個web仔就是不過如果慢可以多job 或不用c++ XD
作者: loadingN (sarsaparilla)   2023-03-14 17:47:00
確實 有維護過 舊的Makefile...
作者: superpandal   2023-03-14 17:48:00
上面那串是表示私下研究覺得相關的都太臃腫臃腫 cmake meson都是反正我都自己寫shell框架了cmake本身都是生出makefile或在win下可能是vs專案能是vs專案躺平的web仔 但shell功力越來越出神入化了了
作者: Bencrie   2023-03-14 19:37:00
我寫的東西不夠大,自己刻 Makefile 還蠻好用的
作者: gino0717 (gino0717)   2023-03-14 19:40:00
我都用qmake
作者: alongalone (沿著孤單的路)   2023-03-14 23:11:00
老哥 你內行的誒... 直接丟出去給別人解就好啦
作者: Lipraxde (Lipraxde)   2023-03-14 23:43:00
工具本身設計可能確實是會導致最終變得難用...不過也有蠻多時候是使用者的問題...
作者: zetexp (zet)   2023-03-15 00:03:00
可以用用看xmake
作者: shomingchang ( )   2023-03-15 00:05:00
我只會用python寫建置腳本
作者: mmonkeyboyy (great)   2023-03-15 00:41:00
看大小吧.....殺雞不用牛刀 牛刀也要磨很久啊
作者: superpandal   2023-03-15 01:02:00
給你倚天劍和屠龍刀你要選哪個? 都是利器器
作者: k798976869 (kk)   2023-03-15 08:22:00
手槍:py
作者: chchwy (mat)   2023-03-15 09:39:00
這就是C++的問題 一大堆build tool每個人不爽就自己再幹一個
作者: Ekmund (是一隻小叔)   2023-03-15 09:44:00
go: tidy你看看光make就可以搞成這樣有多勸退加個自己刻的小lib 重寫makefile後跳undefined reference光linker single-pass的特性就容易變成坑
作者: superpandal   2023-03-15 17:43:00
不是類比 只是在說不是在公司用畢竟前面一堆講公司如何如何java目前的確用那兩個 但說實話也是偏靜態的態的 也都可以土法煉鋼 或自己整一個工具具py是手槍? XDgo還是主要在抓遠端依賴 c讀本機lib然而每個系統都不同 比不了歷史因素了 但純makefile或小工具生成很簡潔不錯
作者: MTKer5566 (MTKer5566)   2023-03-15 19:15:00
幸好我不再寫code了
作者: projectb (projectb)   2023-03-15 19:34:00
Qmake:
作者: e12518166339 (耐綸)   2023-03-15 20:27:00
雖然我這麼覺得,但是gnu相關的lib都還是用makefile為大宗,工作上根本躲不掉
作者: mmonkeyboyy (great)   2023-03-16 04:06:00
推樓上 = =" 根本躲不掉....一堆HPC應用....下面也是make 手刻在那裡搞
作者: Bencrie   2023-03-16 08:56:00
GNU 是老牌 autotools 系列吧
作者: superpandal   2023-03-16 09:32:00
makefile是makefile gnu autotool和cmake是一類東cmake是一類東西然後都是再自創一個dsl把簡單複雜化最終目標也都是生成makefile基本上你寫個腳本也叫cmake 針對專案文件件也做差不多的事情結果也差不多不用額外裝一堆東西是好處然後腳本也佔不了幾k容量至於純寫makefile也不是不可以 只是架構要精美要精美
作者: peterbrucele (DM5)   2023-03-16 15:08:00
推e大 後人總是跟據前面問題開發新工具 但更多時候舊系統無法遷移
作者: ztdxqa (ztdxqa)   2023-03-16 16:39:00
驚 原來現在還有沒用Bazel的嗎?2017年入職轉到現在三個公司都是用Bazel
作者: superpandal   2023-03-16 17:48:00
bazel更扯 連java都裝上了 那跑起來很恐佈佈 大機率是某個java派主導的 看了一下優點...優點 這就... makefile都可以include 雖然動態性然動態性不是太好 但節省設定是可以的再搭其它小工具如ccache就可以了即便沒有cache也是編譯有改的拿來管理java專案或許不錯
作者: richer6605 (Rhapsody)   2023-03-16 19:26:00
推推 只知道makefile 看了文章覺得長知識
作者: superpandal   2023-03-16 20:55:00
這是長常識 千言萬語抵不過體驗現在看來很多工具真的意義不大繼續遵守unix原教旨
作者: OnlyRD (里巷人)   2023-03-17 02:11:00
cmake有很難用?我覺得modern cmake其實還可以。
作者: mmonkeyboyy (great)   2023-03-17 05:53:00
樓上你老了 (上次我說跟你一樣的話時別人也這樣講我)
作者: shooter555 (shooter)   2023-03-17 16:07:00
mason最煩的是舊環境要支援很麻煩不過現在還是很多專案還在用automake
作者: superpandal   2023-03-17 17:08:00
kiss非常好 其實並不傻主要都是cmake又更複雜了 動態性也沒高太多太多 shell更動態 makefile用include也不錯不錯 很多人講不要拿shell搞大工程但其實很熟了也未嘗不可 也有好處當然不是指oneliner
作者: CLANNAD (-クラナド-)   2023-03-18 18:07:00
project沒很大的話scons用起來最爽
作者: Raymond0710 (雷門)   2023-03-20 17:20:00
看了就累 幸好不怎麼寫cpp了...
作者: shibin (喜餅)   2023-03-21 14:12:00
我目前寫小專案還是用Makefile,遇到的問題都還沒你說的多真的嚇人

Links booklink

Contact Us: admin [ a t ] ucptt.com