2011-12-19 1 views
20

Próbuję ustawić makro preprocesora w linii komend CMake. Próbowałem:Jak zdefiniować makro preprocesora C++ za pomocą wiersza poleceń z CMake?

set generator="Visual Studio 8 2005" 
set params=-D MY_MACRO=1 
cmake.exe -G %generator% %params% ..\some_project 

ale to nie definiuje, kiedy mogę skompilować ani mogę znaleźć nazwę MY_MACRO w plikach generowanych przez CMake w ogóle, z wyjątkiem CMakeCache.txt gdzie jest obecny w postaci:

MY_MACRO:UNINITIALIZED=1 

Jak mogę to zrobić?

+1

Jeśli rozwiązałeś to już teraz, byłbym zainteresowany rozwiązaniem –

+1

@TimMeyer: Nie. Najwyraźniej to niemożliwe. – ybungalobill

+0

@ybungalobill: Nie można wstrzykiwać makr z wiersza poleceń, można modyfikować tylko istniejące makra zdefiniowane w CMakeLists.txt. Również, * ustawione params = -D MY_MACRO = 1 * powinny być * ustawione params = -DMY_MACRO = 1 * – NeoH4x0r

Odpowiedz

6

Spróbuj tego: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

+3

To w połowie działa. Nadpisuje wartość 'CMAKE_CXX_FLAGS'. Próbowałem '-D CMAKE_CXX_FLAGS ="/DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS} "' ale '$ {CMAKE_CXX_FLAGS}' nie jest rozwijane. Ktoś wie, jak to naprawić? – ybungalobill

+0

Podwójnie cytowane ciągi w wierszu poleceń zostaną rozszerzone o bash. Ponieważ nie masz zmiennej środowiskowej o nazwie CMAKE_CXX_FLAGS, bash rozwija ją do "", zanim cmake nawet ją zobaczy. Zamiast tego użyj pojedynczych cudzysłowów. – Tolli

+0

@Tolli, który również nie działa. Zapobiega rozszerzaniu zmiennej przez bash, ale cmake również jej nie rozszerza. Przekazuje literalną wartość '/ DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS}' bezpośrednio do kompilatora. – pavon

-5

Chyba że masz dobry powód nie, należy użyć ADD_DEFINITIONS(<name>=<value>[, ...]).

Wystarczy dodać następującą linię do CMakeLists.txt:

ADD_DEFINITIONS("MY_MACRO=1") 

CUpewnij zadba o składni przełączników (może to być -D<name>=<value> lub /D<name>=<value>).

+13

modyfikowanie CMakeLists.txt nie jest traktowane jako rozwiązanie z linii poleceń. I tak, mam dobry powód, aby tego nie robić. Muszę zautomatyzować proces kompilacji, a ja * nie powinien * zmieniać źródeł. – ybungalobill

+0

Przepraszam za przestrzeń; Chciałem dodać rozwiązanie z linii poleceń, ale nie było to dokładnie to, czego szukałeś. Niemniej jednak, zrobienie tego z linii poleceń tylko sprawi, że twój dzień będzie nieszczęśliwy, zaufaj mi. – hiobs

+0

Czasami linia poleceń jest bardziej przydatna niż aplikacja GUI, a czasami nie. Naprawdę nie sądzę, że możesz powiedzieć, że to uczyni twój dzień nieszczęśliwym, ponieważ to naprawdę zależy od sytuacji, umiejętności użytkownika i osobistych preferencji. – NeoH4x0r

14

Dobrą alternatywą byłoby zdefiniowanie opcji cmake:

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default 

Obserwowani przez warunek:

IF(DEFINE_MACRO) 
    ADD_DEFINITIONS(-DMACRO) 
ENDIF(DEFINE_MACRO) 

Następnie można włączyć tę opcję ON/OFF poprzez linię poleceń z cmake pomocą Flaga -D. Przykład:

cmake -DDEFINE_MACRO=OFF .. 

Aby upewnić się, że kompilator odbiera prawo rozdzielczości, można zadzwonić dokonać w trybie opisowym i sprawdzić makra są zdefiniowane lub nie:

make VERBOSE=1 

Jest to dobre rozwiązanie również ponieważ make przekompiluje twój kod, gdy zmieni się dowolna z opcji cmake.

+2

Wymaga to modyfikacji CMakeLists, więc nie jest to rozwiązanie (-1). – ybungalobill