我有一个旧的Windows设置,在用Android.mk
文件构建Android应用程序时,它成功地运行shell命令,如
$(shell cp $(LOCAL_SRC_FILES) $(TARGET_OUT)/somefile.txt)
不幸的是,在Windows 11和Android Studio的新安装中,cp
命令不起作用。它不会产生任何错误,不会中止构建过程。它只是不把指定的文件复制到指定的位置。我试着打印命令的source/destination参数,它们看起来是正确的。
有没有其他方法从Android.mk的代码复制文件?
GNU make不使用您调用它的shell(如果它这样做,每个使用不同shell的人都不能使用您的makefile)。
在POSIX系统如Linux和MacOS上,它使用/bin/sh
。在Windows上,默认情况下(但这可以在编译GNU make时修改),GNU make将首先在您的PATH上查找sh
,如果没有找到,它将使用cmd.exe
。
GNU Make永远不会在Windows上使用Powershell(除非你通过设置SHELL
makefile变量来明确告诉它)。
不幸的是,你没有提供足够的信息让我们帮助你:你需要给我们$(shell ...)
出现的地方的背景。它是否像您所看到的那样,在makefile中单独存在?我很确定事实并非如此。因此,它必须在配方中,为了理解其行为,我们需要查看配方。
$(shell ...)
函数通常不是您想在菜谱中使用的东西。一个recipe已经在shell中运行了,所以它是多余的,并且它有一些你意想不到的奇怪行为。$(shell ...)
的工作方式是,它运行命令并将展开为标准输出。它不显示标准输出。同样,$(shell ...)
中的失败不被认为是配方的失败:退出代码被忽略。