Нативная и кросс-компиляция с использованием GNU make, встроенного C - PullRequest
0 голосов
/ 17 октября 2018

Я работаю над Makefile, чтобы сделать меня способным к нативной и кросс-компиляции.выбор команды для компиляции для хоста Linux или MSP432 следует выполнить из командной строки:

$ make build PLATFORM=MSP432
$ make build PLATFORM=HOST

вот мой Makefile, в котором я пытался это сделать:

include sources.mk

ifeq ($(PLATFORM),MSP432)
# Platform Overrides

# Architectures Specific Flags
LINKER_FILE = msp432p401r.lds
CPU = cortex-m4
ARCH = thumb
SPECS = nosys.specs

# Compiler Flags and Defines

CC = arm-none-eabi-gcc
LD = arm-none-eabi-ld
endif


ifeq ($(PLATFORM),HOST)

CC = gcc

endif


TARGET = c1m1
LDFLAGS = -Wl,-Map=$(TARGET).map -T $(LINKER_FILE)
CFLAGS = -mcpu=$(CPU) -m$(ARCH) --specs=$(SPECS) -Wall -Werror -g -O0  
-std=c99
CPPFLAGs =


.PHONY: build
build: $(TARGET).out


.PHONY: clean
clean:  
    rm -f $(OBJS) $(TARGET).out $(TARGET).map

%.o : %.c
$(CC) -c $< $(CFLAGS) -o $@
    OBJS = $(SOURCES:.c=.o)

$(TARGET).out: $(OBJS)
    $(CC) $(OBJS) $(CFLAGS) $(LDFLAGS) -o $@

это правильноспособ сделать это?

есть еще одна странная ошибка, возникающая при компиляции с использованием:

$ make main.o PLATFORM=MSP432

Я получаю эту ошибку:

arm-none-eabi-gcc -c main.c -mcpu=cortex-m4 -mthumb -- 
specs=nosys.specs -Wall -Werror -g -O0  -std=c99 -o main.o
main.c:23:22: fatal error: platform.h: No such file or directory 
 #include "platform.h"
                  ^
compilation terminated.
Makefile:64: recipe for target 'main.o' failed
make: *** [main.o] Error 1

и при компиляции с использованием этого:

$ make main.o PLATFORM=HOST

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

gcc -c main.c -mcpu= -m --specs= -Wall -Werror -g -O0  -std=c99 -o 
main.o
gcc: warning: ‘-mcpu=’ is deprecated; use ‘-mtune=’ or ‘-march=’ 
instead
gcc: error: missing argument to ‘-mcpu=’
gcc: error: missing argument to ‘--specs=’
gcc: error: unrecognized command line option ‘-m’
Makefile:64: recipe for target 'main.o' failed
make: *** [main.o] Error 1

Я опубликовал эти явно разные вопросы в 1 вопросе, потому что я думаю, что онивлияют друг на друга.

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

#ifndef __PLATFORM_H__
#define __PLATFORM_H__

#if defined (MSP432)
#include "msp432p401r.h"
#define PRINTF(...)




#elif defined (HOST)
#include <stdio.h>
#define PRINTF(...) printf(__VA_ARGS__)



#else
#error "Platform provided is not supported in this Build System"
#endif

#endif /* __PLATFORM_H__ */

1 Ответ

0 голосов
/ 17 октября 2018

Сначала я отвечу на случай, когда PLATFORM и HOST одинаковы:

$ make main.o PLATFORM=HOST

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

gcc -c main.c -mcpu= -m --specs= -Wall -Werror -g -O0  -std=c99 -o 
main.o
gcc: warning: ‘-mcpu=’ is deprecated; use ‘-mtune=’ or ‘-march=’ 
instead
gcc: error: missing argument to ‘-mcpu=’
gcc: error: missing argument to ‘--specs=’
gcc: error: unrecognized command line option ‘-m’
Makefile:64: recipe for target 'main.o' failed
make: *** [main.o] Error 1

Это связано с вашим make-файлом: CPU, ARCH и SPECS устанавливаются только в том случае, если PLATFORM равно MSP432

Таким образом, строка CFLAGS = -mcpu=$(CPU) -m$(ARCH) --specs=$(SPECS) -Wall -Werror -g -O0 -std=c99 оценивается как CFLAGS = -mcpu= -m --specs= -Wall -Werror -g -O0 -std=c99

Когда gcc вызывается с CFLAGS в качестве аргумента, что неверно.

Чтобы исправить это, вы можете сделатьэти небольшие изменения в вашем make-файле:

include sources.mk

ifeq ($(PLATFORM),MSP432)
# Platform Overrides

# Architectures Specific Flags
LINKER_FILE = msp432p401r.lds
CPU = cortex-m4
ARCH = thumb
SPECS = nosys.specs

LDFLAGS_ARCH = -T $(LINKER_FILE)
CFLAGS_ARCH = -mcpu=$(CPU) -m$(ARCH) --specs=$(SPECS)

# Compiler Flags and Defines
CC = arm-none-eabi-gcc
LD = arm-none-eabi-ld
endif

ifeq ($(PLATFORM),HOST)

CC = gcc

endif


TARGET = c1m1
LDFLAGS = -Wl,-Map=$(TARGET).map $(LDFLAGS_ARCH)
CFLAGS = $(CFLAGS_ARCH) -Wall -Werror -g -O0  
-std=c99
CPPFLAGs =

Теперь для main.c:23:22: fatal error: platform.h: No such file or directory Вы должны найти, где находится этот файл, и в конечном итоге добавить его в качестве опции gcc.

ДляНапример, если файл platform.h находится в /some/directory, вы можете добавить эту опцию в gcc, чтобы помочь ему найти его:

-I/some/directory

Так что в make-файле вы можете иметь эту строку:

CFLAGS_ARCH = -mcpu=$(CPU) -m$(ARCH) --specs=$(SPECS) -I/some/directory

РЕДАКТИРОВАТЬ

В комментариях вы добавляете эту проблему к своему вопросу:

, которые решили ее, ошибки:сейчас издесь это

 In file included from main.c:23:0: ./include/common/platform.h:30:2: error:
 #error "Platform provided is not supported in this Build System" #error "... *** [main.o] Error 1 

Что касается файла platform.h, для его запуска необходимо определить макрос MSP432 или HOST.

Чтобы определить такой макрос,Опция -D должна быть передана в gcc.

Поэтому идея состоит в том, чтобы добавить некоторую строку в make-файл, чтобы определить MSP432 или HOST при необходимости:

...
ifeq ($(PLATFORM),MSP432)
# Platform Overrides

# Architectures Specific Flags
LINKER_FILE = msp432p401r.lds
CPU = cortex-m4
ARCH = thumb
SPECS = nosys.specs

LDFLAGS_ARCH = -T $(LINKER_FILE)
CFLAGS_ARCH = -mcpu=$(CPU) -m$(ARCH) --specs=$(SPECS) -DMSP432 

# Compiler Flags and Defines
CC = arm-none-eabi-gcc
LD = arm-none-eabi-ld
endif

ifeq ($(PLATFORM),HOST)

CFLAGS_ARCH = -DHOST 

CC = gcc

endif
...
...