Как вы заставляете make-файл перестраивать цель

Это, вероятно, не настоящее решение, но теперь - в Java 8 - вы можете сделать этот код, по крайней мере, немного лучше, используя лямбда-выражение.

final String x = "somethingelse";
new Thread(() -> {
        x.matches("something");             
    }
).start();

И вы могли бы даже сделать это в одном line, все еще имея его довольно читаемым.

new Thread(() -> x.matches("something")).start();
149
задан ruvim 7 September 2018 в 19:03
поделиться

5 ответов

Вы можете объявить одну или несколько ваших целей фальшивыми .

Фальшивой целью является та, которая на самом деле не является именем файла; скорее это это просто имя для рецепта, который будет выполнен, когда вы делаете явный запрос. Есть две причины использовать фальшивую цель: чтобы избежать конфликт с файлом с тем же именем и для повышения производительности.

...

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

24
ответ дан 23 November 2019 в 21:37
поделиться

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

669
ответ дан 23 November 2019 в 21:37
поделиться

Кто-то еще предложил .PHONY, что определенно правильно. .PHONY следует использовать для любого правила, для которого сравнение даты между входом и выходом недопустимо. Поскольку у вас нет целей вида output: input , вы должны использовать .PHONY для ВСЕХ из них!

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

.PHONY: clean    
clean:
    $(clean)
13
ответ дан 23 November 2019 в 21:37
поделиться

Одна хитрость, которая раньше описывалась в руководстве по Sun для make , - это использование (несуществующей) цели «.FORCE». Вы можете сделать это, создав файл force.mk, содержащий:

.FORCE:
$(FORCE_DEPS): .FORCE

Затем, если ваш существующий make-файл называется makefile , вы можете запустить:

make FORCE_DEPS=release -f force.mk -f makefile release

Так как .FORCE ] не существует, все, что от него зависит, будет устаревшим и перестроенным.

Все это будет работать с любой версией make ; в Linux у вас есть GNU Make и, следовательно, вы можете использовать цель .PHONY, как обсуждалось.

Также стоит подумать, почему make считает выпуск актуальным. Это может быть потому, что у вас есть команда touch release среди выполненных команд; это может быть связано с тем, что существует файл или каталог с именем 'release', который существует и не имеет зависимостей и поэтому является актуальным. Тогда есть настоящая причина ...

15
ответ дан 23 November 2019 в 21:37
поделиться

Если я правильно помню, 'make' использует временные метки (время изменения файла), чтобы определить, актуальна ли цель. Распространенным способом принудительного пересоздания является обновление этой метки времени с помощью команды «touch». Вы можете попробовать вызвать «touch» в вашем make-файле, чтобы обновить временную метку одной из целей (возможно, одного из этих подфайлов), что может заставить Make выполнить эту команду.

4
ответ дан 23 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: