This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F280039:在 makefile 中保留相对路径

Guru**** 2888980 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1637550/tms320f280039-keeping-relative-path-in-makefile

器件型号: TMS320F280039

尊敬的专家:

我的客户使用 git 来管理代码、工程将在服务器上编译。

他们只想使用 gamke 命令进行编译和 gamke 命令。 据我所知,gmake 所需的 makefile 是由 ecplyse 脚本生成的。 这意味着如果他们不使用 ecplyse 脚本、他们就无法从.project CCS 生成 makefile、并且必须在管理中包含 makefile 本身到 git。

问题在于、makefile 包含绝对路径、尤其是 proejct 中的 include 路径。  

image.png

该绝对路径包括项目根、在不同的计算机上可能会有所不同。 它使该 makefile 不适用于其他计算机。

我的问题是如何在 makefile 中保留相对路径?  

请注意、编译工具也有绝对路径、但这对于客户来说是可以的、因为在不同的机器上对齐工具环境是合理的。 不同机器的刀具路径相同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Hang、

    CCS 自动生成的 makefile 不能在不同计算机之间移植。 建议的方法是 用 makefile 变量替换硬编码的绝对工程根路径、然后让每台计算机(或编译服务器)在本地定义该变量、而不是尝试强制 CCS 发出相对路径。


    TI 如何在他们自己的 SDK 中解决该问题

    TI 的 SDK makefile 使用基于变量的路径策略。 所有 makefile 都包含一 imports.mak 个定义单个变量的顶级文件—— ${SDK_INSTALL_PATH} 每个 makefile 中的每个路径都相对于该变量[1][2]进行表示。 如果工具安装在非默认位置、则只需修改 imports.mak [3]中的路径即可。 makefile 本身有意为简单且可读、因此可以直接检查和调整它们[4]。

    您的客户可以遵循相同的模式。


    建议的方法

    步骤 1:定义 PROJECT_ROOT 变量

    在 makefile 的顶部(或 imports.makmakefile 包含的单独样式文件中)添加:

    #每个开发者/服务器都设置了这个,或者它通过环境变量传递
    PROJECT_ROOT ?=/default/path/to/project

    步骤 2:将绝对工程路径替换为 $(PROJECT_ROOT)

    找到所有引用工程根目录的硬编码绝对包含路径并替换它们:

    #之前(不可移植):
    include +=-i/home/user1/workspace/myProject/include
    包括+=-I/home/user1/workspace/myProject/myProject/drivers src
    #之后(便携):
    include +=-i$(PROJECT_ROOT)/include
    包括+=-i$(PROJECT_ROOT)/PROJECT/DRIVERS src

    第 3 步:保持工具路径不变

    正如您的客户所指出的、编译器/工具路径可以保持绝对路径、因为它们是跨机器标准化的。

    步骤 4: PROJECT_ROOT 按机器设置

    每个开发人员或构建服务器都通过以下方式之一定义变量:

    测量时间更长
    示例
    环境变量
    export PROJECT_ROOT=/home/server/builds/myproject
    命令行覆盖
    gmake PROJECT_ROOT=/home/server/builds/myproject
    本地导入文件 (忽略 git)
    local.mak 用定义创建; .gitignore

    ?= makefile 中的语法表示该变量仅在尚未在外部设置时用作回退。

    步骤 5:将修改后的 makefile 提交到 git

    将绝对路径替换为 $(PROJECT_ROOT)后、makefile 就可以完全移植、并且对版本控制来说是安全的。


    重要的考虑因素

    由于 .project.cproject 每次使用基于 Eclipse 的编译版本时 CCS 都会从/文件重新生成 makefile、因此 如果以后有人从 CCS GUI 构建对 makefile 的任何手动编辑都将被覆盖。 一旦客户将 makefile 文件提交到 git、就应将其视为独立的手动维护编译工件、而不是从 CCS 重新生成的文件。 这是一次一次性迁移:从 CCS 中提取 makefile、重构路径并独立管理。

    如果工程配置发生更改(新源文件,新包含路径,更改的编译器标志)、则需要在提交的 makefile 中手动反映这些更改、而不是依靠 CCS 重新生成这些更改。


    来源:(注意 — 虽然不是 C2K 器件、但这里仍然相关的 SDK makefile 文档)

    1. TI MCU+ SDK Makefile 构建 — AM243X
    2. TI MCU+ SDK Makefile build - AM64X
    3. TI 电机控制 SDK Makefile 构建 — AM243X
    4. TI 工业通信 SDK Makefile 构建 — AM243X

    此致、

    Zackary Fleenor

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fleenor:

    makefile 似乎并不是唯一包含绝对路径的文件、subdir_rules.mk 和 subdir_vars.mk 也包含绝对路径。 您是否也建议更改这些文件? 如果是、如何操作?

    此致、

    挂起

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Hang、

    是— $(PROJECT_ROOT)subdir_rules.mk 和应用相同的变量替换 subdir_vars.mk。 这些文件是 CCS 生成的同一构建系统的一部分、将包含绝对路径、就像主 makefile [1]一样。 所有这些方法都是相同的。

    如何修改 subdir_rules.mksubdir_vars.mk

    subdir_vars.mk 通常定义源文件列表并包含每个子目录的路径。 将所有绝对的 project 根路径替换为 $(PROJECT_ROOT)

    # BEFORE:
    C_SRCS += /home/user1/workspace/myproject/src/main.c
    INCLUDES += -I/home/user1/workspace/myproject/include
    # AFTER:
    C_SRCS += $(PROJECT_ROOT)/src/main.c
    INCLUDES += -I$(PROJECT_ROOT)/include
    subdir_rules.mk 通常定义编译规则(如何从每个子目录进行编译) .obj .c 。 对引用工程根目录的任何绝对路径应用相同的替换:
    # BEFORE:
    /home/user1/workspace/myproject/Debug/src/%.obj: /home/user1/workspace/myproject/src/%.c
    $(CC) $(CFLAGS) ...
    
    # AFTER:
    $(PROJECT_ROOT)/Debug/src/%.obj: $(PROJECT_ROOT)/src/%.c
    $(CC) $(CFLAGS) ...

    确保变量可用于所有文件

    由于 main makefile 包括 subdir_rules.mksubdir_vars.mk、因此 PROJECT_ROOT 在 main makefile 的顶部定义(或在首先包含的共享中定义) imports.mak 。 该变量将在处理子文件[2]时可用。

    # Top of makefile (or imports.mak included at the top):
    PROJECT_ROOT ?= /default/path/to/project
    
    -include subdir_vars.mk
    -include subdir_rules.mk

    重要提醒

    • 如果有人从 GUI 构建、CCS 会重新生成所有这些文件。 在使用基于变量的路径将它们提交到 Git 后、应将它们视为手动维护的、不要从 CCS 重建、否则您的编辑将被覆盖[1]。
    • 仅替换工程根路径。 保留编译器/工具路径的绝对值、因为您的客户已经同意这些路径是跨机器进行标准化的。
    • 检查 .mk objects.mk sources.mkCCS 可能生成的其他文件(例如,)—它们也可能包含绝对路径、应以相同的方式处理。

    为了帮助完善这项建议、了解以下信息会有所帮助:

    • 您的客户是否计划与命令行构建并行使用 CCS GUI 构建(这会导致再生冲突)
    • .mksubdir_rules.mk subdir_vars.mk 特定工程之外是否还有其他自动生成的文件也包含绝对路径

    1. TI AM13x Academy - CCS 构建系统文件
    2. TI MCU+ SDK Makefile 构建 — AM243X

    此致、

    Zackary Fleenor