如何在GNU Make中更改当前目录

鲁维姆

我想将带有源的目录与带有目标的目录分开。似乎从Makefile更改当前工作目录应该是最简单的解决方案。

由于以下缺点,到目标的显式路径还不够:

  1. Makefile中的冗余代码,因为对目标的每个引用都应以变量作为前缀。
  2. 用于构建特定中间目标的更复杂的命令行(对于调试而言更糟)。

另请参阅Pauls的规则3

如果目标是在当前工作目录中构建的,则生命最简单。

关于VPATH,我也同意要求开发人员“在运行make之前切换到目标目录是一件很痛苦的事情”。

鲁维姆

已知方法概述

Paul D. Smith在“多体系结构构建”一文中对如何分离源目录和目标目录进行了出色的研究描述了以下方法(有其缺点):

  • 源副本
  • 显式路径(对每个目标的引用都以路径名作为前缀)
  • VPATH(从目标目录调用构建)
  • 高级VPATH(自动递归调用)

另一种方法

但是,我找到了更简单的解决方案-使用较小的样板,而无需递归调用make如果使用带有Guile的GNU Make,我们可以使用Guilechdir函数从Makefile更改当前的工作目录。同样,我们可以mkdir在此之前通过创建目录

data ?= ./data/

# Create $(data) directory if it is not exist (just for example)
$(guile (if (not (access? "$(data)" F_OK)) (mkdir "$(data)") ))

# Set the new correct value of CURDIR (before changing directory)
CURDIR := $(abspath $(data))

# Change the current directory to $(data)
$(guile (chdir "$(data)"))

# Another way of updating CURDIR
#  — via sub-shell call after changing directory
# CURDIR := $(shell pwd)


# Don't try to recreate Makefile file
# that is disappeared now from the current directory
Makefile : ;

$(info     CURDIR = $(CURDIR)     )
$(info        PWD = $(shell pwd)  )

最终的样板更改当前目录

假设:data变量在上下文中可用,$(data)目录的父级可以访问,路径可以是相对的。

srcdir := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
ifeq (,$(filter guile,$(.FEATURES)))
  $(warning Guile is required to change the current directory.)
  $(error Your Make version $(MAKE_VERSION) is not built with support for Guile)
endif
$(MAKEFILE_LIST): ;
$(guile (if (not (file-exists? "$(data)")) (mkdir "$(data)") ))
ORIGCURDIR  := $(CURDIR)
CURDIR      := $(realpath $(data))
$(guile (chdir "$(data)"))
ifneq ($(CURDIR),$(realpath .))
  $(error Cannot change the current directory)
endif
$(warning CURDIR is changed to "$(data)")

请记住,include指令中的相对路径默认情况下是从当前目录计算得出的,因此它取决于位置-是在此样板之前还是之后使用。

注意$(data)不得在规则中使用;$(srcdir)可用于指定相对于此Makefile文件位置的文件。

发现的问题

此方法已在GNU Make 4.0和4.2.1中进行了测试。

观察到一个小问题。abspath更改当前目录后,该函数无法正常工作-它将继续按照旧的路径解析相对路径CURDIRrealpath正常工作。

同样,该方法可能具有其他未知的缺点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Git中更改当前工作目录?

来自分类Dev

如何更改当前工作目录

来自分类Dev

如何更改当前工作目录?

来自分类Dev

如何在Mac OS X上的bash脚本中更改当前工作目录?

来自分类Dev

如何在不更改当前目录的情况下在文件夹中运行命令?

来自分类Dev

如何在不更改当前目录的情况下在文件夹中运行命令?

来自分类Dev

如何使用AppleScript更改当前工作目录

来自分类Dev

如何防止PM2更改当前目录?

来自分类Dev

如何使vim自动更改当前工作目录?

来自分类Dev

如何防止 sudo -i 命令更改当前目录?

来自分类Dev

如何在导航栏中更改当前链接的颜色

来自分类Dev

如何在Yii2中更改当前用户

来自分类Dev

如何在Vim中“更改当前行”?

来自分类Dev

如何更改当前目录,子目录以及子目录的子目录中的文件所有权?

来自分类Dev

如何在不更改当前目录的情况下清空dirs堆栈?

来自分类Dev

如何递归更改当前目录内所有目录的权限?

来自分类Dev

如何在Redhat中更改当前Shell会话中的时区

来自分类Dev

如何通过Shell脚本更改当前目录并在那里执行命令?

来自分类Dev

如何在Microsoft SQL Server Management Studio中更改当前选项卡的连接

来自分类Dev

如何在Visual Studio 2013中更改当前线条颜色?

来自分类Dev

如何在CSS中更改当前菜单项的突出显示颜色?

来自分类Dev

如何在 Eclipse 的选项卡列表中更改当前活动选项卡的背景?

来自分类Dev

如何更改当前日期

来自分类Dev

如何更改当前链接的样式

来自分类Dev

如何更改当前链接的字体颜色

来自分类Dev

如何使用 Javascript 更改当前时间

来自分类Dev

如何在调试模式下更改当前断线颜色?

来自分类Dev

如何在GNU屏幕中运行GNU屏幕?

来自分类Dev

浏览器如何更改当前字体中不存在的字体粗细?

Related 相关文章

  1. 1

    如何在Git中更改当前工作目录?

  2. 2

    如何更改当前工作目录

  3. 3

    如何更改当前工作目录?

  4. 4

    如何在Mac OS X上的bash脚本中更改当前工作目录?

  5. 5

    如何在不更改当前目录的情况下在文件夹中运行命令?

  6. 6

    如何在不更改当前目录的情况下在文件夹中运行命令?

  7. 7

    如何使用AppleScript更改当前工作目录

  8. 8

    如何防止PM2更改当前目录?

  9. 9

    如何使vim自动更改当前工作目录?

  10. 10

    如何防止 sudo -i 命令更改当前目录?

  11. 11

    如何在导航栏中更改当前链接的颜色

  12. 12

    如何在Yii2中更改当前用户

  13. 13

    如何在Vim中“更改当前行”?

  14. 14

    如何更改当前目录,子目录以及子目录的子目录中的文件所有权?

  15. 15

    如何在不更改当前目录的情况下清空dirs堆栈?

  16. 16

    如何递归更改当前目录内所有目录的权限?

  17. 17

    如何在Redhat中更改当前Shell会话中的时区

  18. 18

    如何通过Shell脚本更改当前目录并在那里执行命令?

  19. 19

    如何在Microsoft SQL Server Management Studio中更改当前选项卡的连接

  20. 20

    如何在Visual Studio 2013中更改当前线条颜色?

  21. 21

    如何在CSS中更改当前菜单项的突出显示颜色?

  22. 22

    如何在 Eclipse 的选项卡列表中更改当前活动选项卡的背景?

  23. 23

    如何更改当前日期

  24. 24

    如何更改当前链接的样式

  25. 25

    如何更改当前链接的字体颜色

  26. 26

    如何使用 Javascript 更改当前时间

  27. 27

    如何在调试模式下更改当前断线颜色?

  28. 28

    如何在GNU屏幕中运行GNU屏幕?

  29. 29

    浏览器如何更改当前字体中不存在的字体粗细?

热门标签

归档