Часто так бывает, что есть некоторый набор исходных файлов, но нет ни Makefile, ни сборочного скрипта configure, так необходимых для сборки проекта. Конечно, Ъ-луниксоиды скажут, что Makefile нужно писать самим вручную, но у меня не так много на это времени, поэтому я предлагаю воспользоваться такой вот удобной утилитой.
Для начала скажу, что этот способ тестировался на том SDK, установка которого описана в этом посте, установить tmake в другие SDK можно будет по аналогии. Я не думаю, что у знающих людей возникнут какие-то вопросы с этим.
Сперва качаем следующий архив. Далее в дистрибутиве GNU/Linux переходим в ту директорию, где установлен SDK. У меня это каталог /opt/toolchains/motomagx/arm-eabi2. По этому пути (в корень SDK) кидаем директорию tmakelib/ из скачанного архива по ссылке выше. Два скрипта, написанных на Perl, кидаем в каталог bin/ в корне SDK. В скрипте подгрузки SDK (в том, которым вы устанавливаете переменные окружения. Если следовали пунктам из этого поста, то он у вас в /home/z6 и называется setenv-z6.sh) добавляем строку, можно в конец скрипта:
1 |
export TMAKEPATH=$TOOLPREFIX/tmakelib/pwd/arm-linux-g++/ |
Всё, tmake установлен! Можно его проверить, для начала подгружаем переменные окружения SDK:
1 2 |
cd /home/z6 . setenv-z6.sh |
Затем переходим в директорию с исходными файлами и выполняем следующие команды (они должны выполниться без ошибок, обратите внимание на пути):
1 2 3 4 5 |
cd ~/Source/source_code/ chmod +x /opt/toolchains/motomagx/arm-eabi2/bin/progen chmod +x /opt/toolchains/motomagx/arm-eabi2/bin/tmake progen -o 1.pro tmake 1.pro -o Makefile |
Последней командой должен создаться стандартный Makefile, который нужно немножко поправить. Мой Makefile получился приблизительно таким:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
############################################################################# # Makefile for building 1 # Generated by tmake at 20:26, 2010/09/16 # Project: 1 # Template: app ############################################################################# ####### Compiler, tools and options CC = arm-linux-gnueabi-gcc CXX = arm-linux-gnueabi-g++ CFLAGS = -pipe -Wall -W -O3 -DNO_DEBUG CXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O3 -DNO_DEBUG INCPATH = -I$(QTDIR)/include LINK = arm-linux-gnueabi-gcc LFLAGS = -Wl,-rpath,$(QTDIR)/lib LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm -lqte-mt -lezxappbase -lezxam MOC = $(QTDIR)/bin/moc UIC = $(QTDIR)/bin/uic TAR = tar -cf GZIP = gzip -9f ####### Files HEADERS = SOURCES = main.c OBJECTS = main.o INTERFACES = UICDECLS = UICIMPLS = SRCMOC = OBJMOC = DIST = TARGET = 1 INTERFACE_DECL_PATH = . ####### Implicit rules .SUFFIXES: .cpp .cxx .cc .C .c .cpp.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .cxx.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .cc.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .C.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .c.o: $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< ####### Build rules all: $(TARGET) $(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) moc: $(SRCMOC) tmake: Makefile Makefile: 1.pro tmake 1.pro -o Makefile dist: $(TAR) 1.tar 1.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST) $(GZIP) 1.tar clean: -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET) -rm -f *~ core ####### Sub-libraries ###### Combined headers ####### Compile main.o: main.c |
Если вы хотите собрать SDL-приложение, то правим верхнюю часть Makefile таким образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
############################################################################# # Makefile for building You Name Project # Generated by tmake at 07:49, 2010/07/25 # Project: You Name Project # Template: app ############################################################################# ####### Compiler, tools and options CC = arm-linux-gnueabi-gcc CXX = arm-linux-gnueabi-g++ CFLAGS = `sdl-config --cflags` -march=armv6j -mtune=arm1136jf-s -mfpu=vfp -Os CXXFLAGS= `sdl-config --cflags` -march=armv6j -mtune=arm1136jf-s -mfpu=vfp -Os INCPATH = `sdl-config --cflags` LINK = arm-linux-gnueabi-gcc LFLAGS = `sdl-config --libs` -lSDL_ttf -lSDL_mixer -lfreetype -lSDL_image -lSDL_gfx LIBS = `sdl-config --libs` -lSDL_ttf -lSDL_mixer -lfreetype -lSDL_image -lSDL_gfx MOC = $(QTDIR)/bin/moc UIC = $(QTDIR)/bin/uic TAR = tar -cf GZIP = gzip -9f |
Обращаем внимание на CFLAGS и CXXFLAGS, какие флаги препроцессора туда поставить для корректной сборки, можно посмотреть в самих исходниках. Например, -DGP2X, -DDINGOO и другие для определённой платформы или параметров. Флаги -march=armv6j -mtune=arm1136jf-s -mfpu=vfp -Os — это оптимизация под наш процессор (ARM11), спасибо за нахождение параметров Ant-ON‘у и XVilka. Флаги -O3 или -O2 являются более общими оптимизациями компилятора, однако бывает такое, что с этими флагами программа или игра просто не запускаются. Мне сказали, что это как-то связано с хаками в компиляторе GCC от MontaVista.
Если вы хотите собрать Qt-приложение, то обрезаем наш дефолтный Makefile до строчки ########### Files и вставляем следующую конструкцию, расположенную ниже. Спасибо Ant-ON‘у за неё:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# App can compile for platform: # PLATFORM=EZX-Z6 # PLATFORM=EZX-Z6W # PLATFORM=EZX-U9 # PLATFORM=EZX-ZN5 # PLATFORM=EZX-V8 # PLATFORM=EZX-E8 (default) # PLATFORM=EZX-VE66 # PLATFORM=EZX-EM35 #. # For example - compile this source for Motorla ZN5: #. # cd /PROJECT_FOLDER/ # make clean # make PLATFORM=EZX-ZN5 #. ######Config###### APPNAME := You_name_project UPLOAD_PATH := /mmc/mmca1/bin/ ################## TOOLPREFIX := /opt/toolchains/motomagx/arm-eabi ARMLIB := $(TOOLPREFIX)/arm-linux-gnueabi/lib ifeq ($(PLATFORM),) PLATFORM = EZX-ZN5 endif ifeq ($(PLATFORM),EZX-Z6) QTDIR := $(TOOLPREFIX)/lib/qt-2.3.8 EZXDIR := $(TOOLPREFIX)/lib/ezx-z6 LINKLIB := -lm -lqte-mt -lezxpm -ljpeg -lezxappbase -lezxtapi-xscale-r -llog_util -llighting DIRECTIV := -DEZX_Z6 TARGET = $(APPNAME)_Z6 endif ifeq ($(PLATFORM),EZX-V8) QTDIR := $(TOOLPREFIX)/lib/qt-v8 EZXDIR := $(TOOLPREFIX)/lib/ezx-v8 LINKLIB := -lm -lqte-mt -lezxpm -lezxappbase DIRECTIV := -DEZX_V8 TARGET = $(APPNAME)_V8 ZNEWCHECKBOX = 1 endif ifeq ($(PLATFORM),EZX-E8) ARMLIB := $(TOOLPREFIX)/arm-linux-gnueabi/lib_E8 QTDIR := $(TOOLPREFIX)/lib/qt-e8 EZXDIR := $(TOOLPREFIX)/lib/ezx-e8 LINKLIB := -lm -lqte-mt -lezxappbase DIRECTIV := -DEZX_E8 TARGET = $(APPNAME)_E8 endif ifeq ($(PLATFORM),EZX-EM30) ARMLIB := $(TOOLPREFIX)/arm-linux-gnueabi/lib_E8 QTDIR := $(TOOLPREFIX)/lib/qt-em30 EZXDIR := $(TOOLPREFIX)/lib/ezx-em30 EZXDIR2 := $(TOOLPREFIX)/lib/ezx-e8 LINKLIB := -lm -lqte-mt -lezxappbase DIRECTIV := -DEZX_EM30 TARGET = $(APPNAME)_EM30 endif ifeq ($(PLATFORM),EZX-U9) QTDIR := $(TOOLPREFIX)/lib/qt-zn5 EZXDIR := $(TOOLPREFIX)/lib/ezx-u9 EZXDIR2 := $(TOOLPREFIX)/lib/ezx-zn5 LINKLIB := -lm -lqte-mt -lezxappbase DIRECTIV := -DEZX_U9 TARGET = $(APPNAME)_U9 endif ifeq ($(PLATFORM),EZX-Z6W) QTDIR := $(TOOLPREFIX)/lib/qt-z6w EZXDIR := $(TOOLPREFIX)/lib/ezx-z6w LINKLIB := -lm -lqte-mt -lezxappbase DIRECTIV := -DEZX_Z6W TARGET = $(APPNAME)_Z6W endif ifeq ($(PLATFORM),EZX-ZN5) QTDIR := $(TOOLPREFIX)/lib/qt-zn5 EZXDIR := $(TOOLPREFIX)/lib/ezx-zn5 LINKLIB := -lm -lqte-mt -lezxappbase -lezxqtnapi -lezxtapi-xscale-r DIRECTIV := -DEZX_ZN5 TARGET = $(APPNAME)_ZN5 endif ifeq ($(PLATFORM),EZX-EM35) ARMLIB := $(TOOLPREFIX)/arm-linux-gnueabi/lib_E8 QTDIR := $(TOOLPREFIX)/lib/qt-em35 EZXDIR := $(TOOLPREFIX)/lib/ezx-em35 LINKLIB := -lm -lqte-mt -lezxappbase DIRECTIV := -DEZX_EM35 TARGET = $(APPNAME)_EM35 endif ifeq ($(PLATFORM),EZX-VE66) ARMLIB := $(TOOLPREFIX)/arm-linux-gnueabi/lib_E8 QTDIR := $(TOOLPREFIX)/lib/qt-em35 EZXDIR := $(TOOLPREFIX)/lib/ezx-ve66 LINKLIB := -lm -lqte-mt -lezxappbase DIRECTIV := -DEZX_VE66 TARGET = $(APPNAME)_VE66 endif CC = $(TOOLPREFIX)/bin/arm-linux-gnueabi-gcc CXX = $(TOOLPREFIX)/bin/arm-linux-gnueabi-g++ LD = $(TOOLPREFIX)/bin/arm-linux-gnueabi-g++ STRIP = $(TOOLPREFIX)/bin/arm-linux-strip CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG $(INCPATH) CXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -DNO_DEBUG $(DIRECTIV) $(INCPATH) INCPATH = -I$(QTDIR)/include -I$(EZXDIR)/include -I$(EZXDIR2)/include -I $(TOOLPREFIX)/arm-linux-gnueabi/include LDFLAGS = -s LINK = $(TOOLPREFIX)/bin/arm-linux-gnueabi-gcc LFLAGS = -Wl,-rpath-link,$(EZXDIR)/lib LIBS = $(SUBLIBS) -L$(EZXDIR)/lib -L$(EZXDIR2)/lib -L$(ARMLIB) -L$(QTDIR)/lib $(LINKLIB) MOC = $(QTDIR)/bin/moc UIC = $(QTDIR)/bin/uic |
Далее правим переменную TOOLPREFIX, обычно это:
1 |
TOOLPREFIX := /opt/toolchains/motomagx/arm-eabi |
А затем редактируем блок EZX-ZN5.
Собственно, на этом всё. Спасибо большое Neomoto, за то, что напомнил мне про tmake.