базовое имя exec не работает из makefile Windows

#windows #makefile #build #gnu-make

#Windows #makefile #сборка #gnu-make

Вопрос:

Я работаю над файлом Windows make, который содержит приведенное ниже утверждение

 Win10_SDK_Version := $(shell find $(WROOT_WIN10_SDK)/Include -maxdepth 1 -type d -path $(WROOT_WIN10_SDK)/Include/[0-9.]* -exec basename {}; 2> output.txt | sort | tail -n 1)
 

Однако я вижу, что переменная Win10_SDK_Version не заполнена. Для отладки я напечатал переменную $(WROOT_WIN10_SDK) непосредственно перед этой строкой, и она заполняется, как и ожидалось

 WROOT_WIN10_SDK=["E:/Myscpetre20/depot/sim/sim-20fq1/build/gobuild/compcache/cayman_msvc_desktop/ob-11144741/windows2016-clean/win/Program Files/Windows Kits/10"]
 

И содержимое output.txt файл говорит, что оператор не удался— find: basename: No such file or directory

Если я сокращу приведенное выше утверждение до приведенного ниже, исключая базовое имя exec—

 Win10_SDK_Version := $(shell find $(WROOT_WIN10_SDK)/Include -maxdepth 1 -type d -path $(WROOT_WIN10_SDK)/Include/[0-9.]* 2> output.txt | sort | tail -n 1)
 

Приведенный выше оператор выполняется нормально, поэтому уверен, что это какая-то проблема с тем, как я использую «-exec basename {} ;». Я также попытался включить одинарные кавычки для базового имени, как показано ниже—

 Win10_SDK_Version := $(shell find $(WROOT_WIN10_SDK)/Include -maxdepth 1 -type d -path $(WROOT_WIN10_SDK)/Include/[0-9.]* -exec 'basename {}'; 2> output.txt | sort | tail -n 1)
 

Но даже это не удается, может кто-нибудь подсказать мне, как правильно включить exec basename в приведенное выше утверждение?

Ответ №1:

В общем, вам следует избегать использования путей, содержащих пробелы, при работе с файлами make и makefile. Это очень сложно сделать.

Если единственное место, где вам нужно использовать WROOT_WIN10_SDK переменную, находится внутри рецептов и shell команд, то это можно сделать, но вы должны помнить, что эта переменная должна быть правильно заключена в кавычки.

Вероятно, будет проще написать вашу команду следующим образом:

 Win10_SDK_Version := $(shell (cd '$(WROOT_WIN10_SDK)/Include' amp;amp; ls -1 [0-9.]*) 2> output.txt | sort | tail -n 1)
 

Комментарии:

1. Я понял вашу точку зрения, не использовать пути, содержащие пробелы, но по устаревшим причинам мне нужно использовать эту строку. В основном хотел узнать, как исправить часть exec basename в моей команде.

2. Я пытаюсь вам сказать, что ошибочна не часть базового имени вашей команды. Проблема, с которой вы столкнулись, заключается в том, что, поскольку вы не заключили в кавычки переменную, содержащую пробелы, оболочка проанализирует ее неправильно. Вы можете запустить эту команду из командной строки (оболочки UNIX, а не command.com ) и получите ту же проблему. Это вообще не связано (в данном случае) с make. Если вы хотите использовать пути с пробелами в них с командами оболочки, вы ДОЛЖНЫ заключить их в кавычки.

3. Спасибо, теперь понял