#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.