Makefile 为什么要使$(abspath path)将结果与当前目录连接起来?

Makefile 为什么要使$(abspath path)将结果与当前目录连接起来?,makefile,Makefile,作为makefile配方的一部分,我有: @echo SOMEDIR:$(SOMEDIR) @echo abspath:$(abspath $(SOMEDIR)) 产生: SOMEDIR:D:/one/two/three/../../four abspath:D:/P4_sandbox/depot/ssg/embedded/industrial/MotorControl/ReferenceDesigns/DriveOnChip_SingleIPOneEach_SoC_FFT/software/

作为makefile配方的一部分,我有:

@echo SOMEDIR:$(SOMEDIR)
@echo abspath:$(abspath $(SOMEDIR))
产生:

SOMEDIR:D:/one/two/three/../../four
abspath:D:/P4_sandbox/depot/ssg/embedded/industrial/MotorControl/ReferenceDesigns/DriveOnChip_SingleIPOneEach_SoC_FFT/software/CVSX_DS5/APP_RD/D:/one/four
我希望得到:

SOMEDIR:D:/one/two/three/../../four
abspath:D:/one/four

为什么abspath将其结果连接到$(CURDIR)的值,以及如何停止它?

这就是abspath的作用。它创建了一条绝对路径。这意味着它必须锚定在根部
abspath
不仅仅是
规范化路径


您需要
subst
关闭该选项,或者做些什么来获得您想要的行为,我可以想象。

实际上,abspath对驱动器号指定并不满意。请在删除D:后重试。如果事先删除D:对您来说是不可能的,那么您将不得不编写一个gmake宏(包装器)。在没有gmake的情况下,这里是FP中的一个练习,定义三个宏以便$(ABSPATH$(mypathvar))工作

_FLIP = $2 $1 _ABSPATH = $(subst \ ,:, $(strip $2 $(abspath $1))) ABSPATH = $(_ABSPATH $(FLIP $(subst :, ,$1)))) _翻转=2美元1美元 _ABSPATH=$(subst\,:,$(strip$2$(ABSPATH$1))) ABSPATH=$(_ABSPATH$(FLIP$(subst:,$1)))
对我来说这看起来像个虫子。你也许应该问一下这个问题-w32@gnu.org邮件列表,专门处理在Windows上运行GNU make的问题。请确保您提供了此处省略的所有详细信息,例如您使用的GNU make版本、Windows版本、如何构建make(cygwin?Mingw32?MSVC项目文件?批处理文件?),等等。那里的某个人应该能够为您解决此问题。我更愿意回答这是一个bug/D:/不是有效的绝对路径。第二个:打破了你看到的其他配方。啊,我现在看到了增加的Windows驱动器规格复杂性。我不确定我是否认为这是一个bug,但它看起来确实是意外的。它是否是bug完全取决于你从哪里得到这个版本的GNU make,以及你在什么环境中使用它,正如我在上面的评论中提到的。如果它是cygwin版本,那么它可能不是bug:cygwin使用POSIX路径,而不是Windows路径。如果它是本机Windows版本(mingw32或msvc),那么可能是一个bug。谢谢!D:事先(然后在后面添加,这是一种享受,比我自己的解决方法要好得多。@Misha什么是$2和$1。对不起,我喝了什么…$1,$2,…是用户定义的make宏的参数。在调用宏之前不会对它们进行计算。但那天我一定是在太多Lang之间切换。应该写:ABSPATH=$(打电话……)谦虚的道歉;永远不要在电话上键入密码。