CMake - project dependency

Cmakesad

CMake - project dependency
« kdy: 16. 05. 2018, 20:40:10 »
Ahojte,

Zhanam fundovanu radu na dependency problem u Cmake.

Mam projekt A - lib, app - add_executable, add_library prepinam pomocou option z -D...
Mam projekt B - app - ma dependency na projekt A(lib), jednu cast kodu nastavujem cez option -D...

Mam projekt C - app, ten ma dependency na A(app, lib) a projekte B(app), avsak, do projektu "vsuva" CMAKE_C_FLAGS.

cele to skladam v CMakeLists cez ExternalProject_Add() ... Takze technicky v projekte C skladam projekt A, projekt B, jeho app, aj lib. Kazdopadne, aby cely system fungoval, tak A,B musia byt v projekte C.

Problem:
1) Okrem toho, ze neviem rozumne vyriesit dependency, aby sa mi 2x nestahoval projekt A (pre B aj C).
2) Tak som narazil na takmer pre mna neriesitelny problem: ak zmenit v projekte C - CMAKE_C_FLAGS napr -DLOG=0 na -DLOG=1, tak ExternalProject_Add(B ... -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} ...) sa nepremietne do B, a nepride ku rekompilacii kodu, coho vska chcem dosiahnut. K rekompilacii dojde iba v pripade ze sa v B zmeni source.

1) Ako mozem vyriesit to, ze ak pride k zmene C_FLAGS v projekte C, aby sa mi tato zmena prejavila aj v B. C aj B pouzivaju jednu cast kodu ktora je zavysla prave na hodnotach v preprocesore.

Diky.


Honza

Re:CMake - project dependency
« Odpověď #1 kdy: 17. 05. 2018, 00:12:26 »
Ano, takhle to fungovat nebude, ty definice je nutné přeposlat do toho externího projektu jinak.

Např. takto:
Kód: [Vybrat]
ExternalProject_Add(
...
...
CMAKE_ARGS -DCMAKE_C_FLAGS:string=${CMAKE_C_FLAGS}
)
Jde o to, že fáze configure proběhne pouze jednou, a následně si ten externí projekt žije sám vlastní životem, takže bude reagovat jen na změnu vlastního source, nebo změnu definic, které se změní v něm (což lze udělat např. ručně).
Různých řešení je ale asi více.

Cmakesad

Re:CMake - project dependency
« Odpověď #2 kdy: 17. 05. 2018, 19:14:41 »
Zial, nepomohlo :(.

Asi to nebude taky trivialny problem. Skusim pozriet vacsie projekty ako riesia application dependency.
V tomto mojom pripade, projekt C nema zmysel, ak nieje skompilovany projekt A,B. A tak isto, B musi mat rovnaky C_FLAGS ako projekt C.

Pouzivam verziu 5.1, podla oficialneho repa su na verzi 5.11, takze skusim este prekompilovatnajnovsi cmake ci to pomoze.

Diky za radu, skusim este prebruzdat na pipemail.