LINUX.ORG.RU

makefile

 


0

1

здрасьте здрасьте люди добрые

помогите пожалуйста разобраться с makefile

.PHONY: all
all: m.c
    gcc m.c

скажите пожалуйста all -это зарезервированое слово? утилита make его знает? или в роли all может выступить любой набор букв?

tgc: m.c
    gcc m.c

и еще непонятно, tgc -это цель. после make должен появиться файл с именем tgc?

или цель служит для того чтобы можно было сделать make tgc , то есть запустить make не сначала файла, если цель не одна, а с определенного места, указанного целью.

какая роль цели?

или в роли all может выступить любой набор букв?

Первая цель в makefile - это цель по умолчанию (кроме спец. целей). Если про цель по умолчанию, то да, в роли all может выступить любой набор букв.

anonymous ()
Ответ на: комментарий от Assembler

Завит от того, что подразумевается под tgc.

Файл с таким названием, конечно, создан не будет. Если тебе нужно указать имя результирующего файла, то это параметр -o <name> для gcc.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

ребята, я пытаюсь понять как работает make. нашел описание, и там заявленно, что цель должна породить файл с именем , что имела цель. у меня же появляется файл в итоге с именем a.out и я не могу понять почему. ведь сказанно же в описании , что файл должен будет иметь имя какое было указанно в цели. то есть цель пораждает файл . так что я просто не могу понять где туплю

Assembler ()
Ответ на: комментарий от Assembler

Правила в makefile target: prereqs ничего не создают. Это просто правила - из чего что можно сделать. Что-то создать могут рецепты, то что с tab в начале. Если эти рецепты создают «цель», то это очень логично.

gcc -o tgc m.c, или gcc -o $@ m.c, где $@ - это цель для рецепта

anonymous ()
Ответ на: комментарий от Assembler

make не создаёт файлы, строго говоря, он вообще ничего не делает. Это лишь способ организации скриптов для сборки, который помогает разруливать зависимости. Сценарий, который создаст файл для конкретной цели ты должен написать сам.

tgc: m.c
    gcc m.c -o tgc
WitcherGeralt ★★ ()
Ответ на: комментарий от WitcherGeralt

это я понимаю.

знаю что make -это утилита. знаю что она будет руководстоваться makefileлом.

понимаю, что есть в makefile цель, есть реквизиты, есть команды, и команды пишутся от TAB

если цель -это файл, а не реквизит, то есть



tgc: m.c

    gcc m.c 

тут tgc -цель m.c-реквизиты. но реквизит также может быть целью. и вот если tgc -это файл, то какого его назначение? повлияет ли имя цели на имя исполняемого файла?

Assembler ()
Ответ на: комментарий от Assembler

повлияет ли имя цели на имя исполняемого файла?

Нет, как задать имя тебе уже показали.

то какого его назначение?

Цель может выступать в роли зависимости. Вот пример:


foo: bar baz
    cat bar > foo
    cat baz >> foo

bar:
    echo 1 > bar

baz:
    echo 2 > baz


Если ты вызовешь make foo, сначала создастся bar, затем baz, затем foo.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 2)
Ответ на: комментарий от WitcherGeralt

то есть самая первая цель будет главной. все остальные цели , что будут описаны ниже будут выступать лишь как реквизиты для главной цели, хоть они и сами являются целями? так?

Assembler ()
Ответ на: комментарий от Assembler

то есть самая первая цель будет главной.

Нет; вызов make foo создаст не только foo, но и bar с baz лишь постольку, поскольку bar и baz прописаны как зависимости foo. Порядок перечисления целей неважен: можно сначала написать правила для bar и baz, потом для foo, на make foo это не повлияет. Кроме того, можно сказать make bar либо make baz и получить bar и baz соответственно (вообще не вспоминая про foo).

dexpl ★★★★★ ()
Ответ на: комментарий от anonymous

Это просто информационная строчка на отъе…сь для таких же, как ТС.

Лучше обрати внимание на

       -r, --no-builtin-rules
            Eliminate  use  of  the  built-in implicit rules.  Also clear out the
            default list of suffixes for suffix rules.
anonymous ()
Ответ на: комментарий от Assembler

В данном случае да. Но они могут быть и самостоятельными. И даже главная цель может выступать в качестве зависимости для какой-то другой.

Например:

  • clean — может чистить артефакты и ничего не создавать.
  • all — всё соберёт.
  • install — всё соберёт с помощью all, а затем разложит по системным каталогам.
WitcherGeralt ★★ ()