Собственное расширение C, если библиотека доступна - PullRequest
4 голосов
/ 26 июня 2011

Я создаю собственный Ruby-модуль расширения C для генерации уникальных идентификаторов (найдено здесь ). Я хотел бы, чтобы библиотека использовала libuuid , если это возможно (через расширения C), и вернулась к простой реализации Ruby. В настоящее время у меня есть код C и Ruby для генерации UUID, однако я не могу понять, как настроить успешный запасной вариант. Есть идеи?

1 Ответ

3 голосов
/ 26 июня 2011

Метод have_library имеет возвращаемое значение:

Возвращает, может ли указанная точка входа func быть найдена в lib.

Так что вы должны быть в состоянии сделать это:

$defs.push('-DUSE_RUBY_UUID') if !have_library('uuid')
create_makefile("identifier")

И затем настроить ваш C на использование libuuid , если USE_RUBY_UUID не определен, и вызвать вБиблиотека Ruby UUID, если она определена.

Как ни странно, методы have_header и have_func в mkmf.rb добавляют макросы для вас:

# File mkmf.rb, line 840
def have_header(header, preheaders = nil, &b)
  checking_for header do
    if try_header(cpp_include(preheaders)+cpp_include(header), &b)
      $defs.push(format("-DHAVE_%s", header.tr_cpp))
      true
    else
      false
    end
  end
end

но have_library заставляет вас делать это самостоятельно.

...