#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. Спасибо, теперь понял