Установка определений препроцессора с помощью extconf.rb

Я пишу расширение C для Ruby, и у меня есть что-то вроде этого в файле extconf.rb:

if(not have_library('z'))
        $stderr << "Error, could not locate zlib.\n"
        abort "Missing zlib"
end

Таким образом, процесс установки прерывается, если отсутствует zlib. Вместо этого, поскольку мое расширение может работать с AND без zlib, я хотел бы сделать что-то вроде следующего;

if(have_library('z'))
        # do something so that -DHAVE_ZLIB is passed to the compiler
        # when compiling the extension.
end

Как я могу это сделать?

РЕДАКТИРОВАТЬ: Вопрос в комментарии в операторе if... end: как добавить определение -DHAVE_ZLIB для компилятора?

2 ответа

Решение

Если вы можете положиться на проверку файла заголовка, то have_header определит HAVE_HEADER_H Макрос для тебя. Например:

have_header('zlib.h')

определит HAVE_ZLIB_H, который вы затем можете ссылаться в своем коде.

Если этого недостаточно или вам нужно определить макрос по какой-то другой причине, вы можете использовать $defs Глобальный:

if(have_library('z'))
  $defs << '-DHAVE_ZLIB'
  # Now HAVE_ZLIB will be defined for you to check in your code
end

Я бы сделал это следующим образом extconf.rb файл

$libs = ["-lliba", "-llibb"]
if have_library('z')
  # where $libs is your array of libraries defined
  $libs << "-llibz"
end

Как вы можете видеть в документации API для have_library, метод have_library возвращает true или false

Другие вопросы по тегам