假设项目目录下包含src、bin、lib、doc等子目录,那么项目的makefile放在哪里呢?
例如,
一些项目将其 makefile 放在src/项目根目录的子目录中,
有些项目将其 makefile 放在项目的根目录中。
我觉得第二种方式更有逻辑性。您能否提供一些案例,说明哪些情况下最好将 makefile 放在根目录src/或其他目录中,原因是什么?
问题的其余部分是基于意见的,但最后一部分则不太基于意见:
您能否提供一些案例,说明为什么最好将 makefile 放在根目录、src/ 或其他目录中,原因是什么?
首先,该目录可能不会被调用src/,而是通过其他方式调用。
有时它Makefile本身是生成的(例如通过cmake或autoconf)并且它的生成器需要一些特定的文件树组织。
将所有源代码放入其中的一个常见原因src/是交叉编译,或针对不同类型的目标进行编译(可能是调试版本和优化版本)。然后,您将把所有源代码放入src/并确保make(和gcc)不要将目标文件放入该src/目录中,而是放入其他目录中(例如,obj-x86对于X86目标文件,obj-arm对于ARM目标文件等...),也许具体不不仅适用于ISA,还适用于ABI。因此,您最终可能会将目标文件和可执行文件放在一个长命名目录中,例如obj-x86_64-linux-optimized和obj-PowerPC-AIX-debug。顺便说一句,该src/目录甚至可以在多台机器上共享(例如,NFS安装)并且是只读的(例如,可由多个用户共享)。
然后,源代码对于(实际上,对于像GCC这样的编译器)和开发人员来说具有不同的含义。make
源代码的社会定义(开发人员使用的)是:人类开发人员工作的程序的首选形式(您会发现自由软件运动清楚地表达了该定义)。
对于像GCC或Clang这样的编译器,源代码只是作为编译器输入给出的翻译单元.c(即由编译器作为输入.h处理的文件)。在许多(但不是全部)情况下,此类 C 文件是真正的源代码,因为它们是由人类开发人员编写的。gcc
在某些情况下,会生成C 或 C++“源”文件(如gcc或g++或clang或所示clang++)(在这种情况下,对于开发人员来说,它们不再是源代码,但它们仍然是输入源)。一个典型的例子当然是由bison生成的 C 文件。有关该想法的一般讨论,请参阅我的答案。gcc
另一个示例(其中 C 文件位于某个公共目录中)是由编译为 C 的特定于域(或高级)语言实现给出的(例如Bigloo、Chicken Scheme、我的旧GCC MELT,甚至带有类的旧 C - 20 世纪 80 年代 C++ 的先驱)。
当此类实现或多或少(甚至完全)引导时,您确实希望将生成的 C 文件保存在一起,也许在某个src/目录(或某个目录generated/)中。您甚至可以将它们放在您的版本控制系统(例如git)下,特别是对于具有单一实现的语言(否则,您将无法构建这样的编译器;您需要生成的 C 代码来构建它,然后重新编译它本身),并且您肯定会在源tarball中分发此类(生成的)C 文件。
最后,包含数千个 C 或 C++ - 或 Ocaml- 文件(甚至完全由人工编写)的非常大的项目倾向于将这些文件分组在子目录中,特别是因为包含数千个*.c文件的单个大目录不被(或友好的)“读取”至)人类。
相反,对于一个最多十万行代码,几十个C源文件,并且手动编写的小项目Makefile,最好将所有*.c&.h文件放在包含该文件的同一目录中Makefile。
但是是否有某个src/目录,或者是否将编译器生成的目标文件放在包含源文件或 的同一目录中Makefile,仍然在很大程度上取决于品味、意见、惯例和习惯。我建议研究github或其他地方的自由软件项目(类似于您的项目)的现有实践。
| 归档时间: |
|
| 查看次数: |
3576 次 |
| 最近记录: |