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 не сначала файла, если цель не одна, а с определенного места, указанного целью.

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



Последнее исправление: Assembler (всего исправлений: 1)

По дефолту цель — это файл. То, что не файл, перечисляется в PHONY.

это зарезервированое слово? утилита make его знает?

Нет.

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

то есть цель-это то что будет созданно? значит


tgc: m.c
     gcc m.c


будет создан выходной файл не с именем a.out , а tgc?

Assembler
() автор топика

или в роли 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
()
Ответ на: комментарий от anonymous

могу созадть makefile, но понять его логику не могу. поэтому прошу помощи

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

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

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

Правила ничего не создают

Странно, а у меня работает:

$ ls
m.c

$ echo m: m.c > makefile; make
cc     m.c   -o m

$ ls
m  makefile  m.c
anonymous
()
Ответ на: комментарий от Assembler

Я злой и тебе рано понимать. Прими это как данность. Не «если».

А рецепт должен создавать цель.

Точка.

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

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

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

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

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



tgc: m.c

    gcc m.c 

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

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

Встречная предъява

$ echo m: m.c > makefile; make

Лишнее. Makefile не нужен. make m отработает также без makefile

Вопрос: почему?

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

вы поможете мне разобраться или сначала мне надо помочь вам, чтобы помом вы помогли мне?

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
() автор топика
Ответ на: комментарий от anonymous

О, прикольно. Но в мане почему-то ничего по этому поводу нет:

To prepare to use make, you must write a file called the makefile

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

у вас какая версия компилятора?

Не зли меня! Компилятор тут, вообще, не при делах.

anonymous
()
Ответ на: комментарий от 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 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.