LINUX.ORG.RU

[automake/autoconf] Проверка наличия CUDA


0

0

Подскажите, пожалуйста, как autoconf'ом определить, установлены ли в системе библиотеки CUDA и nvcc? Файла-описания для pkg-config я не нашел, гугл тоже ничего вразумительного не подсказал (я нашел какие-то патчи для automake и libtool, но неужели без этого нельзя?)...

☆☆☆☆☆

бинарники ищутся с помощью AC_PATH_PROG. Библиотеки проверяются с посмощью AC_CHECK_LIB. CUDA, как я помимаю, ставит libcuda.so.ВЕРСИЯ и ссылки в /usr/lib, так что проверяй как-то так:

AC_CHECK_LIB([cuda], [clInit], [меняем CFLAGS и LDFLAGS если найдено], [])

Пример собственно есть тут

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

А вот проблема в том, что по умолчанию CUDA устанавливается в /usr/local/cuda, а там уже создаются директории bin, lib, include и т.п. А как узнать этот префикс (т.е. /usr/local/cuda или /usr/local/share/cuda или какой он там еще может быть) - непонятно.

По ссылке «спер» нужный кусок, получаю:

checking cuda.h usability... no
checking cuda.h presence... no
checking for cuda.h... no
checking cuda_runtime_api.h usability... no
checking cuda_runtime_api.h presence... no
checking for cuda_runtime_api.h... no
, хотя все у меня есть...

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

естественно, т.к. эти команды ищёт по стандартным путям, откуда они знают, что CUDA у тебя имеет свой собственный префикс установки. Не знаю как ты ставил саму cuda, но в Debian cuda_runtime_api.h лежит в пакете nvidia-cuda-dev и устанавливается в /usr/include/cuda_runtime_api.h, и должна нормально находится через AC_CHECK_HEADERS.

Ты как CUDA ставил?

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

Ты как CUDA ставил?

Запустил cudasdk, пути оставил по умолчанию. Естественно, ставил из бинарника, т.к. качать rpm'ы для моей мандривы замучаюсь (там зависимостей 100500).

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

Да и все было бы без проблем, если бы эти сволочи (nVidia) помещали в cudasdk еще и параметры для pkg-config: достаточно было бы указать возможное местоположение этого файла и проверять спокойно через PKG_CHECK_MODULES...

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

Запустил cudasdk, пути оставил по умолчанию


FAIL. Пути пропиши какие надо - скорее всего это /usr.

т.к. качать rpm'ы для моей мандривы замучаюсь (там зависимостей 100500)


разве в мандриве нельзя доустановить сломаные зависимости через местный пакетный менеджер? Ставишь пакет с CUDA и доставляешь сломанные зависимости.

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

FAIL. Пути пропиши какие надо - скорее всего это /usr.

Снесу старую, установлю новую. Но не факт, что на всех машинах она будет установлена так. Поэтому-то и хотелось как-то автоматизировать поиск, куда оно установлено (хотя, конечно, это можно сделать через configure --cudapath=/path/to/CUDA, так, наверное, и сделаю)...

разве в мандриве нельзя доустановить сломаные зависимости через местный пакетный менеджер? Ставишь пакет с CUDA и доставляешь сломанные зависимости.

Я его не использую: интернет медленный и дорогой, большинство нужных мне утилит/библиотек, которых не было на диске с дистрибутивом я устанавливаю из местного репозитория дженты.

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

>От autotools сейчас все отказываются.

Что-то из туевой хучи прог, которые довелось собирать, только openbabel перешел с автотулзов на cmake.

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

autotools вообще не надо было начинать осваивать. это некроссплатформенное говно мамонто, которое, я надеюсь, скоро подохнет

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

autotools вообще не надо было начинать осваивать. это некроссплатформенное говно мамонто, которое, я надеюсь, скоро подохнет

А мне плевать на кроссплатформенность, мне кроме линукса ничего не нужно.

чего тебя смутило?

То, что вместо нескольких понятных строк для configure.ac и makefile.am нужно писать уйму непонятного...

И, кстати, если бы cmake был популярен, не думаю, что основная масса пакетов была бы собрана с autotools...

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

А мне плевать на кроссплатформенность, мне кроме линукса ничего не нужно.

линуксятники такие линуксятники

То, что вместо нескольких понятных строк для configure.ac и makefile.am нужно писать уйму непонятного...

project(hello)
add_executable(hello hello.c)

Ну и где уйма строк? И вместо кучи сущностей (automake,autoconf,autoheader,auto.....) надо изучать всего лишь одну.

И, кстати, если бы cmake был популярен, не думаю, что основная масса пакетов была бы собрана с autotools...

Переписывать уже написанное никто не хочет, а в новых проектах autocrap уже никто не использует.

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

Может, кроме cmake еще чего надо изучить? Чтобы не было такой же лажи, как с autotools?

gettext, как я понимаю, пока не RIP. Gtk третий от второго не сильно отличается (в том, что мне нужно), так что тоже можно использовать. OpenGL последний стоит изучать, или 3.3 пойдет? Библиотека GSL еще жива, или что-то более новое есть?

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

Что-то я там тарбол найти не могу: только баш-скрипт.

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

С cmake практически не напрягаешь мозг сборкой проекта и остается куча времени чтобы изучить вышеозвученное, кстати cmake это все поддерживает.

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

Ну, попробую это

AC_INIT([fitsview], [0.0.1])
AC_CONFIG_SRCDIR([src/fitsview.c])
AM_INIT_AUTOMAKE([foreign])
AM_CONFIG_HEADER([src/include/config.h])
AC_GNU_SOURCE

AC_CONFIG_FILES([Makefile src/Makefile])

AC_PROG_CC
AC_ISC_POSIX
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
CFLAGS="$CFLAGS -std=c99"

# Checks for OpenGL
PKG_CHECK_MODULES(GLUT, [glut >= 3.7.0])
CFLAGS="$GLUT_CFLAGS $CFLAGS"
LDFLAGS="$GLUT_LIBS $LDFLAGS"
GLUT_VERSION="$($PKG_CONFIG --modversion glut)"

# Checks for GtkGLExt.
PKG_CHECK_MODULES(GTKGLEXT, [gtkglext-1.0 >= 0.7.0])
CFLAGS="$GTKGLEXT_CFLAGS $CFLAGS"
LDFLAGS="$GTKGLEXT_LIBS $LDFLAGS"
GTKGL_VERSION="$($PKG_CONFIG --modversion gtkglext-1.0)"

PKG_CHECK_MODULES(GTKGLEXTX11, [gtkglext-x11-1.0 >= 0.7.0])
CFLAGS="$GTKGLEXTX11_CFLAGS $CFLAGS"
LDFLAGS="$GTKGLEXTX11_LIBS $LDFLAGS"
GTKGLX11_VERSION="$($PKG_CONFIG --modversion gtkglext-x11-1.0)"

# Checks for gtk.
AM_PATH_GTK_2_0([2.6.0], [
  CFLAGS="$GTK_CFLAGS $CFLAGS"
  LDFLAGS="$GTK_LIBS $LDFLAGS"
  GTK_VERSION="$($PKG_CONFIG --modversion gtk+-2.0)"
 ], [exit 1], [gthread])

# Checks for cfitsio.
PKG_CHECK_MODULES(CFITSIO, [cfitsio >= 3.0])
CFLAGS="$CFITSIO_CFLAGS $CFLAGS"
LDFLAGS="$CFITSIO_LIBS $LDFLAGS"
CFITSIO_VERSION="$($PKG_CONFIG --modversion cfitsio)"

# Checks for liblept
PKG_CHECK_MODULES(LIBLEPT, [liblept >= 1.0])
CFLAGS="$LIBLEPT_CFLAGS $CFLAGS"
LDFLAGS="$LIBLEPT_LIBS $LDFLAGS"
LIBLEPT_VERSION="$($PKG_CONFIG --modversion liblept)"

#Check for GSL
PKG_CHECK_MODULES(GSL, [gsl >= 1.10])
CFLAGS="$GSL_CFLAGS $CFLAGS"
LDFLAGS="$GSL_LIBS $LDFLAGS"
GSL_VERSION="$($PKG_CONFIG --modversion gsl)"


AM_GNU_GETTEXT

AC_OUTPUT
echo -e "\nUsing:"
echo -e "\tglut library $GLUT_VERSION"
echo -e "\tGTK+ $GTK_VERSION with GtkGLExt $GTKGL_VERSION & GtkGLExt-X11 $GTKGLX11_VERSION"
echo -e "\tlibcfitsio $CFITSIO_VERSION"
echo -e "\tLeptonica library (liblept) $LIBLEPT_VERSION"
echo -e "\tGSL $GSL_VERSION\n"
и это
bin_PROGRAMS = fitsview
C_SRCS = 	fitsview.c fits.c opengl.c gtk.c	\
			tracking.c imtools.c spots.c		\
			gauss.c open_dialog.c fitsheaders.c
H_SRCS = $(C_SRCS:%.c=include/%.h)
fitsview_SOURCES = $(C_SRCS)
localedir = @localedir@
DEFS = -DLOCALEDIR=\"$(localedir)\"  @DEFS@
#DEFINES = -DGETTEXT_PACKAGE=\"$(bin_PROGRAMS)\" -DLOCALEDIR=\"./locale\"
AM_CPPFLAGS = -Wall -Werror -W -Iinclude -DEBUG $(DEFINES)

MO_FILE = locale/ru/LC_MESSAGES/fitsview.mo
RU_FILE = locale/ru/ru.po
PO_FILE = locale/ru/messages.po

OBJS = $(C_SRCS:%.c=%.o)
$(OBJS): $(MO_FILE)
UI.SRC = fitsview.glade
UI.UI = fitsview.ui

ui.h: $(UI.SRC)
	gtk-builder-convert $(UI.SRC) $(UI.UI)
	echo "const gchar *ui = `sed -r 's/^[[:space:]]*//;s/\"/\\\\\"/g;s/(^.*$$)/\"&\"/' $(UI.UI)` ;" > ui.h

$(PO_FILE): $(C_SRCS)
	$(XGETTEXT) --from-code=koi8-r $(fitsview_SOURCES) fitsview.glade -k_ -o $(PO_FILE)

$(MO_FILE): $(RU_FILE)
	$(MSGFMT) $(RU_FILE) -o $(MO_FILE)

$(RU_FILE): $(PO_FILE)
в cmake переделать, да еще и cuda туда добавить... Кстати, нашел у себя cmake'овские инструкции для CUDA...

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

кстати вот это вообще делает твою сборку работающей только на твоей системе и на других линухах ничего не заведется

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

Reset ★★★★★
()
Ответ на: комментарий от Eddy_Em
cmake_minimum_required(VERSION 2.8)
project(f)
find_package(PkgConfig REQUIRED)
find_package(OpenGL REQUIRED)
find_package(CUDA REQUIRED)
pkg_check_modules(XXX REQUIRED 
        glib-2.0>=2.10 
        gtkglext-1.0>=0.7.0 
        gtkglext-x11-1.0>=0.7.0
        gtk+-2.0>=2.6.0
        cfitsio>=3.0
        gsl>=1.0)
include_directories(${XXX_INCLUDE_DIRS})
link_directories(${XXX_LIBRARY_DIRS})
cuda_add_executable(hello hello.c)
target_link_libraries(hello ${XXX_LIBRARIES})
set_target_properties(hello PROPERTIES COMPILE_FLAGS ${XXX_CFLAGS})
Reset ★★★★★
()
Ответ на: комментарий от Reset

А makefile.am? :)

Ладно. Почитаю на досуге, что за зверь такой этот cmake, может, и правда ничего там сложного нет...

кстати вот это вообще делает твою сборку работающей только на твоей системе и на других линухах ничего не заведется

Это для всяких GSL'ов, которые по-умолчанию «не туда» встают. Можно, конечно, добавить и стандартную директорию в PKG_CONFIG_PATH, но мне казалось, что pkg-config ее проверяет вне зависимости от этой переменной.

это жесть

А чего там жестокого? Использую openGL, gtk+gtkglext, cfitsio, leptonica, gsl, gettext. Вот и приходится все проверять. Да еще и в makefile конвертировать glade'овский UI в заголовочный файл и gettext обновлять...

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

Спасибо, вечером, если будет время, попытаюсь разобраться с cmake.

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

Почти разобрался, но не получается в режиме отладки автоматом запускать gettext и msgfmt. CMakeLists.txt такой:

cmake_minimum_required(VERSION 2.6)
set(_VERSION -DPACKAGE_VERSION="0.0.1")
set(_PACKAGE -DGETTEXT_PACKAGE=\"${PROJ}\")
set(_LOCALE -DLOCALEDIR=\"./locale\")
set(DEBUG -DEBUG)
set(SOURCES fitsview.c fits.c opengl.c gtk.c
			tracking.c imtools.c spots.c
			gauss.c open_dialog.c fitsheaders.c)
set(CUFILES mine.cu)
set(CFLAGS -O3 -Wall -Werror -W -std=c99)
set(LCPATH locale/ru)
set(PO_FILE ${LCPATH}/messages.po)
set(MO_FILE ${LCPATH}/LC_MESSAGES/${PROJ}.mo)
set(RU_FILE ${LCPATH}/ru.po)
find_package(PkgConfig REQUIRED)
find_package(OpenGL REQUIRED)
find_package(GTK REQUIRED)
find_package(CUDA REQUIRED)
pkg_check_modules(${PROJ} REQUIRED 
        glib-2.0>=2.10 
        gtkglext-1.0>=0.7.0 
        gtkglext-x11-1.0>=0.7.0
        gtk+-2.0>=2.6.0
        cfitsio>=3.0
        liblept>=1.0
        gsl>=1.0)
cuda_add_executable(${PROJ} ${SOURCES} ${CUFILES})
target_link_libraries(${PROJ} ${${PROJ}_LIBRARIES})
include_directories(include ${${PROJ}_INCLUDE_DIRS})
link_directories(${${PROJ}_LIBRARY_DIRS})
add_definitions(${_LOCALE} ${DEBUG} ${CFLAGS} ${_VERSION} ${_PACKAGE})

if(DEFINED DEBUG)
	find_package(Gettext REQUIRED)
	find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
	if(NOT GETTEXT_XGETTEXT_EXECUTABLE )
		  message(FATAL_ERROR "xgettext not found")
	endif(NOT GETTEXT_XGETTEXT_EXECUTABLE )
	add_custom_command(
		OUTPUT extract_pot
		PRE_BUILD
		MESSAGE "Extracting pot file"
		COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE}
		ARGS --from-code=koi8-r ${SOURCES} fitsview.glade -k_ -kN_ -o ${PO_FILE}
		DEPENDS ${SOURCES})
	add_custom_command(
		OUTPUT compile_mo
		PRE_BUILD
		MESSAGE "Compiling pot file"
		COMMAND ${GETTEXT_MSGFMT_EXECUTABLE}
		ARGS ${RU_FILE} -o ${MO_FILE}
		DEPENDS ${RU_FILE})
#	add_custom_target(all DEPENDS extract_pot compile_mo ${PROJ})
endif(DEFINED DEBUG)
Если раскомментировать предпоследнюю строку, цели extract_pot и compile_mo вызываются при каждом make, вне зависимости от состояния их зависимостей (простите за тавтологию). Это и понятно из смысла add_custom_target. А вот как сделать, чтобы они вызывались лишь когда надо, т.е. как сделать аналог
OBJS = $(C_SRCS:%.c=%.o)
$(OBJS): $(MO_FILE)
?

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

И еще вопрос: в automake можно было при помощи ключей ./config изменять значения некоторых переменных (например, путей установки), а как это в cmake сделать?

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

Опять ужас получился.

set(CFLAGS -O3 -Wall -Werror -W -std=c99)
set(DEBUG -DEBUG)
add_definitions(${_LOCALE} ${DEBUG} ${CFLAGS} ${_VERSION} ${_PACKAGE})
...........................^^^^^^^^^^^^^^^^^^
это всё убирать нафиг, ибо профили Debug и Release есть и умолчальные настройки в них почти такие как тебе надо.

if(DEFINED DEBUG)]

Внутри if'а как-то все переусложнено. Второй add_custom_command надо точно убирать и заменять на GETTEXT_CREATE_TRANSLATIONS. У add_custom_target у тебя что-то не то с зависимостями. Сходу сейчас сказать не могу, может завтра утром гляну.

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

cmake -DVAR=value

А я делаю в директории сборки файл settings.cmake и в корневом CMakeLists.txt проверяю его наличие. Если файл присутствует, то настройки беру из него.

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

Если это компиляция ui, то поищи какой-нибудь FindGlade для cmake. Наверняка уже всё написано.

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

Что-то с CMAKE_BUILD_TYPE я не разобрался: мне вместо if(DEFINED DEBUG) нужно проверять if(CMAKE_BUILD_TYPE == «Debug») что ли?

Далее, вызов GETTEXT_CREATE_TRANSLATIONS(${RU_FILE} ${MO_FILE}) не работает. Не очень понятно, что с этим делать.

Если это компиляция ui, то поищи какой-нибудь FindGlade для cmake. Наверняка уже всё написано.

Ничего такого не нашел.

Ладно, посижу еще полчасика...

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

С «автовызовом» команд gettext'а и gtk-builder'а разобрался так:

cuda_add_executable(${PROJ} ${SOURCES} ${CUFILES} ${PO_FILE} ${MO_FILE} ui.h)
...
add_custom_command(
	OUTPUT ${PO_FILE}
	COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE} --from-code=koi8-r ${SOURCES} fitsview.glade -k_ -kN_ -o ${PO_FILE}
	DEPENDS ${SOURCES})
add_custom_command(
	OUTPUT ${MO_FILE}
	COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} ${RU_FILE} -o ${MO_FILE}
	DEPENDS ${RU_FILE})
add_custom_command(
	OUTPUT ui.h
	COMMAND gtk-builder-convert ${PROJ}.glade ${PROJ}.ui
	COMMAND ./genh ${PROJ}.ui
	DEPENDS ${PROJ}.glade)
Вызов sed'а пришлось запихать в отдельный скрипт, потому что от вычисления нужного количества обратных слешей у меня чуть голова не разлетелась, но за полчаса я эту строчку так и не осилил воткнуть непосредственно после COMMAND.

Но все заработало, криво, косо, но движется.

Огромное спасибо всем, особое спасибо - Reset'у.

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

> autotools вообще не надо было начинать осваивать. это некроссплатформенное говно мамонто, которое, я надеюсь, скоро подохнет

Это ваш CMake некросплатформенное говно, которое, я надеюсь, скоро подохнет.

anonymous
()
Ответ на: комментарий от tailgunner

На любом языке можно писать на фортране вот также и тут :)

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

Оборачивать надо это все в макросы и выносить в отдельный .cmake файл, чтобы потом можно было заюзать из другого проекта. Вот стандартный макрос, который я много для чего раньше использовал пока это «много чего» не появилось в составе самого cmake.

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

Что-то мне кажется, что результат ничуть не лучше autoconf

Есть пара плюсов: cmake лучше ищет всякие бинарники/библиотеки и выполняется намного быстрее, чем ./config. Хотя, синтаксис у него, конечно, тоже не сильно-то и выигрышный.

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

Спасибо, но с этими макросами в данном случае только больше объем cmake-файлов выйдет. Оно и так работает :)

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

Макросы в отдельный файл выноси. Они же reusable. Потом в другом проекте просто заинклудишь и будешь использовать.

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

Пока у меня руки до другого проекта дойдут... Но за советы спасибо. cmake мне понравился больше, чем autotools: как-то он гибче, что ли... Правда, опять читать черт знает сколько, чтобы понять, как то или иное действие сделать, но без этого никуда.

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

Если кому интересно, на «просторах интернета» обнаружил, как определить количество ядер на целевой системе:

set(cpuinfo_file "/proc/cpuinfo")
if(EXISTS "${cpuinfo_file}")
   file(STRINGS "${cpuinfo_file}" procs REGEX "^processor.: [0-9]+$")
   list(LENGTH procs PROCESSOR_COUNT)
endif()
Теперь для no-CUDA-вариантов функций смогу наиболее оптимально выставить количество параллельно выполняемых потоков.

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