Makefile передает дополнительные аргументы команде target из команды make - PullRequest
0 голосов
/ 28 августа 2018

У меня есть Makefile, который определяет проект docker-compose. Это по существу собирает меня команду:

COMMAND := docker-compose --project-name=$(PREFIX) --file=$(FILE_PATH)

up:
    $(COMMAND) up -d

Я хотел бы добавить target с именем dc, в который я мог бы передавать любые аргументы, которые я хочу.

Я знаю, что есть одно решение:

target:
    $(COMMAND) $(ARGS)

А затем назовите его, например, make target ARGS="--help".

Но нет ли более простого способа, как в bash $@? Я хотел бы пропустить часть ARGS = ... и отправить все команде после target name.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Не совсем. Программа make интерпретирует все аргументы (которые не содержат =) как целевые имена для сборки, и вы не можете переопределить это. Таким образом, даже если вы можете получить список аргументов, приведенных в командной строке (через переменную $(MAKECMDGOALS), специфичную для GNU make), вы не можете запретить считать эти аргументы целевыми.

Вы могли бы сделать что-то вроде этого, что невероятно хакерски:

KNOWN_TARGETS = target

ARGS := $(filter-out $(KNOWN_TARGETS),$(MAKECMDGOALS))

.DEFAULT: ;: do nothing

.SUFFIXES:
target:
        $(COMMAND) $(ARGS)

(непроверенные). Проблема здесь в том, что вы должны постоянно обновлять KNOWN_TARGETS со всеми «реальными» целями, чтобы вы могли удалить их из списка целей, приведенного в командной строке. Затем добавьте цель .DEFAULT, которая будет запускаться для любой целевой марки, которая не знает, как создать, что ничего не делает. Сбросьте мета-цель .SUFFIXES, чтобы удалить встроенные правила.

Я подозреваю, что у этого все еще будут странные крайние случаи, когда это не работает.

Также обратите внимание, что вы не можете просто добавить опции, такие как --help, в командную строку make, потому что make будет интерпретировать их сам. Вам нужно будет поставить перед ними префикс --, чтобы заставить make игнорировать их:

make target -- --help

Другой вариант - добавить цель, подобную этой:

target%:
        $(COMMAND) $*

Тогда вы можете запустить это:

make "target --help"

Но вы должны включить кавычки.

В общем, я просто рекомендую вам пересмотреть то, что вы хотите сделать.

0 голосов
/ 28 августа 2018

Вы можете написать скрипт-оболочку bash, чтобы сделать то, что вы хотите:

#/bin/bash
make target ARGS=\"$@\"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...