一个项目的makefile应该放在哪里?

6
假设项目目录包含子目录,例如 src bin lib doc 等。我应该把项目的makefile放在哪里?
例如,
  • 一些项目将其makefile放在项目根目录的 src / 子目录中,
  • 一些项目将其makefile放在项目的根目录中。
对我来说,第二种方式更合乎逻辑。您能提供什么情况下最好将makefile放在根目录, src / 或其他某个目录中的案例以及原因吗?

1
根文件夹对我来说似乎是最自然的选择。而且也是最简单的,因为文件路径总是“向下”,你永远不必写“../XXX”。 - kebs
这实际上是一个观点(和约定)问题。在某些情况下,Makefile 是以某种方式(可能是由 cmake)生成的,需要特定的源树组织方式。这也取决于项目。 - Basile Starynkevitch
@BasileStarynkevitch,您能提供放置makefile在src/目录下更好的场景和原因吗? - Tim
@shawnhcorey在https://dev59.com/rEjSa4cB1Zd3GeqPJeQx#1278209中建议不要将makefile放在`src/`下:“Make擅长使用源文件来生成目标文件,但反过来则不行。”“这会导致您在Makefile.depend方面出现问题”。因此,我对您的评论和他的回复感到困惑。如果您能在这里或那里详细说明一下,我将不胜感激。 - Tim
1
@ralphtheninja,约定俗成仍然只是一种观点,因此它们属于 Stack Overflow 上的 POB 关闭原因。无论如何,我已经大大缩小了问题的观点因素,并投票重新打开了该问题;Basile 的答案为一个摇摆不定的问题提供了很好的解决方案。 - TylerH
显示剩余7条评论
1个回答

6

这个问题的其余部分是基于观点的,但最后一部分则少得多:

你能提供什么情况下更好地将makefile放在根目录、src/或其他某个目录中的案例吗?

首先,该目录可能不叫做 src/ 而是其他名称。

有时候 Makefile 本身是生成的(例如通过 cmakeautoconf),它的生成器需要一些特定的文件树组织。

把所有源代码放在src/的常见原因是交叉编译或编译不同风格的目标(可能是调试版本和优化版本)。然后您将所有源代码放在src/中,并确保make(和gcc)不会将对象文件放入该src/目录,而是放入其他目录中(例如obj-x86用于X86对象文件,obj-arm用于ARM对象文件等),可能不仅特定于ISA,还特定于ABI。因此,您可能会将对象文件和可执行文件放在一个名字很长的目录中,例如obj-x86_64-linux-optimizedobj-PowerPC-AIX-debug。顺便说一下,src/目录甚至可以在多台机器上共享(例如通过NFS挂载),并且只读(例如可由多个用户共享)。
请注意,GCC 需要在其源代码树 之外 进行构建。
然后,源代码 对于 make(实际上是对于像 GCC 这样的编译器)和开发人员有一些不同的含义。
源代码的社会定义(由开发人员使用)是:程序的首选形式,在此形式下人类开发人员工作(您将发现这个定义清楚地表达了自由软件运动的意愿)。

对于像GCCClang这样的编译器,源代码只是作为输入提供给编译器的翻译单元(即由gcc编译器处理的.c.h文件作为输入)。在许多(但不是所有)情况下,这些C文件是真正的源代码,因为人类开发者编写了它们。

在某些情况下,C或C++的“源”文件(由gccg++clangclang++所知)是“生成的”(在这种情况下,对于开发人员来说,它们不再是源代码,但对于gcc来说仍然是输入源)。一个经典的例子当然是由bison生成的C文件。请参见this我的答案,以获取有关该想法的一般讨论。

另一个例子(其中C文件位于某个公共目录中)由特定领域(或高级)语言实现给出,这些语言被编译成C(例如BiglooChicken Scheme,我的旧GCC MELT,甚至是上世纪80年代的旧C++前身C with classes)。
当这些实现更多或少(甚至完全)地进行了引导时,您确实希望将生成的C文件放在一起,可能是在某个src/目录(或某个generated/目录)中。您甚至可以将这些放在版本控制系统(例如git)下,尤其是对于只有一个实现的语言(否则,您将无法构建此类编译器;您需要生成的C代码来构建它,并稍后使用自身重新编译它),您肯定会在源tarball中分发这些(生成的)C文件。
最后,成千上万个C或C++ -或Ocaml-文件的非常大的项目(甚至完全由人工编写)往往将这些文件分组到子目录中,特别是因为许多数千个*.c文件的单个大目录不适合人类阅读或友好。
相反,对于一个最多有几十个C源文件和手写Makefile的小型项目,代码行数不超过十万行,您最好将所有*.c和.h文件放在包含该Makefile的同一目录中。但是是否有src/目录,或者将编译器生成的目标文件放在包含源文件或Makefile的同一目录中,仍然在很大程度上取决于口味、意见、惯例和习惯。我建议研究类似于您的项目的自由软件项目(类似于free software)在github或其他地方的现有做法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接