Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CMake : How to get the name of all subdirectories of a directory?

Tags:

cmake

I have two questions relative to CMake

  1. Assume that we have a variable ${MY_CURRENT_DIR} that contains the path of a directory that contains several subdirectories : mydir1, mydir2 and mydir3. I want to detect these subdirectories and put their names into ${SUBDIRS} (not the complete path of these directories, only their name). How to do that automatically ?

  2. Assume that ${SUBDIRS} contains "mydir1 mydir2 mydir3". How to replace

    ADD_SUBDIRECTORY(mydir1) ADD_SUBDIRECTORY(mydir2) ADD_SUBDIRECTORY(mydir3) 

by a loop over ${SUBDIRS}?

like image 823
Vincent Avatar asked Oct 16 '11 22:10

Vincent


2 Answers

  1. Use this macro:

    MACRO(SUBDIRLIST result curdir)   FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)   SET(dirlist "")   FOREACH(child ${children})     IF(IS_DIRECTORY ${curdir}/${child})       LIST(APPEND dirlist ${child})     ENDIF()   ENDFOREACH()   SET(${result} ${dirlist}) ENDMACRO() 

    Example:

    SUBDIRLIST(SUBDIRS ${MY_CURRENT_DIR}) 
  2. Use foreach:

    FOREACH(subdir ${SUBDIRS})   ADD_SUBDIRECTORY(${subdir}) ENDFOREACH() 
like image 130
refaim Avatar answered Oct 05 '22 14:10

refaim



In regard to answer above: Use this macro:

MACRO(SUBDIRLIST result curdir)   FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)   SET(dirlist "")   FOREACH(child ${children})     IF(IS_DIRECTORY ${curdir}/${child})       LIST(APPEND dirlist ${child})     ENDIF()   ENDFOREACH()   SET(${result} ${dirlist}) ENDMACRO() 

Example:

SUBDIRLIST(SUBDIRS ${MY_CURRENT_DIR}) 

I had trouble with this FILE(GLOB command. (I'm on cmake 3.17.3) Otherwise the macro works great. I was getting FILE GLOB errors, something like "FILE GLOB requires a glob expression after the directory." (Maybe it didn't like RELATIVE and/or just using the curdir as the fourth paramter.)

I had to use:

FILE(GLOB children ${curdir}/*) 

(taking out RELATIVE and the first ${curdir} (Please note my cmake version above, that could've been my issue (I'm unfamiliar with glob so far.).)

like image 26
skittlebiz Avatar answered Oct 05 '22 14:10

skittlebiz