make -j, alkonyvtarak + parhuzamositas

Fórumok

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!

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).

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).

> 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 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?

Õõõõ, 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.

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

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...