Каковы преимущества использования `make` для небольших проектов? [закрыто]


8

Я видел, что makeэто полезно для больших проектов, особенно с запутанными зависимостями, описанными в Makefile, а также помогает с рабочим процессом. Я не слышал никаких преимуществ для использования makeдля небольших проектов. Есть ли такие?


2
оптимизм для роста? :) хорошие привычки? Это может отклониться от мнений.
Джефф Шаллер

типа, makeчтобы узнать ответ. сделайте приличный шаблон Makefile и просто отредактируйте переменную его исходных файлов. нет необходимости вводить весь этот джаз.
user2497

это своего рода кошмар для крупных проектов, поэтому, честно говоря, я бы сказал, что они хороши только для небольших проектов;)
Eevee

Я мог бы использовать make-файлы, но я не делаю. Я разделил исходный код моего самого большого (личного) проекта на 10 файлов, перекомпилировал первый, и у первого есть #include для остальных девяти. Со скоростью перекомпиляции, для меня не имеет значения, будет ли все это перекомпилироваться каждый раз.
Дженнифер

1
Laziness :-) makeнамного быстрее команды для ввода, чем большинство других, даже если вы не создаете умный Makefile для
Стивен Харрис

Ответы:


11

В отличие от чего?

Предположим, у вас есть программа, которую вы разделили на два файла, которые вы назвали образно file1.cи  file2.c. Вы можете скомпилировать программу, запустив

cc file1.c file2.c -o yourprogram

Но для этого нужно каждый раз перекомпилировать оба файла, даже если изменился только один. Вы можете разложить шаги компиляции на

cc -c file1.c
cc -c file2.c
cc    file1.o file2.o -o yourprogram

и затем, когда вы редактируете один из файлов, перекомпилируйте только этот файл (и выполните этап связывания, независимо от того, что вы изменили). Но что, если вы редактируете один файл, а затем другой, и вы забываете, что вы редактировали оба файла и случайно перекомпилировали только один?

Кроме того, даже для всего двух файлов у вас есть команды примерно на 60 символов. Это быстро становится утомительным, чтобы напечатать. Хорошо, конечно, вы можете поместить их в скрипт, но потом вы снова будете перекомпилировать. Или вы можете написать действительно причудливый, сложный скрипт, который проверяет, какие файлы были изменены, и выполняет только необходимые компиляции. Вы видите, куда я иду с этим?


Для очень маленьких проектов, gcc -O3 -march=native -fwhole-program *.c это в основном хорошо для цикла редактирования / компиляции / профиля. Но вы все еще хотите Makefile для использования другими людьми. Возможность использовать -fwhole-program- интересное преимущество компиляции всего вместе, но -fltoобычно дает вам почти такие же оптимизации.
Питер Кордес

2
Как только я начинаю добавлять ключи в командную строку компилятора (даже для одного исходного файла), мне становится сложно запоминать их в следующий раз. Иногда я просто помещаю комментарий в исходный файл, но в этот момент я должен просто использовать Makefile ...
Roger Lipscombe

@ger Lipscombe: И если вам нужно компилировать для разных сред, это так же просто, как определить несколько макросов в вашем make-файле. И, проявив немного творческого подхода, вы можете подключить команду make к функциональной клавише editior, записать вывод в файл и использовать другую клавишу, чтобы поставить вас в положение любых ошибок ...
jamesqf

15

Многие другие люди разбираются в деталях более сложных make-файлов и многих сложностях, которые с ними связаны. Я обычно использую make-файлы по совершенно другой причине:

Я не хочу ничего вспоминать.

Даже если ваш проект действительно скучный и простой, и вы не используете make-файлы «правильно»:

all:
    gcc main.c -o project

Мне не нужно думать об этом или относиться к этому иначе, чем к более сложному проекту:

all:
    gcc libA.c libB.c main.c -o project2

Или, если я указал флаги (например -O2), мне не нужно помнить, что они были.

Кроме того, если вы начинаете с простого make-файла, и вам нужно объединить / реорганизовать вещи позже, вам не нужно помнить, чтобы создавать каждый проект по-разному.


Я использую make-файлы даже в некомпилированных проектах. Я создаю «фальшивые» правила, которые запускают сложные команды, относящиеся только к соответствующему каталогу. Например: очистка, установка в правильные места, установка образов докера. Это просто облегчает.
Энтони

5

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


3

Если вы связываете свое приложение из 2 источников ( .cфайлов), вам не нужно перекомпилировать каждый файл, а только измененный, если вы используете make.

Также я приведу пример из мира BSD. Они имеют каркас системных файлов Makefile. Они предоставляют вам пути к системным каталогам и имеют цели для установки программного обеспечения и страниц справочника.

Например, вы только что написали beer.cприложение и мануал для него назвали beer.6. Вы создаете Makefile:

PROG=   beer
MAN=    beer.6

.include <bsd.prog.mk>

..и позвони make install. Он автоматически компилирует и устанавливает ваше приложение, /usr/binкомпилирует и устанавливает вашу справочную страницу в место, где его manможно найти. Вы только что установили свое приложение одной простой командой!

Очень удобно и абсолютно прозрачно для всех, кто знаком с BSD. Гораздо лучше, чем ручной сценарий.


1

Пример Makefileдля моего очень маленького проекта:getPixelColor

Он делает именно то, что говорит его имя, принимая два необязательных аргумента, координаты.

Мне особенно нравится, как все становится зависимым.

COORDS ?= 0 0

CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f

BIN := getPixelColor
SRC := $(BIN).cpp

$(BIN): $(SRC)
    $(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)

.PHONY: clean
clean:
    $(RM) $(BIN)

.PHONY: run
run: $(BIN)
    ./$(BIN) $(COORDS)

Как видите, он может делать все, что вам нужно, не вводя ничего лишнего:


Применение

Вы можете запустить его следующими способами:

  1. Очистить старый бинарный файл:

    make clean
  2. Скомпилируйте новый бинарный файл:

    make
  3. Запустите исполняемый файл двумя способами:

    • координаты по умолчанию [0,0]

      make run     # equals COORDS='0 0'
    • любые заданные координаты

      COORDS='5 6' make run

Makefiles могут быть чрезвычайно полезны время от времени. Чем больше проект, тем больше выгода. Но даже при этом мой самый маленький C ++ проект, как вы можете видеть на примерах, избавляет вас от головной боли.


0

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

Возьмите проект, который не требует компиляции, например. Я вспоминаю, как работал над проектом Python, в котором была команда make для очистки всех .pycфайлов, команда make для запуска тестов, команда для загрузки копии статических данных с сервера разработки и т. Д.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.