[讨论] 可以不要再手刻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