Проверить, что исполняемый файл находится на определенном пути в Makefile

Я хочу попробовать и проверить, что исполняемый файл (в данном случае Python pip) находится на определенном пути (виртуальной среде) в Makefile (это будет сделано до запуска команды make для установки всех требований и является мерой безопасности чтобы они не попали в системный python по ошибке).

(Кроме того, да, я знаю, что могу форсировать виртуальную среду для pip, но это не только для меня, поэтому я не могу гарантировать, что это сделано...)

У меня было несколько попыток, но в настоящее время это:

DIRENV := $(shell pwd)/.direnv/
PIP    := $(shell which pip)

.PHONY: check-pip
check-pip: 
    FOUND_PIP := $(if $(findstring $(PIP),$(DIRENV)),found,)
    $(info FOUND_PIP=$(FOUND_PIP))
    ifeq ($(FOUND_PIP),found)
        $(info Found pip on the path)
    else
        $(error ERROR: Cannot find pip))
    endif

$(DIRENV) и $(PIP) верны, если я их распечатаю.

Есть 2 проблемы с этим:

  1. Я вообще не могу заставить findstring работать!
  2. ifeq независимо выполняет обе части условного предложения.
❯ make check-pip
FOUND_PIP=
Found pip on the path
Makefile:37: *** ERROR: Cannot find pip.  Stop.

И просто для уточнения версии make:

❯ make --version
GNU Make 4.2.1

Вот что вы должны понять: рецепт в make-файле (вещь после цели/пререквизитов, с отступом TAB) — это сценарий оболочки. Поэтому, когда вы пишете рецепты, вы должны использовать синтаксис оболочки, а не синтаксис makefile.

MadScientist 27.09.2022 23:22

Каждая строка рецепта makefile выполняется в отдельной оболочке. Нельзя использовать такие переменные.

Andreas 27.09.2022 23:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны написать свой рецепт проверки, используя синтаксис оболочки.

.PHONY: check-pip
check-pip:
         case "$(PIP)" in \
           ("$(DIRENV)"/*) echo "Found pip on the path" ;; \
           (*) echo "Cannot find pip"; exit 1 ;; \
         esac

Обратите внимание: вам это нужно, если вы хотите проверить это только тогда, когда пользователь специально запускает цель check-pip.

Если вы хотите проверять это всегда, когда пользователь запускает make, независимо от того, какую цель он указывает, вы можете использовать операции с make-файлом, но вы не должны помещать их в рецепт, потому что они запускаются при разборе make-файла, а не при сборке цели. . И вам вообще не нужна check-pip цель.

Что, если я поставлю его в зависимость от пары других целей?

michjnich 27.09.2022 23:34

Вы можете сделать это. Я не уверен, что понял вопрос...?

MadScientist 28.09.2022 03:49

Я имею в виду, если у меня есть пара рецептов по установке/очистке и переустановке среды, и я хочу, чтобы эта проверка прошла, прежде чем они что-либо сделают.

michjnich 28.09.2022 07:05

Кстати, это работает, спасибо! Хотя кавычки вокруг $(DIRENV)* нужно удалить, иначе они соответствуют неправильной строке.

michjnich 28.09.2022 07:29

Извините, кавычки должны были быть только вокруг переменной, а не символа шара. Зафиксированный.

MadScientist 28.09.2022 14:08

Другие вопросы по теме