生成文件:
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
将所有反斜杠替换为正斜杠。