2012-07-11 26 views
14

Próbuję dodać niestandardowy typ kompilacji dla mojej kompilacji cmake, skierowanej na zasięg kodu.Jak dodać niestandardowy typ kompilacji do cmake? (cel kierowania)

znalazłem wpis w FAQ o tym: http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_specify_my_own_configurations_.28for_generators_that_allow_it.29_.3F

Jednak nie mogę tego dokonać.

Oto mój kod, za pomocą cmake 2.8.5:

message("* Adding build types...") 
if(CMAKE_CONFIGURATION_TYPES) 
    list(APPEND CMAKE_CONFIGURATION_TYPES CodeCoverage) 
    list(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES) 
    set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING 
     "Add the configurations that we need" 
     FORCE) 
    message(" Available build types are now : ${CMAKE_CONFIGURATION_TYPES}") 
else() 
    message(" XXX custom build types are not allowed...") 
endif() 

I get "XXX zwyczaj budowania typy nie są dozwolone ..." ...

Odpowiedz

19

Znaleziony problem: nie ma pomieszanie między dodanie niestandardowych buduje i niestandardowe konfiguracje:

  • konfigurację s są do specjalnych narzędzi takich jak Visual Studio lub XCode
  • typów kompilacji są znacznie rawer cecha

Więc dodać niestandardowy typ kompilacji, nie ma potrzeby, aby manipulować zmienną CMAKE_CONFIGURATION_TYPES w ogóle. Wystarczy ustawić odpowiednie zmienne i rozpocząć korzystanie z niego, jak explained:

SET(GCC_DEBUG_FLAGS "-g -Wall") 

# Add new build types 
message("* Adding build types...") 
SET(CMAKE_CXX_FLAGS_COVERAGE 
    "${GCC_DEBUG_FLAGS} -fprofile-arcs -ftest-coverage" 
    CACHE STRING "Flags used by the C++ compiler during coverage builds." 
    FORCE) 
SET(CMAKE_C_FLAGS_COVERAGE 
    "${GCC_DEBUG_FLAGS} -fprofile-arcs -ftest-coverage" 
    CACHE STRING "Flags used by the C compiler during coverage builds." 
    FORCE) 
SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE 
    "" 
    CACHE STRING "Flags used for linking binaries during coverage builds." 
    FORCE) 
SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE 
    "" 
    CACHE STRING "Flags used by the shared libraries linker during coverage builds." 
    FORCE) 
MARK_AS_ADVANCED(
    CMAKE_CXX_FLAGS_COVERAGE 
    CMAKE_C_FLAGS_COVERAGE 
    CMAKE_EXE_LINKER_FLAGS_COVERAGE 
    CMAKE_SHARED_LINKER_FLAGS_COVERAGE) 

Możemy również chcą udate ciąg pomocy (wraz z setting the default build type przy okazji):

IF(NOT CMAKE_BUILD_TYPE) 
    SET(CMAKE_BUILD_TYPE Debug 
     CACHE STRING "Choose the type of build : None Debug Release RelWithDebInfo MinSizeRel Coverage." 
     FORCE) 
ENDIF(NOT CMAKE_BUILD_TYPE) 
message("* Current build type is : ${CMAKE_BUILD_TYPE}") 

Trochę ostrzeżenie o próbuje dziedziczą domyślne opcje z innego typu build ten sposób:

SET(CMAKE_CXX_FLAGS_COVERAGE 
    "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage" 
    CACHE STRING "Flags used by the C++ compiler during coverage builds." 
    FORCE) 

to złe pomysłów, ponieważ dodatkowe opcje są dołączane za każdym razem, gdy konfiguracja jest ponownie pobierana (za każdym razem, gdy coś w niej zmienisz).

+3

Możesz dziedziczyć domyślne opcje z innego typu kompilacji, ale nie powinieneś używać @set (.. CACHE ... FORCE) @ dla zmiennej złożonej, bo zobaczysz to zachowanie dołączania. Wartość zmiennej, która jest propagowana do pliku Makefile, nie musi być buforowana. – mabraham

+4

Bardziej aktualna odpowiedź [tutaj] (http://stackoverflow.com/a/24470998/1938798) podaje bardziej kompletne i technicznie poprawne wyjaśnienie tego tematu. –

Powiązane problemy