2017-10-02 1 views
0

Dans mon CMakeLists.txt parent:CMake MATCHS ne fonctionne pas comme je pense qu'il devrait

set(PROGRAMS "CCHIF;CCWIF;FXTINT;FXTCLI") 

Dans mon enfant CMakeLists.txt:

set (PROJ_LIST "CCHIF;FXTCLI") 
MESSAGE(STATUS "Programs is ${PROGRAMS}") 
foreach (PROJ ${PROJ_LIST}) 
if (";${PROJ};" MATCHES ";${PROGRAMS};") 
    project(${PROJ}) 
    add_executable(${PROJ} ${PROJ}.c) 
    target_link_libraries(${PROJ} LINK_PUBLIC pthread dl) 
    install(TARGETS ${PROJ} DESTINATION ${BIN_DIR}) 
endif() 
    Message (STATUS "${PROJ} is NOT in the programs list!!! **********") 
endforeach() 

Sortie de cmake ..

-- Programs is CCHIF;CCWIF;FXTINT;FXTCLI 
-- CCHIF is NOT in the programs list!!! ********** 
-- FXTCLI is NOT in the programs list!!! ********** 

J'ai essayé avec et sans le "; ....;" (quote/point-virgule) pour les arguments à MATCHES. J'ai utilisé MATCHES avec succès avant. Cela ne fonctionne pas dans ce cas. J'ai plus de 50 sous-programmes que je construis pour de nombreux sites. Certains sites ont besoin de tous les 50, certains ont seulement besoin d'une partie d'entre eux. donc je voudrais mettre les programmes nécessaires dans le CMakeLists.txt du Parent pour chaque site. Merci

+0

Et vous imprimez le message 'message (STATUS « $ {PROJ} est pas dans la liste des programmes !!! ** ******** ")' dans tous les cas, même si elle correspond car elle est en dehors du bloc if. Pour voir si elle correspond, vous devez ajouter et sinon bloquer à l'if et mettre le 'message()' dans le bloc else. – fedepad

+2

La chaîne 'CCHIF' ne correspond pas à l'expression régulière' CCHIF; CCWIF; FXTINT; FXTCLI'. Cependant, l'inverse est vrai: srting 'CCHIF; CCWIF; FXTINT; FXTCLI' correspond à l'expression régulière' CCHIF'. – Tsyvarev

Répondre

1

Je probablement utiliser la sous-list(FIND) pour faire la même tâche:

cmake_minimum_required(VERSION 3.9) # put your version... 
set(PROGRAMS CCHIF CCWIF FXTINT FXTCLI) 
set(PROJ_LIST CCHIF FXTCLI JACK) # added JACK to see that it will not match any element in the list 
foreach(PROJ ${PROJ_LIST}) 
    list (FIND PROGRAMS ${PROJ} _index) 
    if(${_index} GREATER -1) 
     message("Project selected: ${PROJ} in programs list") 
     project(${PROJ}) 
     add_executable(${PROJ} ${PROJ}.c) 
     target_link_libraries(${PROJ} LINK_PUBLIC pthread dl) 
     install(TARGETS ${PROJ} DESTINATION ${BIN_DIR}) 
    else(${_index} GREATER -1) 
     message(STATUS "${PROJ} is NOT in the programs list!!! ******") 
    endif(${_index} GREATER -1) 
endforeach()