#makefile #build #generate #file #command-line-tool #cc #projects

app makegen

makegen 是一个命令行工具,可以自动生成 Makefile。请注意,它仅适用于 C/C++ 项目,并且更适用于小型项目的快速解决方案,而不是生产级软件。有关运行 makegen 的更多信息,请参阅 README 文件

9 个版本

0.2.6 2020 年 7 月 20 日
0.2.5 2020 年 7 月 20 日
0.1.1 2020 年 6 月 18 日
0.1.0 2020 年 5 月 3 日

#2691 in 命令行工具

GPL-2.0 许可证

28KB
711

Makefile 生成器

免责声明

本工具不适用于生产级软件或真正大型项目。
它生成的是一个 Makefile 模板,以便于工作(尽管生成的 Makefile 可以直接使用并完成任务),并且生成方式非常直接。
这意味着,它并不试图最大限度地利用复杂的 make 工具。
简而言之,这是一个快速生成 Makefile 的方法,让您快速开始,但它可能无法满足大型项目的需求,所以不要这样使用它 :)

关于

注意: 由于该程序明确搜索/处理 C/C++ 模型的包含结构(这意味着它不支持 C++20 模块),因此它只能为 C/C++ 程序生成 Makefile。

该工具生成一个 Makefile(生成的文件名为 Makefile),可以自动用于编译您的项目。
程序所做的是读取所有指定扩展名的文件(either c 或 cpp。有关命令行参数,请参阅 命令行参数 部分),并为每个文件构建依赖图。
这样,它可以生成将每个 C/C++ 文件编译成带有正确依赖关系的对象文件。然后,所有对象文件都设置为 bin 目标的依赖项,从而生成您的二进制文件(您的可执行文件)。
如果您有其他带有 main 函数的文件,这可能是您的测试文件,您可以过滤这些文件并创建一个名为 tests 的单独目标(有关更多信息,请参阅 测试 部分。还将添加更多目标,例如示例)。

入门/安装

要获取生成器,您必须已安装 Rust 和 cargo。您可以通过在终端中执行以下命令轻松安装它们
curl --proto '=https' --tlsv1.2 -shSfhttps://sh.rustup.rs | sh
如需更多信息,请参阅此处

安装Rust后,您还将安装cargo工具。

现在,您可以执行cargo install makegen并完成安装,或者克隆此存储库并手动构建可执行文件。
要构建它,您必须位于项目目录中,并运行cargo build --release,但这样不会将可执行文件添加到您的路径中,因此您无法从系统的每个目录中访问它。您可以通过在默认路径的bin目录中创建符号链接来轻松使其可用。为了实现这一点,请在项目目录中执行以下操作
sudoln -s $(pwd)/target/release/makegen /usr/bin/makegen

生成Makefile

要生成Makefile,您必须向makegen可执行文件提供一些参数。
必选参数是--binary或简写为-b,以及--extension或简写为-e
第一个指定了使用make编译时将生成的二进制文件名。
第二个告诉工具搜索具有该扩展名的文件(可以是C文件的c或C++文件的cpp)。
请注意,您不需要在扩展名参数前加上点(.)

注意:请确保在运行makegen时,您处于要为该项目创建Makefile的项目根目录。

例如,假设我有一个C++项目,并且我想生成一个名为foo的二进制文件。
为了做到这一点,我必须运行:makegen --binary=foo --extension=cpp
这将在您项目的根目录中生成一个名为Makefile的文件。

makegen支持其他参数,具体说明见下文。
您始终可以运行makegen -hmakegen --help以获取更多信息。

选择编译器

makegen根据您提供的extension参数默认设置相应的GNU编译器。对于C文件将是gcc,对于C++文件将是g++
makegen允许您通过提供--compiler或简写为-c的选项来选择编译器。请注意,makegen不会进行任何检查以验证给定的编译器是否可以编译C或C++,甚至它是否是一个编译器。

优化级别

默认情况下,makegen将优化标志设置为-O0。如果您想覆盖它,可以提供--opt标志。例如:makegen --binary=foo --extension=cpp --opt=O3

选择标准

默认情况下,如果您正在编译C代码,makegen将编译器设置为使用-std=c99;如果您正在编译C++代码,则使用-std=c++11。您可以通过提供--std标志来覆盖它。例如:makegen --binary=foo --extension=cpp --std=c++17

测试

makegen提供了一个名为--tests的选项,或简称为-t,您可以指定测试文件或包含测试文件的目录,并为您创建一个单独的tests目标。

此标志默认为tests文件夹(如果您没有这样的文件夹,则没问题)。
假设我们有一个名为test_suite的文件夹,其中包含我们的测试用例。
在这种情况下,您必须执行:makegen --binary=foo --extension=cpp --tests=test_suite
这将创建Makefile中的一个tests目标,因此您可以执行make tests来编译您的测试。
--tests选项可以多次出现,并指定多个测试文件夹、文件。

例如,在先前的例子中,我们还有一个名为test_foo.cpp的文件。
在这种情况下,我们会执行:makegen --binary=foo --extension=cpp --tests=test_suite --tests=test_foo.cpp

基准测试

与测试类似,makegen提供了一个名为--benchmarks的选项,具有相同的行为,但会生成一个基准测试目标。

示例

与测试类似,makegen提供了一个名为--examples的选项,具有相同的行为,但会生成一个示例目标。

不属于以上类别的二进制文件

makegen会检查每个文件是否存在main函数。如果它找到了一个且该文件不属于以上类别(测试、基准测试、示例),则创建一个名为bin_<filename>的单独目标,该目标在您运行make时运行。

为了使makegen能够处理这种情况(您可以有多个未指定的二进制文件),提供了一个额外的选项--main-file,该选项指定包含与您使用--binary选项提供的程序名相关联的main函数的文件。

默认情况下,如果扩展名为 c,则其值为 main.c;如果扩展名为 cpp,则其值为 main.cpp,因此如果您的主文件实际命名为 main.<extension>,您不需要明确提供。

依赖关系

~460–720KB