2010-01-20 2 views
3

На OpenSolaris ($^O eq 'solaris', версия 2.11), я пытаюсь создать модуль XS, который использует спецификацию XPGv4v2/Single Unix. понимание struct msghdr, в частности, для опроса «вспомогательных данных».конфликт определения структуры между модулем XS и построением perl

Однако родной Perl (v5.8.4) был построен без необходимых определяет, и поэтому struct msghdr видны в моем файле XS является старшим, BSD вид ::

#include "EXTERN.h" 
#include "perl.h"  /* older, "msg_accrights"-style msghdr now visible */ 
#include "XSUB.h" 

.... 
    struct msghdr m; 
    m.msg_control = buf; /* ERROR, structure has no member named "msg_control" */ 
.... 

Поставляя «право» #define s (_XOPEN_SOURCE и _XOPEN_SOURCE_EXTENDED) разрушает сборку, поскольку она меняет очень много вещей, которые ожидал Perl.

Есть ли элегантный способ, которым я могу использовать модуль XS, используя определение структуры, которое мне бы хотелось?

+0

Есть ли вероятность, что вы можете построить новый Perl, а затем построить свою модель XS против этого? – Ether

+0

@ Другое, да, но я хотел бы, чтобы модуль был доступен для систем OpenSolaris, которые не могут запустить перестроенный perl, если но все же возможно. – pilcrow

ответ

2

Вы либо должны использовать определения, которые ваш существующий perl понимает, либо скомпилировать новый perl с теми определениями, которые вы хотите.

Вам не нужно заменять существующий perl. Вы можете установить новый perl отдельно, чтобы они не конфликтуют.

Если вам нужно это в обоих направлениях, вам нужно выяснить, какие определения у вашего Perl есть и написать код, который обрабатывает правильный набор определений. Вы можете добавить слой абстракции, чтобы вы могли реализовать базовые бит с помощью набора определений. Вероятно, много повторного кода, но, к сожалению, это переносимость. :(

+0

+1 Однако вы подтолкнули меня в другом направлении, и я думаю, что будет четкий вопрос о последующих действиях. – pilcrow