Перейти к содержанию
    

Сборка проекта при помощи makefile в windows 11

Хочу научиться собирать проекты при помощи утилиты make. Для примера взял проект с гитхаба с уже написанным makefile:

https://github.com/KerJoe/ORTD2662?tab=readme-ov-file 

Установил gcc-13.2.0-64.exe, создал переменную среды PATH и указал в ней путь до папки с make.exe. Проверяю поставилось ли:

Спойлер

d:\ORTD2662-master>make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-pc-mingw32

Запускаю утилиту make из папки, в которой находится makefile:

Спойлер

d:\ORTD2662-master>make
gcc ./alien/adjust_.c -I. -MMD -ggdb3 -o output_native/adjust_.o -c
process_begin: CreateProcess(NULL, gcc ./alien/adjust_.c -I. -MMD -ggdb3 -o output_native/adjust_.o -c, ...) failed.
make (e=2): Не удается найти указанный файл.
make: *** [output_native/adjust_.o] Ошибка 2

Пробую запустить с параметром -d, минуту получаю вывод отладочной информации такого типа:

Спойлер

       Попытка применения правила с образцом, основа `adjust_'.
       Попытка применения неявной зависимости `adjust_.l'.
       Поиск правила с промежуточным файлом `adjust_.l'.
        Избежание рекурсивного вызова неявного правила.
        Попытка применения правила с образцом, основа `adjust_.l'.
        Попытка применения неявной зависимости `adjust_.l,v'.
        Попытка применения правила с образцом, основа `adjust_.l'.
        Попытка применения неявной зависимости `RCS/adjust_.l,v'.
        Попытка применения правила с образцом, основа `adjust_.l'.
        Попытка применения неявной зависимости `RCS/adjust_.l'.
        Попытка применения правила с образцом, основа `adjust_.l'.
        Попытка применения неявной зависимости `s.adjust_.l'.
        Попытка применения правила с образцом, основа `adjust_.l'.
        Попытка применения неявной зависимости `SCCS/s.adjust_.l'.
       Попытка применения правила с образцом, основа `adjust_'.
       Попытка применения неявной зависимости `adjust_.w'.
       Поиск правила с промежуточным файлом `adjust_.w'.
        Избежание рекурсивного вызова неявного правила.
        Попытка применения правила с образцом, основа `adjust_.w'.
        Попытка применения неявной зависимости `adjust_.w,v'.
        Попытка применения правила с образцом, основа `adjust_.w'.
        Попытка применения неявной зависимости `RCS/adjust_.w,v'.
        Попытка применения правила с образцом, основа `adjust_.w'.
        Попытка применения неявной зависимости `RCS/adjust_.w'.
        Попытка применения правила с образцом, основа `adjust_.w'.
        Попытка применения неявной зависимости `s.adjust_.w'.
        Попытка применения правила с образцом, основа `adjust_.w'.
        Попытка применения неявной зависимости `SCCS/s.adjust_.w'.
       Попытка применения правила с образцом, основа `adjust_'.
       Отвержение невозможной неявной зависимости `adjust_.w'.
       Не найдено неявного правила для `adjust_.c'.
       Обновление целей, от которых зависит целевой файл `adjust_.c', завершено.
      Нет необходимости пересобирать цель `adjust_.c'.; используется VPATH-имя `./alien/adjust_.c'.
     Обновление целей, от которых зависит целевой файл `output_native/adjust_.o', завершено.
    Необходимо пересобрать цель `output_native/adjust_.o'.
gcc ./alien/adjust_.c -I. -MMD -ggdb3 -o output_native/adjust_.o -c
CreateProcess(NULL,gcc ./alien/adjust_.c -I. -MMD -ggdb3 -o output_native/adjust_.o -c,...)
process_begin: CreateProcess(NULL, gcc ./alien/adjust_.c -I. -MMD -ggdb3 -o output_native/adjust_.o -c, ...) failed.
Помещение потомка 0x02a91728 (output_native/adjust_.o) PID 44860504 в цепочку активных потомков.
Незавершенный потомок 0x02a91728 (output_native/adjust_.o) PID 44860504
Main thread handle = 0x000001f8
make (e=2): Не удается найти указанный файл.
Подбираю неудачно завершившегося потомка 0x02a91728 PID 44860504
make: *** [output_native/adjust_.o] Ошибка 2
Removing child 0x02a91728 PID 44860504 from chain.

Пробую запустить в visual studio 2022:

Спойлер

image.png.42790202a5f6b67866e4cd87d2274c8c.png

Сам makefile и его содержание: Makefile (в файле путь до утилиты изменен мною на верный)

Спойлер

ifeq ($(OS),Windows_NT) # Windows tools
PATH:=C:\Program Files (x86)\GnuWin32\bin:${PATH}
RMDIR = -cmd /C rd /S /Q # Ignore "cannot find the file" error
EXEC = .exe
else # POSIX tools
RMDIR = rm -rf
EXEC =
endif

# Add all subdirectories 1 level deep into make search path
VPATH =  $(wildcard ./*/)
# Compile all .c files in directories
SRCFILES := $(wildcard ./*/*.c)
# File that has the main() function
MAINFILE := core/main.c
#
PROGRAMMER := python3 ../RTDMultiProg/rtdmultiprog.py -i i2cdev -d 2 -w


# Native compiler
ifeq ($(OS),Windows_NT) # Windows tools
NATIVE_PKGCFG    =
NATIVE_CC        = gcc
NATIVE_CFLAGS      = -I. -MMD -ggdb3
NATIVE_LDFLAGS   = -Lcore -lch341
NATIVE_OUTPUTDIR = output_native
else
NATIVE_PKGCFG    = pkg-config
NATIVE_CC        = gcc
NATIVE_CFLAGS      = -I. -MMD -ggdb3 $(shell $(NATIVE_PKGCFG) --cflags python3-embed)
NATIVE_LDFLAGS   = $(shell $(NATIVE_PKGCFG) --libs python3-embed)
NATIVE_OUTPUTDIR = output_native
endif

NATIVE_OBJFILES := $(addprefix $(NATIVE_OUTPUTDIR)/, $(notdir $(SRCFILES:.c=.o)))
NATIVE_DFILES   := $(addprefix $(NATIVE_OUTPUTDIR)/, $(notdir $(SRCFILES:.c=.d)))

native: $(NATIVE_OUTPUTDIR) $(NATIVE_OUTPUTDIR)/native$(EXEC)

$(NATIVE_OUTPUTDIR):
    mkdir $(NATIVE_OUTPUTDIR)

$(NATIVE_OUTPUTDIR)/native$(EXEC): $(NATIVE_OBJFILES)
    $(NATIVE_CC) $^ $(NATIVE_CFLAGS) $(NATIVE_LDFLAGS) -o $@

$(NATIVE_OUTPUTDIR)/%.o: %.c
    $(NATIVE_CC) $< $(NATIVE_CFLAGS) -o $@ -c


# Firmware compiler
SDCC_CC        = sdcc
SDCC_CFLAGS    = -I. -MMD --model-large --stack-auto
SDCC_LDFLAGS   = --xram-loc 0xFB00 --xram-size 640
SDCC_OUTPUTDIR = output

# Remove _.c files
SDCC_SRCFILES := $(filter-out %_.c, $(SRCFILES))
SDCC_RELFILES := $(addprefix $(SDCC_OUTPUTDIR)/, $(notdir $(SDCC_SRCFILES:.c=.rel)))
SDCC_DFILES   := $(addprefix $(SDCC_OUTPUTDIR)/, $(notdir $(SDCC_SRCFILES:.c=.d)))

firmware: $(SDCC_OUTPUTDIR) $(SDCC_OUTPUTDIR)/firmware.bin

$(SDCC_OUTPUTDIR):
    mkdir $(SDCC_OUTPUTDIR)

$(SDCC_OUTPUTDIR)/firmware.hex: $(SDCC_RELFILES)
    $(SDCC_CC) $^ $(SDCC_CFLAGS) $(SDCC_LDFLAGS) -o $@

$(SDCC_OUTPUTDIR)/firmware.bin: $(SDCC_OUTPUTDIR)/firmware.hex
    makebin $(SDCC_OUTPUTDIR)/firmware.hex $(SDCC_OUTPUTDIR)/firmware.bin

$(SDCC_OUTPUTDIR)/%.rel: %.c
    $(SDCC_CC) -o $@ -c $(SDCC_CFLAGS) $<


all: native firmware

program: $(SDCC_OUTPUTDIR)/firmware.bin
    $(PROGRAMMER) "$(CURDIR)/$(SDCC_OUTPUTDIR)/firmware.bin"

clean:
    $(RMDIR) $(NATIVE_OUTPUTDIR)
    $(RMDIR) $(SDCC_OUTPUTDIR)

# Include dependency target files
-include $(NATIVE_DFILES)
-include $(SDCC_DFILES)
 

Не могли бы вы посоветовать что я делаю не так?

 

 

 

Изменено пользователем Turgenev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я понимаю, не находит путь к тулчейну GCC. 

Видимо, он стоит не в C:\Program Files (x86)\GnuWin32\bin, как указано в первой строке

make работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, andrew_b сказал:

Скажите, по какой причине вы запостили текст картинками?

Привычка. Исправил. Как копировать из консоли VS не знаю.

5 минут назад, MrYuran сказал:

Видимо, он стоит не в C:\Program Files (x86)\GnuWin32\bin, как указано в первой строке

Да вроде только там он и стоит, вот скрин из проводника:

Спойлер

image.thumb.png.fd9297db93102990d0630c039d744adf.png

В переменных среды указал точно такой же путь:

Спойлер

image.thumb.png.75b6eecd255e307adb049d1376912271.png

Что можно сделать, как узнать или указать системе где утилита?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это make, он работает.

А дальше вызывает GCC из этой же папки. А его там нет

Обычно тулчейны выглядят вот так:

1808544809_.PNG.873faf5adfb1e652c4f96fa9dc30d17c.PNG

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, MrYuran сказал:

А дальше вызывает GCC из этой же папки. А его там нет

Действительно. В makefile надо было указать путь не к утилите, а к компилятору, исправил, спасибо!

 

Изменено пользователем Turgenev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

58 minutes ago, Turgenev said:

Установил gcc-13.2.0-64.exe

18 minutes ago, Turgenev said:

fatal error: sys/ioctl.h: No such file or directory

Для целей "научиться общаться с make'ом" рекомендую нагуглить какой-нибудь другой пример. Желательно чтоб там прямо в описании было написано, что это makefile examples, а не вот это вот "an unsuccessful attempt".

Для целей "глубоко разобраться в отличиях POSIX и WinAPI" рекомендую гуглить в сторону "cannot find sys/ioctl.h on MinGW compiler". Но это трудный путь, я сам туда далеко не ходил.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понял, что ioctl нет в gcc. Почитав интернет, поставил cygwin. Пробую собрать через него.

Продвинулся дальше, но возникла ошибка не знает параметра -lch341:

Спойлер

output_native/scaling.o -I. -MMD -ggdb3 -Lcore -lch341 -o output_native/native.exe
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lch341: No such file or directory
collect2: error: ld returned 1 exit status
make: *** [Makefile:44: output_native/native.exe] Error 1

В интернете такого параметра не нахожу. Что это?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, Turgenev сказал:

Понял, что ioctl нет в gcc. Почитав интернет, поставил cygwin. Пробую собрать через него.

Продвинулся дальше, но возникла ошибка не знает параметра -lch341:

  Скрыть контент

output_native/scaling.o -I. -MMD -ggdb3 -Lcore -lch341 -o output_native/native.exe
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lch341: No such file or directory
collect2: error: ld returned 1 exit status
make: *** [Makefile:44: output_native/native.exe] Error 1

В интернете такого параметра не нахожу. Что это?

Имя библиотеки (ch341)

Которая скорее всего должна быть в папке core

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

https://github.com/fifteenhex/libch341a

может, и не это, но что-то в этом духе

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, MrYuran said:

может, и не это

С вероятностью 99% - не это.

Тот же автор в соседнем проекте использует https://github.com/KerJoe/RTDMultiProg/tree/master/interfaces/ch341

К слову, цифирки "341" втречаются только в мейкфайле. Т.е. есть некоторая вероятность, что оно там по ошибке (например, планировался функционал для связи ПК - девайс, но не сложилось). Я бы попробовал выкинуть, для начала.

 

Но в любом случае. правильный подход - попросить автора добавить в исходный репозитарий саму библиотеку или хотя бы ссылку на неё вместо гаданий на гуще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 14.02.2024 в 10:34, esaulenka сказал:

С вероятностью 99% - не это.

Ну, я имел в виду lib341.a, которая прописана в мэйкфайле. И вывалил первый результат из поиска. Не вникая в контекст, конечно, трудно что-либо сказать.

Но вообще на гитхабе принято указывать Related projects или как там у них

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поискав еще немного тоже пришел к выводу что надо попробовать удалить этот параметр из make файла. Все скомпилировалось.

Спойлер

/cygdrive/d/ORTD2662-master
$ make
gcc output_native/adjust_.o output_native/adjust_customer_.o output_native/audio_.o output_native/auto_.o output_native/closecaption_.o output_native/eeprom_.o output_native/framesync_.o output_native/func_.o output_native/gmiosdfunc_.o output_native/guartsend_.o output_native/hdmi_.o output_native/i2c_.o output_native/int_.o output_native/ir_nec_.o output_native/key_.o output_native/key_pcb2660_003_5key_.o output_native/main_.o output_native/mcu_.o output_native/memory_.o output_native/misc_.o output_native/mode_.o output_native/osd_fac_.o output_native/osdmenufunc003_.o output_native/osdproc003_.o output_native/osdres003_.o output_native/osdtable003_.o output_native/power_.o output_native/rtdaccess_.o output_native/scaler_.o output_native/source_.o output_native/struct_.o output_native/sync_.o output_native/timer_.o output_native/uart_.o output_native/vbi_.o output_native/vchip_.o output_native/video_.o output_native/videodec_.o output_native/ypbpr_.o output_native/debug.o output_native/i2c_native_iface.o output_native/main.o output_native/misc.o output_native/composite.o output_native/hdmi.o output_native/vga.o output_native/1bit_font_vlc.o output_native/osd.o output_native/osd_ui.o output_native/adc.o output_native/ddc.o output_native/pins.o output_native/timer.o output_native/uart.o output_native/measure.o output_native/mode_tables.o output_native/scaler.o output_native/scaler_access.o output_native/scaler_tables.o output_native/scaling.o -I. -MMD -ggdb3 -Lcore -o output_native/native.exe
 

Но в папке output_native нет файлов прошивки - hex, bin. Хотя они указаны как цели make файле. Есть только файлы компилятора (объектные и зависимостей) и exe файл. 

 

24 минуты назад, esaulenka сказал:

правильный подход - попросить автора

В подобную ситуацию попадал ни раз (когда не понятно что имел в виду автор) и всегда хотелось спросить напрямую. Я не понимаю, как это делается на гитхабе, если автор не оставляет контактов?

Спойлер

image.thumb.png.8a948d18d65d69839da47d8ce2582474.png

 

Удаление 3х целей в конце make файла не помогло:

Спойлер

удалил

all: native firmware

program: $(SDCC_OUTPUTDIR)/firmware.bin
    $(PROGRAMMER) "$(CURDIR)/$(SDCC_OUTPUTDIR)/firmware.bin"

clean:
    $(RMDIR) $(NATIVE_OUTPUTDIR)
    $(RMDIR) $(SDCC_OUTPUTDIR)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 minutes ago, Turgenev said:

хотелось спросить напрямую. Я не понимаю, как это делается на гитхабе

Общепринятый способ - написать issue. Точнее, поискать по уже созданным, и в случае необходимости - написать ещё.

https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues

Можно, конечно, в git log посмотреть емейл автора (со мной пару раз так связывались), но лучше писать в общедоступное место.

 

31 minutes ago, Turgenev said:

Но в папке output_native нет файлов прошивки - hex, bin. Хотя они указаны как цели make файле.

В обсуждаемом мейкфайле два таргета - native (эмулятор (?), работающий на ПК) и firmware (собственно, прошивка для железки).

У вас есть только cygwin-gcc, который умеет собирать только под win64. firmware должно собираться неким sdcc (я довольно далёк от контроллеров дисплеев, и без гугла не скажу, что это такое).

Можете попробовать 'make firmware' чтобы получить ворох ошибок об отсутствии второго компилятора.

 

UPD:

31 minutes ago, Turgenev said:

Но в папке output_native нет файлов прошивки - hex, bin. Хотя они указаны как цели make файле.

А почему должно было помочь? Вот если бы вы запустили 'make program' или 'make all', можно было б увидеть разницу. А так - вообще ничего не поменялось.

Ну и ещё раз. Почитайте описание Makefile. По сути своей, он очень простой (по крайней мере, пока всякие нехорошие товарищи не пытаются делать простым инструментом сложные вещи, превращая скрипт во что-то нечитаемое).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 14.02.2024 в 11:15, esaulenka сказал:

firmware должно собираться неким sdcc (я довольно далёк от контроллеров дисплеев, и без гугла не скажу, что это такое).

 

Это спецGCC для разной дичи типа STM8

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...