LINUX.ORG.RU

Как в cmake определить свою xxx_FOUND?

 ,


0

1

Замучился уже: у меня в отдельной поддиректории лежат файлики, которые могут быть вкомпилены в основной проект, если будут найдены определенные библиотеки. А если не будут найдены, то и вкомпиливаться ничего не будет.

Вот весь CMakeLists.txt из поддиректории:

set(IMLIB image_view_module)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} IMSOURCES)

find_package(OpenGL)
find_package(GLUT)

if(GLUT_FOUND AND OPENGL_FOUND)
	add_library(image_view_module ${IMSOURCES})
	target_link_libraries(${IMLIB} ${OPENGL_LIBRARIES} ${JPEG_LIBRARIES} ${GLUT_LIBRARIES} -lm -lpthread)
	include_directories(${${IMLIB}_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIR} ${JPEG_INCLUDE_DIR} ${GLUT_INCLUDE_DIR})
	link_directories(${${IMLIB}_LIBRARY_DIRS})
	set(IMAGEVIEW_FOUND TRUE)
	message("GLUT & OpenGL are found")
else()
	add_definitions(-DIMAGEVIEW)
	set(IMAGEVIEW_FOUND FALSE)
endif()

А в основном CMakeLists.txt я просто пр оверяю переменную IMAGEVIEW_FOUND:

if(IMAGEVIEW_FOUND)
	message("found image view module")
	target_link_libraries(${PROJ} ${${PROJ}_LIBRARIES} -lm ${IMLIB})
else()
	message("not found image view module")
	target_link_libraries(${PROJ} ${${PROJ}_LIBRARIES} -lm)
endif()
Но постоянно получаю «not found».

Пробовал и так: if(${IMAGEVIEW_FOUND}) (хотя это неправильно). Все равно аналогичное поведение.


Как правильно определить эту переменную, чтобы она вела себя аналогично остальным cmake'овским xx_FOUND?

☆☆☆☆☆
Ответ на: комментарий от post-factum

Я погуглил, оказалось, что в поддиректориях создается своя зона видимости и "наружу" переменные не передаются, но если написать PARENT_SCOPE в set, то все будет ОК (правда, наоборот получится: в локальной зоне видимости этой переменной не будет). Вот как переделал:

set(IMLIB image_view_module)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} IMSOURCES)

find_package(OpenGL)
find_package(GLUT)

if(GLUT_FOUND AND OPENGL_FOUND)
	add_library(image_view_module ${IMSOURCES})
	target_link_libraries(${IMLIB} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} -lm -lpthread)
	include_directories(${${IMLIB}_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIR}  ${GLUT_INCLUDE_DIR})
	link_directories(${${IMLIB}_LIBRARY_DIRS})
	set(IMAGEVIEW_FOUND TRUE PARENT_SCOPE)
	set(IMLIB ${IMLIB} PARENT_SCOPE)
	message("GLUT & OpenGL are found")
endif()
а в основном — вот так:
add_subdirectory(image_view_module)
if(IMAGEVIEW_FOUND)
	message("found image view module: ${IMLIB}")
	target_link_libraries(${PROJ} ${${PROJ}_LIBRARIES} -lm ${IMLIB})
	add_definitions(-DIMAGEVIEW)
else()
	message("not found image view module")
	target_link_libraries(${PROJ} ${${PROJ}_LIBRARIES} -lm)
endif()
add_definitions тоже пришлось перенести в него, т.к. наружу оно не распространяется — лишь на локальную сборку.

Eddy_Em ☆☆☆☆☆
() автор топика

Дока такая дока. Плюс, я обычно лажу просто в модули которые поставляются с cmake, на большинстве линухов это /usr/share/cmake-<version>/Modules/Find*.cmake.

Вообщем ты не так готовишь, надо для твоих либ - поисковый модуль сделать, положить их например в <project root>/cmake/Modules/. И прописать такую байду в корневом CMakeLists.txt:

    SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules"
    CACHE PATH "Path to custom CMake Modules")

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

Вот потом из за таких ка ты, все ругают cmake, и говорят что очень сложно поддерживать такую сборку :)

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

А что там сложного? Наоборот же удобно: понаделаешь своих модулей, а потом их целиком директориями пихаешь...

Остается только придумать, как merge gettext'а делать по-человечески.

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

У меня нет библиотек. С чего ты взял? Этот способ, конечно, генерит статическую библиотеку, которая прилинковывается к бинарнику, но это — велоспекд-квадратные-колеса, созданный из-за того, что cmake не умеет по-другому вкомпилировать поддиректории.

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

Как-то не по-людски все. Посоны так не делают. Переменные xxx_FOUND принято использовать только в файндерах. Любое другое использование сбивает с толку. Ты же ищешь именно OpenGL и GLUT, а не свои модули. Зачем тогда для них использовать имена xxx_FOUND?

Сделай лучше в основном CMakeLists.txt пользовательскую опцию типа BUILD_WITH_IMAGEVIEW. Пользователь сможет тогда включить твой модуль аргументом командной строки -DBUILD_WITH_IMAGEVIEW=ON или наоборот отключить через -DBUILD_WITH_IMAGEVIEW=OFF. Если опция не задана явно, тогда решение о вкомпиливании принимается автоматически по результатам поиска OpenGL и GLUT. И так со всеми остальными модулями. В общем как во всех человеческих ./configure делается.

archie
()
Ответ на: комментарий от Eddy_Em

Если либа собирается твоим проектом, то достаточно просто имя цели указать, и она найдётся, зачем что то искать? Это обычный таргет будет, такой же как сорцы, или там выхлоп чего то.

Всё, туплю, речь про файлы.

Как бэ, как ты заметил XXX_FOUND сбивает с толку. Два человека попалось. Ибо это типовой юзекейс. Придумай другое имя что ле.

И алыверды, Find скрипты, как и find_package_handle_standard_args, не только для либ, но и для любых файликов, так что можно всё таки и так(через find модуль). Почитай таки доку :)

pon4ik ★★★★★
()
Последнее исправление: pon4ik (всего исправлений: 5)
Ответ на: комментарий от archie

Зачем тогда для них использовать имена xxx_FOUND?

Затем, что ищу я в своем по сути модуле.

Сделай лучше в основном CMakeLists.txt пользовательскую опцию типа BUILD_WITH_IMAGEVIEW.

Негоже: все равно ведь надо проверить, есть ли в системе opengl и glut, ведь если нет, то нифига и не соберешь!

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

Еще не хватало это убожество тормозное использовать!

Eddy_Em ☆☆☆☆☆
() автор топика

Правильно без переменной вообще: if (TARGET image_view_module)

Dendy ★★★★★
()

файлики, которые могут быть вкомпилены в основной проект, если будут найдены определенные библиотеки

И что мешает сделать всё в одном модуле, соорудив список исходников вместо возни с библиотеками?

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

Затем, что ищу я в своем по сути модуле.

Вот именно, что ты ищешь зависимости модуля, а не сам модуль. IMAGEVIEW_FOUND должно обозначать, найден ли модуль или нет. Но ты модуль не ищешь, ты его вкомпиливаешь. Поэтому имя IMAGEVIEW_FOUND сюда не подходит. Твое понимание имен вида xxx_FOUND отличается от общепринятого, отсюда и непонятки.

Негоже: все равно ведь надо проверить, есть ли в системе opengl и glut

Естественно. Если юзер включил модуль, то ищем OpenGL/GLUT; если они найдены, то вкомпиливаем модуль, иначе выдаем ошибку. Если юзер отключил модуль, то ничего не ищем и не вкомпиливаем. Наконец, если юзер не задал опцию явно, ищем OpenGL/GLUT; если они найдены, то вкомпиливаем модуль, если не найдены, то не вкомпиливаем. Короче аля стандартное поведение ./configure, когда в программе есть необязательные модули/плагины.

archie
()
Ответ на: комментарий от unC0Rr

Кстати да. Если там не полноценный модуль/плагин, а тупо набор файлов для компиляции, то проще в глобальные переменные типа SOURCES/HEADERS дописать нужные имена файлов и не париться со статическими библиотеками.

archie
()
Ответ на: комментарий от unC0Rr

В следующий раз, когда мне нужно будет этот image_view использовать, я просто перетащу из "сниппетов" всю директорию и скомпиляю без извращений с файлами и слияния CMakeLists'ов

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