系统:Win10与MinGW制作
我正试图将PowerShell输出存储在配方中的一个变量中,不幸的是,我已经用尽了所有选项。
存储powershell命令的变量:
# Get newest package in the directory
LST_PKG := powershell "gci -Path . -File *.nipkg -Recurse -Name | sort creationtime | Select -First 1"
输出为buildspackagessrl-lut_1.2.0.32_windows_all.nipkg
不起作用的实际配方(PKG_REL_PATH最终为空(:
.PHONY: publish
publish: clean build package
ifeq ($(DEBUG), 1)
@echo "Publishing a DEBUG package..."
#1. Copy package to feed repo
$(eval PKG_REL_PATH = $(LST_PKG))
cp $(ROOT_DIR)$(PKG_REL_PATH) $(TEST_FEED_REPO)
#2. Publish the package
else
@echo "Publishing a RELEASE package..."
endif
表明问题的部分输出:
"Publishing a DEBUG package..."
cp C:UsersPublicProjectsSRLlutsrcpowershell "gci -Path . -File *.nipkg -Recurse -Name | sort creationtime | Select -First 1" \raven#RavenSRLFeedsSRLRepo
'cp' is not recognized as an internal or external command,
operable program or batch file.
make: *** [makefile:78: publish] Error 1
看起来LST_PKG没有扩展和求值,只是作为字符串分配给PKG_REL_PATH:cp C:\Users\Public\Projects\SRL\lut\src*powershell"gci-路径-文件.nipkg-重复-名称|排序创建时间|选择-第一个1">\raven\#raven\SRLFeeds\SRL\Repo
- 在配方中使用make函数(如
eval
(通常是错误的 - 您的
eval
只是创建一个名为PKG_REL_PATH
的make变量LST_PKG
的副本,它不执行powershell
命令 - 您收到的错误消息似乎表明make在shell中没有用于执行配方的
cp
命令。这很奇怪。你知道贝壳有什么用吗
假设你找到了解决第三个问题的方法,你可以简单地尝试:
# Get newest package in the directory
LST_PKG := powershell "gci -Path . -File *.nipkg -Recurse -Name | sort creationtime | Select -First 1"
PKG_REL_PATH := $(shell $(LST_PKG))
shell
make函数将把powershell
命令传递给shell。shell将执行它,并且输出将被分配给PKG_REL_PATH
make变量。这将在make解析Makefile时发生。如果你绝对希望这个命令与publish
配方同时执行,那么你需要的很可能是一个shell变量:
publish: clean build package
ifeq ($(DEBUG), 1)
@echo "Publishing a DEBUG package..."
PKG_REL_PATH=$$($(LST_PKG));
cp $(ROOT_DIR)"$$PKG_REL_PATH" $(TEST_FEED_REPO)
else
@echo "Publishing a RELEASE package..."
endif
请注意,$$
通过生成并将$(powershell ...)
或$PKG_REL_PATH
传递到外壳来逃避第一次扩展。如果没有这一点,make的第一次扩展将吃掉$
,而传递到shell的内容将不是您想要的。
还要注意shell命令与分号和行连续符的链接。它们是绝对需要的,以保证这两个命令在同一个shell中执行。默认情况下,配方行在不同的shell调用中执行(除非您使用GNUmake
.ONESHELL
功能(,并且在一行中定义的shell变量在下一行中未定义。因此,如果没有链接和行延续,PKG_REL_PATH
shell变量将不会在cp...
行中定义。
找到了一个解决方案。首先,我定义了一个CMD类型的复制命令,用于cp(在makefile的开头,在所有配方之外:
# Copy a file from targed to destination
_CP = cmd /C copy
通过执行以下操作归档了正确的扩展:
是
publish:
ifeq ($(DEBUG), 1)
@echo "Publishing a DEBUG package..."
#1. Copy package to feed repo
$(_CP) "$(ROOT_DIR)$(shell $(_LST_PKG))" "$(TEST_FEED_REPO)"
#2. Publish the package
else
@echo "Publishing a RELEASE package..."
endif
是
publish: clean build package
ifeq ($(DEBUG), 1)
@echo "Publishing a DEBUG package..."
#1. Copy package to feed repo
$(eval PKG_REL_PATH = $(LST_PKG))
cp $(ROOT_DIR)$(PKG_REL_PATH) $(TEST_FEED_REPO)
#2. Publish the package
else
@echo "Publishing a RELEASE package..."
endif
总之,我使用了$(shell ...)
内联求值来绕过所有变量赋值,这首先导致了问题的出现。