Внутренняя команда Makefile в Linux функциональна, но не macos

#makefile

#makefile

Вопрос:

Внутри Makefile в Linux мы можем запускать с его помощью команды shell / bash для перемещения каталогов или извлечения других файлов. Однако при переносе того же Makefile на macOS все команды недоступны для чтения (следовательно, путь и выполнение нарушены). Существует ли универсальная команда или рабочий процесс, которые могут работать с обоими?

Пример Makefile

 .ONESHELL:

COMMAND ?= none
GIT_HASH ?= githash

alpine:
    @cd images/alpine

    @make ${COMMAND} GIT_HASH=${GIT_HASH} ALPINE_VERSION=3.6.5 TAG=3.6
  

итак, в окне Linux выполняются как @CD, так и @MAKE, но не для macOS Catalina. Я хотел бы сделать ее универсальной, чтобы обе системы выполняли соответствующую команду, которая следует.

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

1. Попробуйте объединить строки cd и make в: make -C <dir> <args> ; опубликованная версия может сработать, если перед ней будет .ONESHELL: пустая строка и без нее

2. @Milag это уже было включено .ONESHELL; , и macOS не интерпретирует это.

3. Хорошо, .ONESHELL теперь она видна после вашего обновления. Какая у вас версия make для macOS? Эксперимент: добавьте 2 строки с echo $$$$ ; pid одинаковы или разные?

4. Скорее всего, в вашем macOS box используется версия GNU make по умолчанию (3.81). Не знаю, почему Apple настаивает на использовании такой старой версии, но .ONESHELL была представлена с 3.82. Обновитесь с помощью Homebrew или MacPort. В любом случае, лучше избегать make в рецептах, предпочитайте $(MAKE) , и вместо cd; make вы можете использовать -C опцию GNU make: $(MAKE) -C images/alpine ...

5. @RenaudPacalet итак, ваши рекомендации заключаются в обновлении GNU и вместо нескольких make-файлов просто иметь гигантский и использовать относительный путь для работы?

Ответ №1:

Скорее всего, в вашем macOS box используется версия GNU make по умолчанию (3.81). .ONESHELL была введена с версии 3.82. Обновитесь с помощью Homebrew или MacPort. В любом случае, лучше избегать make в рецептах, предпочитайте $(MAKE) , и вместо cd; make вы можете использовать -C опцию GNU make: $(MAKE) -C images/alpine ...

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

1. для тех, кто работает на macOS: brew install make затем добавление пути к вашему .bashrc исправит проблему вместо выполнения -c make.