[CMake] Read multiple path names from filesystem

Michael Wild themiwi at gmail.com
Thu Oct 29 10:17:06 EDT 2009


On 29. Oct, 2009, at 15:11 , Tim Just wrote:

> Michael Wild wrote:
>>
>> On 29. Oct, 2009, at 11:11 , Tim Just wrote:
>>
>>> Hi,
>>>
>>> I'm using CMake 2.8 rc3 on Ubuntu to build a modular and  
>>> extensible project. Therefore I have a directory called 'modules'  
>>> beneath the project root. In this folder may be an undefined  
>>> number of subfolders containing module sources and CMakeLists.txt  
>>> files. In the CMakeLists.txt in project root, I try to find out  
>>> which modules exist in the modules folder. To do so I'm using  
>>> find_path:
>>>
>>> find_path(MODULE_PATH CMakeLists.txt PATHS modules/*  
>>> NO_DEFAULT_PATH)
>>> get_filename_component(MODULE_NAME ${MODULE_PATH} NAME)
>>>
>>> This works for ONE module, but I want to find ALL modules in the  
>>> directory. The number of modules is not known in advance.
>>>
>>> Has anyone suggestions how to realize this functionality?
>>>
>>> Thanks for your help,
>>>
>>> Tim
>>>
>>
>> You should be using something like
>>
>> FILE(GLOB MODULES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "$ 
>> {CMAKE_CURRENT_SOURCE_DIR}/modules/*")
>> FOREACH(module ${MODULE_PATHS})
>>  IF(IS_DIRECTORY "${module}")
>>    ADD_SUBDIRECTORY("${module}")
>>  ENDIF()
>> ENDFOREACH()
>>
>>
>> HTH
>>
>> Michael
> Hi Michael,
>
> thanks for your fast reply and the code.
>
> Finally I'm using this function:
>
> ---
> function(find_all_modules)
>
>   file(GLOB MODULE_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/modules/*")
>
>   foreach(M ${MODULE_PATHS})
>       if(IS_DIRECTORY "${M}")
>           get_filename_component(MODULE_NAME "${M}" NAME)
>           list(APPEND MODULES_ALL ${MODULE_NAME})
>           message("Found module: ${MODULE_NAME}")
>       endif()
>   endforeach()
>
> endfunction(find_all_modules)
> ---
>
> Best regards,
>
> Tim

Looks good to me. You might want to use the STATUS flag in your  
MESSAGE call though. No flag implies a warning and gets special  
treatment by ccmake and cmake-gui.

Michael


More information about the CMake mailing list