OT hadanka s make na predlzeny vikend

Jan Waclawek konfera na efton.sk
Čtvrtek Květen 7 22:42:56 CEST 2015


> Neslo by udelat symlink/hardlink na x.elf a pak v podmince testovat
> ten link ?

No, jednak netusim ako urobit symlink/hardlink vo Win; druhak netusim, ako
by make to porovnanie v tomto pripade urobil...

---

>>> Version se musi updatovat na zaklade zdrojaku, nikoli binarky 
>> 
>> No lenze to by mi updatol verziu aj ked neskonci preklad uspesne kvoli
>> niektoremu medzikroku, t.j. by medzi vyslednymi .elf boli vacsie nez
>> jednotkove prirastky, a to nechcem.
>
>To nebylo v zadani a imo je to nerozumne omezeni, imo by melo stacit
>'vetsi nez predtim'. Ale budiz:

Nebolo, ale...
1. to obmedzenie vyplyva z nechuti plytvat miestom na ulozenie ("pamati je
vela a je lacna" patri na ine fora kde to zhltnu :-) ), na prenos(detto so
"siete su rychle"), na zobrazenie (skusali ste sa niekedy zmestit s 10
roznymi informaciami na display 2x16 znakov?)

2. uvedeny priklad je priklad, skutocnost je omnoho komplikovanejsia a ten
"stavaci" proces je naozaj ako stavba kostola. Rovnako ako cast zdrojakov,
aj makefile je generovany, a nie je jeden, je ich viacero povnaranych,
t.j. nie je trivialne urcit, co vsetko su zdrojaky. Ja viem ze sa pre
vnarane makefile daju generovat dependencies pomocou "test run" (-q a
spol.), ale jednak sa mi nechce skumat suvisiacich diablikov, druhak uz
teraz ten preklad trva nekonecne dlho (je to nieco vyse minuty ale ked to
robi clovek niekolkostokrat za den, tak mu akosi prestane ten den stacit).
A tie vnorene makefile nie su jedina komplikacia.

Inkrementovat verziu pri vygenerovani noveho binaru mi pripada ako
jednoducha a logicka volba.


>Mejme soubor version_last_good.h
>Mejme soubor version_current.h, ktery se v make zvedne o jedna oproti
>version_last_good
>Posledni step prekladu, az po generovani binarky, je kopie
>version_current.h do version_last_good.h


Nie je mi uplne jasne, ako to myslite.

Na zaklade coho, za akych okolnosit, kedy, sa bude robit to version_current
= version_last_good + 1?

Naviac, co je includnute do a.c? version_last_good.h ci version_current.h?

Ak version_last_good.h, tak to urcite nie je dobre, lebo to znamena, ze ak
sa podari preklad, tak version_last_good.h bude inkrementnuty, ergo bude
novsi ako x.elf, ktory je novsi ako a.o a ten je novsi ako a.c, co vdaka
zavislosti a.c od version_last_good.h sposobi, ze sa bude prekladat a.o
pri kazdom spusteni make, bez ohladu na to ci sa zmenil alebo nie (a tym
padom sa bude pustat aj cely ten stroj az po x.elf, uplne zbytocne, a
samorejme je to tiez "plytvanie" verziami :-) ). Takto to mam teraz, s
jedinym rozdielom, ze tam ten version_current vobec netreba.

Ak je a.c zavisle od version_current.h, tak otazka sa meni na tu prvu
otazku, ze kedy a za akych okolnosti sa ma urobit to pricitanie.


>Ty dve operace (nebo prinejmensim ta druha) se musi udelat externim
>skriptem, aby make neprisel na to, ze je to kruhova zavislost ;-)

No ale recipe v makefile je pre make "externa" zalezitost, on netusi co tie
prikazy znamenaju, on len vola $(SH) a napcha ich do neho...


>>> a nesmi se
>>> updatovat na zaklade version.h.
>> 
>> Tomu nerozumiem, mozete prosim rozviest?
>
>version.h se nemuze updatovat na zaklade version.h -> kruhova zavislost.

Zmiatlo ma to, ze som to som predsa ja sam napisal hned na zaciatku, to
bola formulacia problemu ;-) 


wek

PS. Znova pre pobavenie:

# Test for "smart" version incrementing
# Mimics build process for a file a.c #include-ing version.h and, files b.c
and c.c without that.
# Usage: put it into an empty directory, then run "make init", 
# then run repeatedly "make: and observe the last output line, whether
version increments properly 
# each time x.elf is "built".
# Mimic source file changes using "touch a.c" and "touch b.c".
# On win (and maybe other OS too), the timer granularity might cause not
quite expected results.

all: version_current.h
	@head -n 1 x.elf

clean:
	@rm -f *.o
	@rm -f *.c
	@rm -f *.h
	@rm -f x.elf

init: clean
	@echo creating a.c b.c c.c version.h
	@echo "cat version.h" > a.c
	@echo "echo "bbbb"" > b.c
	@echo "echo "cccc"" > c.c
	@echo "#define VERSION 123" > version.h


version_current.h: x.elf
	@echo updating version.h
	@if [ ! -f version_current.h ]; then                   \
	echo "File version_current.h not found - creating";    \
	echo "0" > version_current.h;                          \
	fitouch a
	@read LASTNUM < version_current.h;                     \
	NEWNUM=$$(($$LASTNUM + 1));                            \
	echo "$$NEWNUM" > version_current.h;                   \
	echo "#define VERSION $$NEWNUM" > version.h; 

x.elf: a.o b.o c.o
	@echo linking
	@cat a.o  b.o  c.o >x.elf

%.o: %.c
	@echo making $@ from $<
	@sh $< > $@


# phonies not ponies :-)
.PHONY: all clean init


# disable implicit rules
.SUFFIXES:



# following comes from the automatic dependency generated by preprocessor
a.o: a.c version.h

version.h:



Další informace o konferenci Hw-list