Чому ви вважаєте, що ціль актуальна?


223

Це мій Makefile:

REBAR=./rebar
REBAR_COMPILE=$(REBAR) get-deps compile

all: compile

compile:
    $(REBAR_COMPILE)

test:
    $(REBAR_COMPILE) skip_deps=true eunit

clean:
    -rm -rf deps ebin priv doc/*

docs:
    $(REBAR_COMPILE) doc

ifeq ($(wildcard dialyzer/sqlite3.plt),)
static:
    $(REBAR_COMPILE) build_plt analyze
else
static:
    $(REBAR_COMPILE) analyze
endif

Я можу бігати make compileкілька разів і діставати

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make compile
./rebar get-deps compile
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)

Однак чомусь біг make testзавжди дає

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make test
make: `test' is up to date.

навіть якщо файли не зібрані. Питання в тому, чому?

Запуск тієї ж команди безпосередньо працює:

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ ./rebar get-deps compile skip_deps=true eunit
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)
Compiled src/sqlite3_lib.erl
Compiled src/sqlite3.erl
==> erlang-sqlite (eunit)
...

Відповіді:


459

Можливо, у вас в каталозі є названий файл / testкаталог. Якщо цей каталог існує і не має останніх залежностей, то ця мета не буде перебудовуватися.

Щоб змусити перебудовувати ці цілі, не пов’язані з файлами, слід зробити їх такими фальшивими:

.PHONY: all test clean

Зауважте, що ви можете оголосити там усі свої хибні цілі.


2
У мене був каталог під назвою build та інший під назвою lib. Заднім числом це не ідеальні назви цілей. Тьфу ..... зробити.
MattD

9
* Де all, testі clearякі ваші цільові назви makefile
ThorSummoner

Ще одне рішення - це зміна етикетки. У вашому випадку змініть testна test_ruleщось інше.
аурахам

@MattD так це я, це проблема для виготовлення?
gromit190

@Birger, якщо у вас є цілі, які ви хочете викликати на зразок "make build" і "make lib", і у вас є ці каталоги, тоді вам потрібно буде використовувати цю стратегію або подібну їй.
МтД

34

РЕДАКТУВАННЯ: Це стосується лише деяких версій make- ви повинні перевірити сторінку чоловіка.

Ви також можете передати -Bпрапор make. Відповідно до чоловічої сторінки, це:

-B, --always-make Безумовно складайте всі цілі.

Таким чином make -B test, ви вирішите вашу проблему, якщо ви опинилися в ситуації, коли ви не хочете редагувати Makefileабо змінювати назву тестової папки.


-Bдля мене режим, сумісний із зворотним ходом ... (Набір інструментарію FreeBSD, OS / GNU, здається, не вказано)
Герт ван ден Берг

О цікаво ... Чи --always-makeпрацює для вас?
jamesc

Ні. .PHONYМета здається вид портативного , хоча ... (Принаймні , на FreeBSD, не впевнений , про те , як Solaris)
Герт ван ден Берг

1
Це не відповідає меті зробити - автоматично визначити, які фрагменти програми потрібно відновити після зміни. Якщо вашому makefile потрібна --always-makeможливість працювати, ваш makefile порушується.
osvein

1
@GertvandenBerg .PHONY буде частиною випуску 8 стандарту POSIX austingroupbugs.net/view.php?id=523
osvein


1

моєю помилкою було введення цільового імені "filename.c:" замість просто "filename:"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.