这个问题与将生成文件中的Cygwin路径转换为Windows路径有关,但不相同。
我需要转换一个Windows路径,如:
C:srcbin
进入Unix路径,如:
/c/src/bin
在makefile中,我可以使用以下代码来转换这样的路径:
slashedpath = $(subst \,/,$(windowspath))
unixpath = $(shell cygpath -u $(slashedpath))
当cygpath函数不可用时,我如何在GNUMake正在处理的makefile中执行相同的转换?
p.s。如果$(windowspath)
包含多个路径怎么办?如何将它们全部转换?
生成文件:
windowspath=C:srcbin
unixpath=$(subst ,/,$(subst C:,/c/,$(windowspath)))
all:
@echo "$(windowspath)"
@echo "$(unixpath)"
给出输出:
C:srcbin
/c/src/bin
如果$(windowspath)
包含多个路径,这也会起作用。在适用于i686-pc-cygwin的GNU Make 4.2.1上测试,也在适用于i686-rehat-linux-GNU构建的GNU Mak 3.81上测试。
我很惊讶这能奏效。
更新:第二个版本将处理各种驱动器,如C:
、D:
等。其中一些想法来自Eric Melski对In GNU Make的回答,我如何将变量转换为小写?。如果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:srcbin D:FOOBAR
unixpath = $(subst ,/,$(call DRIVE,$(call drive,$(windowspath))))
all:
@echo Original: "$(windowspath)"
@echo Modified: "$(unixpath)"
则到CCD_ 6的输出为:
Original: c:srcbin D:FOOBAR
Modified: /c/src/bin /d/FOO/BAR
更新2:最直接、最灵活的方法是使用标准正则表达式处理程序,如perl
或sed
(如果可用(。例如,使用GNU sed,这个Makefile将按要求工作:
windowspath = c:srcbin 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
将所有反斜杠替换为正斜杠