Sziasztok!
Van egy makefile ami sima C kodot fordit. A forras egy fokonyvtarban es tobb alkonyvtarban kerult elhelyezesre. Az egyszeruseg kedveert legyen ez a struktura:
./src/mod/mod.c
./src/run.c
A ./src/mod alatt van egy Makefile, ami megcsinalja a mod.o-t, ez oke. A run.c-nek az a fuggosege hogy a mod/mod.o letezzen, azaz hogy a mod/ alatti Makefile lefusson.
Ha a ./src/Makefile-ban azt mondom, hogy
.PHONY: all clean mod
all: run
mod:
$(MAKE) -C mod
run: run.c mod
$(CC) $(CFLAGS) -o run run.c mod/mod.o
Akkor ez igy mukodik parhuzamositva is, azonban ha semmit nem nyulok a kodhoz es kiadom a `make`-t, akkor a run-t mindig ujraforditja.
Ha azt mondom viszont hogy:
.PHONY: all clean mod
all: mod run
mod:
$(MAKE) -C mod
run: run.c
$(CC) $(CFLAGS) -o run run.c mod/mod.o
Akkor ez egy szálon futtatva (`make`) jo, azonban parhuzamositva (`make -j 2`) mar nem fordul le egy `make clean` utan. Nezegettem ezt itten, de nem sokra sikerult jutni :/ Barkinek barmi otlet? Koszonet!
- 1167 megtekintés
Hozzászólások
Persze. A run meg a mod a második esetben nem függenek egymástól, tehát elvben mehetnek két job-ban, de el is hasal az egyik, lényegében versenyhelyzet van. Az első esetben meg leírtad a függést, tehát ezt ő lelkesen egy job-ban le is futtatja (nem tud kettőt indítani).
- A hozzászóláshoz be kell jelentkezni
Igen, az biztos hogy az elso eset az kozelebb all ahhoz, ami kell (merthogy a masodik error-t dob ;)). Viszont, attol meg mert a mod-ban nem tortent valtozas, attol fuggetlenul ugy erzekeli hogy a run.c fuggosegeiben valtozas tortent. Es emiatt ujraforditja a run-t is pedig nem kell(ene).
- A hozzászóláshoz be kell jelentkezni
Ez egyelőre nem a párhuzamosságról szól, de nem kéne a mod-nál átadni a $(MAKEFLAGS) -ot is? (Ja, és a leírásoddal ellentétben run.c -nek egyáltalán nem függősége mod.o - de legalábbis a Makefile-od szerint nem.)
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
> Ez egyelőre nem a párhuzamosságról szól, de nem kéne a mod-nál átadni a $(MAKEFLAGS)-ot is?
A $(MAKE) atadja, azzal nincs gond. Vsz a $(MAKE) meg a make $(MAKEFLAGS) az ugyanaz(?)
> Ja, és a leírásoddal ellentétben run.c -nek egyáltalán nem függősége mod.o - de legalábbis a Makefile-od szerint nem.
Igen. Az viszont fuggosege hogy a mod-ra fusson le egy `make`. Szoval a run-t ugy forditata(m), hogy:
- nezze meg hogy milyen alkonyvtar(ai) van(nak), azon menjen vegig
- es es ha azokban barmilyen valtozas tortenik vagy a run.c valtozik, akkor forditsa le a run-t
A masodik eset, amikor a run fuggosege a run.c es a(z egyebkent phony) mod mint alkonyvtar, az jo, de ebben az esetben a run-t mindenkepp ujraforditja.
- A hozzászóláshoz be kell jelentkezni
A második félmodatomat félreértetted. A leírásod szerint "A run.c-nek az a fuggosege hogy a mod/mod.o letezzen" - no most nem run.c-nek, hanem a run-nak a függése a mod.o. Szerintem a valóságban is, meg a makefile-od szerint is. Ugyanis az idézőjeles részhez kéne egy ilyen rész is a makefile-ba:
run.c: mod/mod.o
De ugye olyan nincs benne. És fenntartom, hogy az a baj, hogy a mod-nak viszont nincs semmilyen függése a makefile-ban leírva. Ráadásul a .PHONY: sor miatt mindig elavultnak van minősítve, tehát le kell futtatni a hozzá tartozó parancso(kat)t. Azaz kicsit gyanús, hogy esetleg a mod könyvtárban levő makefile-ban van valami elkefélve.
(Idézet a FreeBSD-s make man-jából - nyilván hasonló módon le van írva gmake-től pmake-en át a MS-féle make-ig mindenütt:
.PHONY
The target does not correspond to an actual file; it is always
considered to be out of date, and will not be created with the
-t option. Suffix-transformation rules are not applied to
.PHONY targets.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
Õõõõ, igen, nyilvan arra gondoltam hogy a run-nak a fuggosege a mod/mod.o.
A gyakorlatban ez az egesz egyebkent ugy nez ki hogy a ./src-ben van nehany (4-5) alkonyvtar, mindegyikben egy egy *.a file, es a ./src-ben keszul egy tucatnyi binaris amiknek vegyesen kellenek ezek a *.a file-ok. Ennyi forrasnal (~200 *.c es *.h file, tucatnyi *.a es tucatnyi target) mar csak make -j 8 vagy 16-nal jon elo a problema, de igy 1 target + 1 modul eseten is reprodukalhato.
- A hozzászóláshoz be kell jelentkezni
Ja, szerintem a mod újrafordítását el lehetne kerülni ha a mod is függne mod.o -tól (nem csak a run)
mod: mod/mod.o
....
Pont azért fordítja újra a mod-ot, mert nem adtál neki feltételt - tehát muszáj neki.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
Szerintem az lenne a legegyszerűbb, ha nem lenne egynél több Makefile (persze include-álni lehet), és nem is akarnál túljárni a make eszén:
all: run
run: run.c mod/mod.o
$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
mod/%.o: mod/%.c
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $<
Lásd még: Recursive Make Considered Harmful
- A hozzászóláshoz be kell jelentkezni
most egy ilyesmit sikerult kitalalni:
.PHONY: all clean mod targets
all: mod
$(MAKE) targets
targets: run
mod:
$(MAKE) -C mod
run: run.c mod/mod.o
$(CC) $(CFLAGS) -o run run.c mod/mod.o
Ez igy fuggoseges ertelemben is jo es jol parhuzamosithato. Az onmagat meghivo make persze elegge ganyolas, dehat ez van... igy most ez a ~200 modul, ~15 konyvtarra elosztva, ~15 targettel szepen fordul es a fuggosegek is jok...
- A hozzászóláshoz be kell jelentkezni