Предположим, у меня есть модуль node, который по сути представляет собой оболочку для некоторой стандартной библиотеки C с использованием автоинструментов. Таким образом, библиотека сама по себе будет установлена с использованием ./configure
и make
и, возможно, make install
. Код оболочки состоит всего из нескольких файлов и может быть обработан gyp. Но как я могу справиться с зависимостью? Как я могу указать gyp, что я хочу создать библиотеку autotooled, прежде чем скомпилировать свой код? Или это невозможно, потому что нельзя ожидать, что автоинструменты будут работать в Windows? Если я не могу запустить configure
, есть ли способ сделать что-то подобное, в частности определить, какие функции доступны, а какие нет?
Запускаем configure в gyp-файле
Ответы (2)
С gyp действиями и 'target_type': none
это может выглядеть так:
{
'target_name': 'FTGL',
'type': 'none',
'dependencies': ['FreeType'],
'actions': [
{
'action_name': 'build_ftgl',
'message': 'Building FTGL...',
'inputs': ['ftgl/src/FTGL/ftgl.h'],
'outputs': ['ftgl/src/.libs/libftgl.a'],
'action': ['eval', 'cd ftgl && ./configure --with-pic && make -C src'],
},
],
}
Примечание: использование eval
в действии позволяет запускать несколько команд
Вы можете выполнять произвольные команды внутри gyp, используя расширение командной строки. Однако, как вы заметили, это ненадежно, если вы хотите быть кросс-платформенным.
Как правило, если вы хотите, чтобы он был кроссплатформенным, вам нужно будет gyp-ify свою зависимость. Это означает создание отдельного файла gyp, который включается как зависимость gyp в ваш основной файл binding.gyp
. Это может занять некоторое время, потому что вам нужно перечислить все исходные файлы, которые должны быть скомпилированы, а также добавить все необходимые флаги компиляции для конкретной библиотеки (например, если библиотека использует определения времени компиляции, такие как -Dfoo
).
Вы также можете подумать о том, чтобы сделать зависимость динамической вместо того, чтобы связывать исходный код библиотеки, которую вы оборачиваете, и просто динамически связывать ее с библиотекой. Это намного проще, так как вам не нужно гипировать библиотеку, и вам просто нужно добавить несколько вещей, таких как libraries: ['-lfoo']
, в ваш binding.gyp
.