【问题标题】:Eclipse, CDT, add custom step in "clean" stepEclipse,CDT,在“清理”步骤中添加自定义步骤
【发布时间】:2014-10-29 09:39:24
【问题描述】:

我有几个生成源文件的 shell 脚本。除了最终的结果文件之外,它们还创建了一些工件,例如日志文件、临时对象,以便在出现问题时进行调试等。当我选择“Project -> Clean ...”时,我想将自定义步骤添加到流程运行中,这将删除所有生成的文件。我正在使用自动生成的 Makefile,并希望避免自己编写。不是我不能,我只是我宁愿花时间做更多的实际工作,而不是繁琐的管理。

【问题讨论】:

    标签: eclipse makefile eclipse-cdt


    【解决方案1】:

    这是一种“清理”文件的方法(带有地图文件的特定示例),它应该可以正常工作。

    要清理多个文件,您可以添加多个“构建器” - 每个文件一个。或者,创建一个将它们全部清除的脚本。

    在使用“清理”时管理地图文件的删除

    注意:构建每个目标(通常是 Debug 和 Release)来为下面的“刷新”步骤创建文件夹

    • 打开项目的属性
    • 点击建设者
    • 点击新建按钮。
    • 选择程序,然后按确定按钮。
    • 将默认名称“New_Builder”替换为有意义的名称。对于这个例子:

      删除地图文件

    • 位置:编辑框中输入程序的名称。

      /bin/rm

    • 在命令中输入所需的参数

      ${project_loc}/${config_name:${project_name}}/${project_name}.map

    • 点击刷新标签并选择适当的设置。对于这个例子:

      • 启用完成后刷新资源

      • 取消勾选递归包含子文件夹

      • 选择特定资源

      • 点击指定资源...按钮

      • 展开具体项目,在“Debug”和“Release”旁边打勾

      • 完成按钮。

    • 单击构建选项选项卡并选择适当的设置。对于这个例子:

      • 取消勾选分配控制台(输入所需)

      • 仅在运行构建器部分中选中“清理”期间选项:

      • 确定按钮。

    • 应用并关闭按钮。

    【讨论】:

      【解决方案2】:

      @jędrzej-dudkiewicz

      哇!我花了大约一个工作日来解决完全相同的问题,现在我阅读了您的帖子... 但我想提出更“准确”的问题解决方法:您需要添加带有虚假目标的新规则,比如superclean,到(例如)makefile.targets 文件中——它将包含在主@987654323 中@;那么您需要在项目属性对话框中的“C/++ Build”的“行为”页面的“行为”页面中添加superclean(用空格将其与已经列出的其他目标隔开)。瞧!

      编辑:

      不幸的是,提到的方法可能会产生一些不良影响。事实上,Eclipse CDT 生成的makefile 有这样的行:

      ifneq ($(MAKECMDGOALS),clean)
      ifneq ($(strip $(C++_DEPS)),)
      -include $(C++_DEPS)
      endif
      ifneq ($(strip $(C_DEPS)),)
      -include $(C_DEPS)
      endif
      ifneq ($(strip $(CC_DEPS)),)
      -include $(CC_DEPS)
      endif
      ifneq ($(strip $(CPP_DEPS)),)
      -include $(CPP_DEPS)
      endif
      ifneq ($(strip $(CXX_DEPS)),)
      -include $(CXX_DEPS)
      endif
      ifneq ($(strip $(C_UPPER_DEPS)),)
      -include $(C_UPPER_DEPS)
      endif
      endif
      

      当您尝试清理您的项目时,make 将尝试包含*_DEPS 变量中列出的文件。这是因为ifneq ($(MAKECMDGOALS),clean) 不起作用,因为反过来,$(MAKECMDGOALS) 在我们的例子中拥有superclean clean 值。尽管只要您不插入这样的规则,此变体可能仍然有效

      %.d: %.o
          ...
      

      在您项目的makefile 中的某个位置。因为在这种情况下make 可能会尝试生成不存在的.d 文件。

      所以我认为还有另一种方法可以解决此问题:只需将您希望在清理项目期间删除的(自动)生成文件的列表附加到此处提到的变量之一:

      # Other Targets
      clean:
          -$(RM) $(OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) oc
          -@echo ' '
      

      这是来自自动生成的makefile 的引用。你可以这样做:

      ifneq ($(findstring clean,$(MAKECMDGOALS)),)
      EXECUTABLES+=$(LIST_OF_THE_GENERATED_FILES)
      endif
      

      【讨论】:

      • 不错!我从来没有找到它,虽然我已经找了一天,就像你一样。好吧,我想其他人会来告诉我们如何以更好的方式做到这一点:)
      【解决方案3】:

      我找到了以下解决方案:在属性、C/C++ 构建、构建器设置、构建器中有“构建命令”框和“使用默认构建命令”复选框。

      所以它很简单,虽然很脏——我用“customMake”替换了“make”——它拦截调用,检查“clean”参数并执行我选择的脚本。

      很有可能有更好的解决方案,但我没有找到它。

      还有另一种方法。在项目的根目录中创建文件 makefile.targets 并创建规则“干净”重复 makefile 从 Release/Debug/Whatever 目录执行的步骤,并在那里添加自定义步骤。示例:

      干净: -$(RM) $(OBJS)$(C_DEPS)$(ARCHIVES) libmpos.a echo 在此处放置自定义步骤

      不幸的是,对规则覆盖发出警告:

      ../makefile.targets:2:警告:覆盖目标clean' makefile:52: warning: ignoring old commands for targetclean'的命令

      但它确实有效,而且似乎比以前的解决方案更好。

      【讨论】:

        猜你喜欢
        • 2010-11-09
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2022-06-12
        相关资源
        最近更新 更多