LINUX.ORG.RU

[Cmake] список поддиректорий

 


0

2

В общем стоит тривиальная задача, пройтись по списку директорий и сделать там какие то действия. Проблема именно с тем что бы пройтись по директориям. В гугле вообще почти ничего нету на эту тему, а то что есть либо неработает, либо опять не то.

И так своял следующее

SET (CMAKE_SOURCE_BIN_DIR ${CMAKE_SOURCE_DIR}/resource/bin)
MESSAGE(STATUS "CMAKE_SOURCE_BIN_DIR = " ${CMAKE_SOURCE_BIN_DIR})
FILE (GLOB LISTS_BIN_DIR RELATIVE ${CMAKE_SOURCE_BIN_DIR} *)
MESSAGE(STATUS "LISTS_BIN_DIR = " ${LISTS_BIN_DIR})
FOREACH (BIN_DIR ${LISTS_BIN_DIR})
	if(IS_DIRECROTY ${CMAKE_SOURCE_BIN_DIR}/${BIN_DIR})
		if (WIN32)
			file(GLOB BIN_FILES ${BIN_FILES} ${CMAKE_SOURCE_BIN_DIR}/${BIN_DIR}/win/*.bat)
		else (WIN32)
			file(GLOB BIN_FILES ${BIN_FILES} ${CMAKE_SOURCE_BIN_DIR}/${BIN_DIR}/linux/*.sh)
		endif()
		MESSAGE(STATUS "BIN_DIR = " ${CMAKE_SOURCE_BIN_DIR}/${BIN_DIR})
		MESSAGE(STATUS "BIN_FILES = " ${CMAKE_SOURCE_BIN_DIR}/${BIN_FILES})
	endif()
ENDFOREACH(BIN_DIR)

но это работает совсем не так как нужно. Почему то на этапе

FILE (GLOB LISTS_BIN_DIR RELATIVE ${CMAKE_SOURCE_BIN_DIR} *)

Я получаю список файлов находящихся в директории из который был запущен CmakeLists (корневой директории проекта CMAKE_SOURCE_DIR) в виде отнросительных путей от директории которую я указал ${CMAKE_SOURCE_BIN_DIR} а это совсем не то что я ожидал получить.

Так как же мне получить список поддиректорий в нужной мне директории ?


FILE (GLOB LISTS_BIN_DIR RELATIVE ${CMAKE_SOURCE_BIN_DIR} *)

Ты неправильно понял RELATIVE. Это влияет на подачу результата, а не на то, ГДЕ искать.

Попробуй FILE (GLOB LISTS_BIN_DIR RELATIVE ${CMAKE_SOURCE_BIN_DIR} ${CMAKE_SOURCE_BIN_DIR}/*)

(Сейчас нет cmake под рукой, чтобы проверить)

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

пиля*ь, я правильно понял суть RELATIVE, не не правильно суть 3 параметра, я думал это как раз то где искать и четвертый это то что искать.

Тогда что же есть 3-й параметр ?

Cupper
() автор топика
Ответ на: комментарий от Cupper

блин туплю, это же путь для RELATIVE :)

Cupper
() автор топика
Ответ на: комментарий от Pavval
MESSAGE(STATUS "CMAKE_SOURCE_BIN_DIR = " ${CMAKE_SOURCE_BIN_DIR})
FILE (GLOB LISTS_BIN_DIR RELATIVE ${CMAKE_SOURCE_BIN_DIR} ${CMAKE_SOURCE_BIN_DIR}/*)
MESSAGE(STATUS "LISTS_BIN_DIR = " ${LISTS_BIN_DIR})
FOREACH (BIN_DIR ${LISTS_BIN_DIR})
	if(IS_DIRECTORY ${CMAKE_SOURCE_BIN_DIR}/${BIN_DIR})
		if (WIN32)
			file(GLOB BIN_FILES ${BIN_FILES} ${CMAKE_SOURCE_BIN_DIR}/${BIN_DIR}/win/*.bat)
		else (WIN32)
			file(GLOB BIN_FILES ${BIN_FILES} ${CMAKE_SOURCE_BIN_DIR}/${BIN_DIR}/linux/*.sh)
		endif()
		MESSAGE(STATUS "BIN_DIR = " ${CMAKE_SOURCE_BIN_DIR}/${BIN_DIR})
		#MESSAGE(STATUS "BIN_FILES = " ${CMAKE_SOURCE_BIN_DIR}/${BIN_FILES})
	endif()
ENDFOREACH(BIN_DIR)

отлично, именно то и так как нужно. Спасибо.

Cupper
() автор топика
Ответ на: комментарий от Cupper

возник еще один душещепательный вопрос, а могули я в цикле генерировать новые переменные таким образом

${${BIN_DIR}_FILES}

т.е. что бы получить переменную вида имя_директории_FILES, вариант который я привел не срабатывает. Не выдает ошибку но и не инициализирует переменную.

Cupper
() автор топика
Ответ на: комментарий от indie

хм... ну а вот не работает и все. Я встречал уже примеры вида ${${VAR}}, значит так точно можно, но пример именно своего вида ${${VAR}_SOME_TEXT} я не встречал. Да и не как не могу заставить это работать.

Cupper
() автор топика
Ответ на: комментарий от Cupper

фак. Тока сейчас обратил внимание что делал так

file(GLOB ${${BIN_DIR}_FILES} ${${BIN_DIR}_FILES} ${CMAKE_SOURCE_BIN_DIR}/${BIN_DIR}/linux/${REGEX_BIN_FILE})

:(

Cupper
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.