在 makefile 中将 Windows 路径转换为 ​​Unix 路径

2023-12-23

这个问题与在 makefile 中将 Cygwin 路径转换为 ​​Windows 路径 https://stackoverflow.com/questions/4400310/convert-cygwin-path-to-windows-path-in-a-makefile但它不一样。

我需要转换 Windows 路径,例如:

C:\src\bin

进入 Unix 路径,例如:

/c/src/bin

在 makefile 中,我可以使用以下代码来转换此类路径:

slashedpath = $(subst \\,\/,$(windowspath))
unixpath = $(shell cygpath -u $(slashedpath))

当 GNU Make 正在处理的 makefile 中,如何执行相同的转换?cygpath功能不可用?

附注 如果什么$(windowspath)包含多个路径?如何将它们全部转换?


生成文件:

windowspath=C:\src\bin
unixpath=$(subst \,/,$(subst C:\,/c/,$(windowspath)))
all:
    @echo "$(windowspath)"
    @echo "$(unixpath)"

给出输出:

C:\src\bin
/c/src/bin

这也将起作用,如果$(windowspath)包含多个路径。在 GNU Make 4.2.1 上测试i686-pc-cygwin,以及为 GNU Make 3.81 构建的i686-redhat-linux-gnu.

我很惊讶这有效。


Update:第二个版本将处理各种驱动器,例如C:, D:等等。其中一些想法来自 Eric Melski 的回答在 GNU Make 中,如何将变量转换为小写? https://stackoverflow.com/questions/664601/in-gnu-make-how-do-i-convert-a-variable-to-lower-case。如果Makefile is:

DRIVE = $(subst \
  A:,/a,$(subst B:,/b,$(subst C:,/c,$(subst D:,/d,$(subst \
  E:,/e,$(subst F:,/f,$(subst G:,/g,$(subst H:,/h,$(subst \
  I:,/i,$(subst J:,/j,$(subst K:,/k,$(subst L:,/l,$(subst \
  M:,/m,$(subst N:,/n,$(subst O:,/o,$(subst P:,/p,$(subst \
  Q:,/q,$(subst R:,/r,$(subst S:,/s,$(subst T:,/t,$(subst \
  U:,/u,$(subst V:,/v,$(subst W:,/w,$(subst X:,/x,$(subst \
  Y:,/y,$(subst Z:,/z,$1))))))))))))))))))))))))))

drive = $(subst \
  a:,/a,$(subst b:,/b,$(subst c:,/c,$(subst d:,/d,$(subst \
  e:,/e,$(subst f:,/f,$(subst g:,/g,$(subst h:,/h,$(subst \
  i:,/i,$(subst j:,/j,$(subst k:,/k,$(subst l:,/l,$(subst \
  m:,/m,$(subst n:,/n,$(subst o:,/o,$(subst p:,/p,$(subst \
  q:,/q,$(subst r:,/r,$(subst s:,/s,$(subst t:,/t,$(subst \
  u:,/u,$(subst v:,/v,$(subst w:,/w,$(subst x:,/x,$(subst \
  y:,/y,$(subst z:,/z,$1))))))))))))))))))))))))))

windowspath = c:\src\bin D:\FOO\BAR
unixpath = $(subst \,/,$(call DRIVE,$(call drive,$(windowspath))))

all:
    @echo Original: "$(windowspath)"
    @echo Modified: "$(unixpath)"

然后输出到make is:

Original: c:\src\bin D:\FOO\BAR
Modified: /c/src/bin /d/FOO/BAR

更新2:最直接、最灵活的方法是使用标准正则表达式处理程序,例如perl or sed,如果这些可用的话。例如,使用 GNU sed,此 Makefile 将按要求工作:

windowspath = c:\src\bin D:\FOO\BAR
unixpath = $(shell echo '$(windowspath)' | \
           sed -E 's_\<(.):_/\l\1_g; s_\\_/_g')

all:
    @echo Original: "$(windowspath)"
    @echo Modified: "$(unixpath)"

的解释sed:

  • s_\<(.):_/\l\1_g对于每个以类似开头的单词A: or a:,将开头替换为/a.
  • s_\\_/_g将所有反斜杠替换为正斜杠。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 makefile 中将 Windows 路径转换为 ​​Unix 路径 的相关文章

随机推荐