Ответы пользователя по тегу GNU Make
  • Как исправить ошибку в MakeFile?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ругается на g++ -I $(INCL) $(SRCS) -o $(TARGET), как можно исправить?

    Заменить пробелы в начале строки одним табом. Команды в makefile начинаются с табов.
    Ответ написан
    Комментировать
  • Makefile не правильно раскрывает переменные, почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    SRC_DIR := src/brick_game/tetris # Папка с исходным кодом

    вот из этой строки нужно убрать все пробелы после слова tetris. Потому что иначе они попадают в переменную SRC_DIR. Комментарий можно оставить только впритык. Это же относится и к определениям остальных переменных.
    Ответ написан
    2 комментария
  • Почему появляется ошибка make: *** [Makefile:15: leak] Ошибка 1 при выполнении Makefile на C?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    make: *** [Makefile:15: leak] Ошибка 1

    В linux это код ошибки "нет доступа". Начни с проверки что $(NAME) доступен для чтения и выполнения.
    Кроме того, для полноты картины стоит показывать полный лог выполнения команды make, а не только последнее сообщение об ошибке.
    Ответ написан
  • Как создать правило make для компиляции списка .c в список .out?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У меня имеется список исходных файлов и список файлов в которые они должны быть скомпилированы.

    SRCS = ./a/prog1.c ./a/b/prog2.c ./a/b/c/prog3.c
    OUTS = ./outs/prog1.out ./outs/prog2.out ./outs/prog3.out

    Это не очень удачная конфигурация, в том смысле, что немного изменив условия можно сильно упростить Makefile, но если очень хочется именно такого, то можно сделать так:

    .PHONY: all
    
    SRCS = ./a/prog1.c ./a/b/prog2.c ./a/b/c/prog3.c
    OUTS = ./outs/prog1.out ./outs/prog2.out ./outs/prog3.out
    
    all: $(OUTS)
    
    define make_rule =
    $(firstword $(1)): $(firstword $(2))
            @echo compile $$< to $$@
            gcc $$< -o $$@
    $(if $(wordlist 2,$(words $(1)),$(1)),
         $(eval $(call make_rule,
                       $(wordlist 2,$(words $(1)),$(1)),
                       $(wordlist 2,$(words $(2)),$(2)))))
    endef
    
    $(eval $(call make_rule,$(OUTS),$(SRCS)))


    Здесь происходит вот что: макрос make_rule принимает на вход два списка, создаёт правило, что первое слово из первого списка зависит от первого слова из второго списка, а потом вызывает сам себя со списками из которых удалены первые слова, если эти списки не пустые.
    Ответ написан
    6 комментариев
  • Почему не получается скомпилировать файл через wsl на c?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    make mario.c

    говорит, что нужно собрать mario.c, но собирать ведь надо не его, mario.c -- это исходник. Пиши make mario чтобы собрать mario из mario.c. И да, это работает без Makefile за счёт втроенных в make правил только для таких простых случаев. Для более сложных надо будет писать Makefile.
    Ответ написан
    2 комментария
  • Как правильно подключать make-файл из одной директории к make-файлу из другой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    зачем с помощью инклуда в Makefile_a указывать путь к Makefile_aa, и во втором указывать тоже путь к файлам как будто это делаеться из Makefile_a?

    затем, что нет никакой магии в подключении одного Makefile в другой, это просто текстовая подстановка, точно такая же, как если ты физически перенесёшь текст второго Makefile в то место первого где написан include.
    Ответ написан
    Комментировать
  • Почему не собирается EFI application?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    пишет, что не может найти "efi.h", хотя он есть в папке inc из Makefile

    что такое "папка inc из Makefile"? Если ты имеешь в виду переменную inc определённую в 7й строке, то ты её нигде не использовал, а сами по себе переменные с произвольными именами в Makefile ничего не значат.

    gcc -fshort-wchar -I -I/ -I/usr/include -O2 -Wall -fpic -DEFI_FUNCTION_WRAPPER -ffreestanding -nostdlib -c main.c -o main.o
    main.c:1:10: фатальная ошибка: efi.h: Нет такого файла или каталога

    смотри: нигде в списке -I ты не указал своего каталога inc, как по-твоему компилятор должен понять, что efi.h нужно там искать?

    -I$(EFIINC)

    В твоём Makefile не определена переменная EFIINC, откуда ты ожидаешь что она возьмётся?

    Судя по содержимому Makefile стоит заменить имя inc на EFIINC, lib на EFILIB, crtobj на CRTOBJ и т. д.
    Ответ написан
  • Как использовать одну переменную в нескольких make файлах?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У меня есть два make-файла, первый вызывает второй.
    Мне хотелось бы получить некоторые данные из второго make-файла.

    Не предусмотрено такое логикой make, разве что через eval это можно накостылить. Обычно, когда нужна тесная связь между разными Makefile, один из них подключают в другой (и получают большой логический Makefile поделённый на несколько файлов).
    Ответ написан
    Комментировать
  • Почему вылезает сообщение "make: «build» не требует обновления"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему вылезает сообщение «make: «build» не требует обновления»?

    ну и для ответа на оригинальный вопрос: потому что правило
    build: $(SOURCES)

    говорит, что каталог build зависит только от исходных файлов. Команды mv *.o ./build и rm -rf build/* делают его новее исходников, поэтому make считает, что обновлять его не надо.
    Ответ написан
    Комментировать
  • Как запустить эмулятор?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Помогите разобраться - хотя бы куда копать

    В mingw нет функции setenv.
    Возможные варианты действий:
    - посмотреть зачем эта функция используется и нельзя ли её заменить на что-нибудь другое;
    - собирать не под mingw а под что-нибудь другое (нативно/под WSL/под cygwin);
    - посмотреть не зарепорчен ли этот баг другими пользователями этого эмулятора, зарепортить если нет, посмотреть что скажут.

    Я посмотрел в код, можно поменять в файле SCP/sim_extension.c строку 4345 с #if defined (_MSC_VER) на #if defined (_MSC_VER) || 1.
    Ответ написан
    Комментировать
  • Как сделать аргументы цели в Makefile?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Логичнее всего передавать параметры цели через переменную. Типа того:
    $ cat Makefile
    CONTAINER ?= all
    restart:
            @echo 'Restarting $(CONTAINER)'
    $ make restart
    Restarting all
    $ make restart CONTAINER=web
    Restarting web
    Ответ написан
    2 комментария
  • [SOLVED] Makefile + чтение значения переменной из консоли + dch - как это сделать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    dch -v $$VERSION
    должно работать.
    Потому что
    export VERSION=$(shell read -p "Version: ";echo $$REPLY)
    экспортирует переменную внутри shell, а $(VERSION) ссылается на переменную make а не на переменную shell.

    Как вариант, подойдет `make dchv 1.3.4` , но научить makefile такое делать - лютый геморрой :(

    не нужно этого делать, потому что это "против шерсти". Правильнее было бы сделать так: make dchv VERSION=1.3.4 и выкинуть код по вводу переменной VERSION из правила dchv, т.е. оставить только dch -v $(VERSION)
    Ответ написан
    2 комментария
  • Как настроить make install для проекта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    создал мэйк файл с помощью утилиты autotools. все получилось кроме настройки make install.

    Читать главы install и the uiform naming scheme мануала automake

    дополнительные папки с конфигами и картинками.

    Если они вписываются в стандарт использования файловой системы, то добавить их в data_DATA. Если не вписываются -- добавить своё правило install-data-local.
    Ответ написан
  • Как писать makefile?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как бы Вы написали в makefile если бы у Вас имелось 0.c 1.c 2.c 3.h? Заголовочник 3.h для всех исходников


    OBJS := 0.o 1.o 2.o                     # список объектников, который нам понадобится в двух местах
    all: exe                                # традиционно сборка всего называется all. all зависит от единственного файла: exe
    exe: $(OBJS)                            # файл exe зависит от объектникоа
            $(CC) $(LDFLAGS) -o $@ $^       # чтобы собрать exe -- вызвать компилятор, передать ему LDFLAGS, выводить в $@ (т.е. в exe), на вход брать $^ (т.е. всё от чего зависит $@)
    %.o: %.c 3.h                            # объектники зависят от исходников с таким же именем, а так же от 3.h
            $(CC) -c $(CFLAGS) -o $@ $<     # чтобы собрать объектник -- вызвать компилятор с ключом -c, передать ему CFLAGS, выводить в $@ (т.е. в %.o), компилировать $< (т.е. %.с с тем же именем)
    clean:                                  # традиционно очистка всего называется clean
            -rm -f $(OBJS) exe              # для очистки удалить объектники и exe
    .PHONY: all clean                       # all и clean -- это не файлы
    Ответ написан
    1 комментарий
  • Makefile не могу понять в чем ошибка убираю условие переходит на другое?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В языке make нет конструкции if .... Есть всякие другие. Вам, похоже, подойдёт ifdef ...

    if ... есть в языке automake, но чтобы получить рабочий Makefile, исходный Makefile.am нужно прогнать через automake, а получившийся Makefile.in нужно прогнать через configure.
    Ответ написан
    Комментировать
  • Дублирование кода в целях makefile, как избежать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как мне избавится от дублирования кода, который одинаковый для нескольких целей, однако, отличается именами файлов(пусть имена файлов совпадают с названием целей)?

    Можно написать макрос-генератор целей. Изменяющиеся параметры можно передать как параметры макроса, внутри на них можно ссылаться по номеру. Например так:

    define generate-targets
    $(1): 
     make -j5 TARGET=unwired BOARD=$$(BOARD)/$$(CPU) -f makefiles/Makefile.$$@
     ../bootloader/generate-metadata/generate-metadata $$@.bin 0x0 0x01A00001 1
     srec_cat firmware-metadata.bin -binary $$@.bin -binary -offset 0x100 -o $$@-ota-image.bin -binary
     rm $$@.hex
    
    $(1)-fb: $(1)-CLEAN
      ../../tools/backdoor-bootloader.py -e -w -v $(1)-firmware.hex
    
    $(1)-f: $(1)-CLEAN
     /Applications/ti/Uniflash/flash_cc1310.sh $(1)-firmware.hex 
    
    $(1)-ota: $(1)
     scp $(1)-ota-image.bin root@192.168.20.187:/root/unwired_smarthome
    
    endef


    Внутри макроса нужно экранировать $ заменяя его на $$.
    Этот макрос можно вызывать в нужном месте следующим образом:

    $(eval $(call generate-targets,ubrige))

    Сгенерированный в этом месте код будет эквивалентен коду из вопроса.
    Ответ написан
    Комментировать
  • Как добавить ключ в configure и подключить дополнительные пакеты?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Сделал ровно то, что вы описали ( https://gist.github.com/jcmvbkbc/f8d64eadb76b83ecf... ), всё работает.
    Вопросы:
    - Makefile.foo.include -- это файл того же вида, что и Makefile.am, верно?
    - autoreconf выполнили после редактирования configure.ac и Makefile.am?
    Ответ написан
  • Несовместимость gnu make 3.81 и 4.2.1. Как разрешить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    файл FreeRTOS_for_stm32f2/FreeRTOS.h откоторого зависят все цели в следующем правиле не существует:
    build/obj/%.obj:        %.cpp $(USER_CFG_H_FILE) $(FREE_RTOS_H_FILE)


    Чтобы заработало должно быть
    FREE_RTOS_H_FILE        := FreeRTOS_for_stm32f2/include/FreeRTOS.h

    вместо
    FREE_RTOS_H_FILE        := FreeRTOS_for_stm32f2/FreeRTOS.h
    Ответ написан
  • Почему не работает make для другого каталога?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему так происходит?

    Потому что вы что-то делаете неправильно.

    Если серьёзно -- то как вы хотите, чтобы мы поняли, что у вас происходит, если вы не дали нам никакой полезной информации? Makefile покажите, что ли.
    Ответ написан
    1 комментарий
  • Как использовать bash внутри Makefile?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вариант решения для оригинального вопроса: добавить в Makefile строчку
    SHELL = /bin/bash
    Ответ написан