Установка определений препроцессора с помощью 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