2013-03-31 8 views
2

У меня есть extconf.rb со следующими строками:Какое правильное использование has_func, когда функции тестирования нуждаются в аргументах?

have_header("cblas.h")     # checking for cblas.h... yes 
have_func("cblas_dgemm", ["cblas.h"]) # checking for cblas_dgemm() in cblas.h... no 
create_header("nmatrix_config.h")  # creating nmatrix_config.h 

Так, cblas_dgemm определенно в cblas.h. Когда я смотрю на mkmf.log, я вижу, что эта проверка выглядит на самом деле две вещи:

  1. _cblas_dgemm символ где
  2. вызываемым cblas_dgemm в cblas.h (?).

Оба теста не работают. Я предполагаю, что первая не работает, потому что мне нужна линия dir_config для cblas и, возможно, have_library('cblas').

Но я не могу понять, как пройти последний тест (см. Строку 24 из gist). Можно ли передать блок до have_func, чтобы он действительно называет его разумными аргументами? Или есть другой способ запустить этот тест? Или мне нужно правильно настроить dir_config?

Вот строка 24, кстати:

conftest.c:7:1: error: too few arguments to function ‘cblas_dgemm’ 

И да, конечно, cblas_dgemm нужно много аргументов - некоторые из них матрицы.

Это расстраивает то, как мало документации есть на любом из этих mkmf функций.

+0

Вы пробовали просто 'has_func ('cblas_dgemm')'? Это может просто попытаться связать что-то, что ссылается на функцию 'cblas_dgemm', без привлечения заголовка вообще. Сначала вам нужно выяснить соответствующие «-l» переключатели. –

+0

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

+0

Почему никто не потрудился переписать 'mkmf'? Он кажется хорошим кандидатом на переписывание. –

ответ

3

К сожалению, это выглядит как have_func это довольно плохо документированы, но на какой-то рытье я нашел то, что может помочь:

[25] pry(main)> have_func("clapack_dgetrf", "/usr/local/atlas/include/clapack.h") 
checking for clapack_dgetrf() in /usr/local/atlas/include/clapack.h... no 
=> false 
[26] pry(main)> have_func("int clapack_dgetrf", "/usr/local/atlas/include/clapack.h") 
checking for int clapack_dgetrf() in /usr/local/atlas/include/clapack.h... yes 
=> true 

Таким образом, по существу, это выглядит, как вы должны включать, по крайней мере, тип возвращаемого значения, чтобы получить have_func для правильной работы. Можете ли вы проверить, что это работает на вашем компьютере?

+0

Спасибо, это очень помогло мне –

0

В mkmf.rb из ruby 1.9.3p392, последнее испытание выполняется только в том случае, если первое не выполнено. Когда первый проходит, have_func успехов. Таким образом, вам не нужно пропустить последний проход. Обратитесь к try_func в mkmf.rb для получения более подробной информации.

Только для информации, в mkmf.rb on 2013-04-13 11:00:25, кажется, вы можете дать такие аргументы: have_func("some_func(some_arg, another_arg)", ["foo.h"]).