Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
use makefiles https://zx.oberon.org/forum/viewtopic.php?f=8&t=137 |
Страница 1 из 1 |
Автор: | slenkar [ 31 авг 2013, 17:43 ] |
Заголовок сообщения: | use makefiles |
Makefiles can be used on linux and windows and they are powerful makefiles are good because they only compile files that have changed, this saves a lot of time here is mine for xdev/zxdev Цитата: all: $(targetname).tap OBJECTS = Globals.lib MapSquares.lib Spiral.lib Rsrc.lib path.lib UnitFunctions.lib Graphics.lib line.lib Helper.lib Dungeon.lib EnemyAI.lib $(targetname).tap: $(targetname).bin Bin/bin2tap -b -a 25000 -c 24999 -r 25000 -o $(targetname).tap $(targetname).bin fuse-gtk $(targetname).tap $(targetname).bin: $(targetname).ihx Bin/hex2bin $(targetname).ihx $(targetname).ihx: $(targetname).c /root/sdcc/bin/sdcc $(targetname).c -mz80 --code-loc 25000 --data-loc 49000 --no-std-crt0 --opt-code-size --funsigned-char --disable-warning 126 -I Lib -I Obj Lib/z80/Basic.lib Lib/z80/XDev.lib $(OBJECTS) $(targetname).c :$(OBJECTS) $(targetname).mod "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/$(targetname).mod -m %.lib: %.rel /root/sdcc/bin/sdcclib $@ $< %.rel:%.c /root/sdcc/bin/sdcc -mz80 -c $< -I Lib %.c %.sym:%.mod "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/$< -e -s clean: rm *.lib *.rel *.c *.h *.ihx *.bin it looks complicated but its not lets start at the bottom: Цитата: clean: rm *.lib *.rel *.c *.h *.ihx *.bin when you type in 'make clean' this will be executed rm means remove *.lib means all files that end in .lib this just cleans up all the files you dont need, so you can recompile everything later. Цитата: %.c %.sym:%.mod "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/$< -e -s Цитата: %.c %.sym:%.mod this means that you want a file that ends in .c and one that ends in .sym then there is the colon : then %.mod means that you need files that begin with .mod to get the files that end in .c the next line needs a tab this tells the makefile how to get the .c files Цитата: "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/$< -e -s $< is the name of the file on the right of the colon, something.mod so if I type in 'make' this will happen: "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/hi.mod -e -s "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/basic.mod -e -s "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/line.mod -e -s "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/path.mod -e -s makefiles only compile files that have changed remember, if basic.mod is newer than basic.c it will compile basic.mod again, because you put this in the makefile Цитата: %.c %.sym:%.mod it will compare the file dates of the files ending in .c and .sym to see if they are older than the .mod files and compile the .mod files if they are newer. the next 2 lines are similar: Цитата: %.lib: %.rel /root/sdcc/bin/sdcclib $@ $< %.rel:%.c /root/sdcc/bin/sdcc -mz80 -c $< -I Lib they tell the makefile that to get .rel files you need a .c file and underneath is the command to get it $< gives the name of all the .c files to the makefile Цитата: %.lib: %.rel /root/sdcc/bin/sdcclib $@ $< this says to get a .lib file you need a .rel file $< is the .rel file and $@ is the .lib file the makefile will execute this command /root/sdcc/bin/sdcclib basic.lib basic.rel if basic .rel is newer than basic.lib but this will happen to every .rel file in the same folder as the makefile Цитата: $(targetname).c :$(OBJECTS) $(targetname).mod "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/$(targetname).mod -m $(targetname) is a word that is passed to the makefile if I type in make targetname=basic then the line will look like this: basic.c :$(OBJECTS) basic.mod "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/basic.mod -m $(OBJECTS) is a list of all the files I am using Цитата: OBJECTS = Globals.lib MapSquares.lib Spiral.lib Rsrc.lib path.lib UnitFunctions.lib Graphics.lib line.lib Helper.lib Dungeon.lib EnemyAI.lib so really it looks like this Цитата: basic.c :Globals.lib MapSquares.lib Spiral.lib Rsrc.lib path.lib UnitFunctions.lib Graphics.lib line.lib Helper.lib Dungeon.lib EnemyAI.lib basic.mod "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/basic.mod -m this tells the makefile that I want basic.c but before trying to get basic.c for me I need basic.mod and all those lib files the other line we looked at tell the makefile how to get lib files Цитата: %.lib: %.rel /root/sdcc/bin/sdcclib $@ $< so the makefile will compile lib files first because they are needed by this line: Цитата: basic.c :Globals.lib MapSquares.lib Spiral.lib Rsrc.lib path.lib UnitFunctions.lib Graphics.lib line.lib Helper.lib Dungeon.lib EnemyAI.lib basic.mod "/root/ofront/linux2/bin/ofront" /root/Dropbox/oberon/basic.mod -m Цитата: $(targetname).ihx: $(targetname).c /root/sdcc/bin/sdcc $(targetname).c -mz80 --code-loc 25000 --data-loc 49000 --no-std-crt0 --opt-code-size --funsigned-char --disable-warning 126 -I Lib -I Obj Lib/z80/Basic.lib Lib/z80/XDev.lib $(OBJECTS) this line means we want basic.ihx we need basic.c to get it below that is the command to get basic.ihx notice I put the libs in the right order so they will compile: OBJECTS = Globals.lib MapSquares.lib Spiral.lib Rsrc.lib path.lib UnitFunctions.lib Graphics.lib line.lib Helper.lib Dungeon.lib EnemyAI.lib Globals doesnt import anything so it goes first, Mapsquares imports Globals so it has to go after Globals etc. |
Автор: | Saferoll [ 01 сен 2013, 22:18 ] |
Заголовок сообщения: | Re: use makefiles |
slenkar писал(а): Makefiles can be used on linux and windows and they are powerful Yes, Makefiles are good,of course. In Linux "make" is an ordinary thing, but Windows has no "make" as standard utility. It is necessary in Windows to install http://gnuwin32.sourceforge.net/packages/make.htm or other. It makes quick start of XDev more difficult for newbies.
makefiles are good because they only compile files that have changed, this saves a lot of time |
Автор: | Zorko [ 13 сен 2013, 18:47 ] |
Заголовок сообщения: | Re: use makefiles |
Undoubtedly makefiles are especially good if used console-based development tools like GCC, Ofront or GPCP (btw, Java world has something - ant named. This tool is very similar to make). Using makefiles is a clean Unix-way, and I would use make whenever I need to build the project with a lot of modules by a console-based tool. I must explain why XDev does not use makefiles. Firstly, it proposes not Unix-way, and Oberon-way, that looks some different. Secondly, it's yet GUI environment, based on BlackBox, and don't proposes to work in command-line. Thirdly, XDev examples are simple (one module usually). What I propose as XDev-way to build multi-module projects? Only one thing: use smart scripts compile.bat and build.bat. For example: Код: "WINBATCH" @IF NOT EXIST abc.rel sdcc -c abc.c -mz80 ... And, finally, I had a hard time imagine a universal makefile. In my opinion, it has to be adapted every time for a new project. Yes, still exists question how to design scripts to rebuild XDev libraries - to recompile only changed sources. But the libraries compile not so often, and I use full rebuilding for a higher guarantee the correct result. Because adding modules partially to a library may lead to some problems, I have met before. |
Страница 1 из 1 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |