在生成文件中将Windows路径转换为Unix路径 [英] Converting Windows path to Unix path in a makefile

查看:23
本文介绍了在生成文件中将Windows路径转换为Unix路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此问题与Convert Cygwin path to Windows path in a makefile 相关,但不同。

我需要转换Windows路径,如:

C:srcin

放入Unix路径,如:

/c/src/bin

在Makefile中,我可以使用以下代码来转换这样的路径:

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

cygPath函数不可用时,如何在GNU make正在处理的生成文件中执行相同的转换?

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

推荐答案

生成文件:

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

给出输出:

C:srcin
/c/src/bin
如果$(windowspath)包含多个路径,则此方法也适用。针对i686-PC-cygwin在GNU make 4.2.1上测试,也在为i686-redhat-linux-gnu构建的GNU make 3.81上测试。

我很惊讶这竟然奏效了。


更新:第二个版本将处理各种驱动器,如C:D:等。其中一些想法来自Eric Melski对In GNU Make, how do I convert a variable to lower case?的回答。如果Makefile为:

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:srcin D:FOOBAR
unixpath = $(subst ,/,$(call DRIVE,$(call drive,$(windowspath))))

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

make的输出为:

Original: c:srcin D:FOOBAR
Modified: /c/src/bin /d/FOO/BAR

更新2:最直接也是最灵活的方法是使用标准正则表达式处理程序,如perlsed,如果它们可用的话。例如,使用GNU sed,此生成文件将按要求工作:

windowspath = c:srcin D:FOOBAR
unixpath = $(shell echo '$(windowspath)' | 
           sed -E 's_<(.):_/l1_g; s_\_/_g')

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

sed说明:

  • s_<(.):_/l1_g对于每个以A:a:开头的单词,将开头替换为/a
  • s_\_/_g将所有反斜杠替换为正斜杠。

这篇关于在生成文件中将Windows路径转换为Unix路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆