[exim-conf] сборка exim из MacPorts для Mac OS X с поддержкой встроенного perl, сборка dlfunc на Mac OS X

Victor Ustugov victor на corvax.kiev.ua
Пт Янв 25 19:58:58 EET 2013


Victor Ustugov wrote:

>> что касается других параметров сборки - я пока добавил поддержку sqlite
>> и dlfunc в виде штатного для MacPorts механизма variant'ов.
>>
>> пример указания выполнять сборку exim с поддержкой sqlite и dlfunc можно
>> посмотреть в уже упомянутом файле Makefile.local.sample.
> 
> полный набор доступных на текущий момент времени variant'ов в учетом
> сегодняшних изменений по формированию набора применяемых патчей:
> 
> sqlite
> dlfunc
> hide_expand_error
> lmtp_extern
> recursive_acl
> rfc2047_mimelen
> rfc2047_utf8_fix
> rfc2231
> spamd_next_try
> spool_mbox
> user_unknown_defer2fail

добавлен новый variant для сборки exim из MacPorts с поддержкой embedded
perl.

для включения сборки с поддержкой встроенного perl нужно в файл
packages/ports-macosx/exim-4.71_2/Makefile.local добавить строку:

VARIANTS+=+perl


кроме раскомментирования строки "EXIM_PERL=perl.o" в Local/Makefile для
сборки exim из MacPorts с поддержкой встроенного perl пришлось еще
решать проблемы линковки бинарника exim.

проблема связана с тем, что объектный файл build-Darwin-i386/perl.o по
умолчанию собирается сразу для двух архитектур - i386 и x86_64:

# file
/opt/local/var/macports/sources/rsync.macports.org/release/tarballs/ports/mail/exim/work/exim-4.71/build-Darwin-i386/perl.o
/opt/local/var/macports/sources/rsync.macports.org/release/tarballs/ports/mail/exim/work/exim-4.71/build-Darwin-i386/perl.o:
Mach-O universal binary with 2 architectures
/opt/local/var/macports/sources/rsync.macports.org/release/tarballs/ports/mail/exim/work/exim-4.71/build-Darwin-i386/perl.o
(for architecture i386):    Mach-O object i386
/opt/local/var/macports/sources/rsync.macports.org/release/tarballs/ports/mail/exim/work/exim-4.71/build-Darwin-i386/perl.o
(for architecture x86_64):  Mach-O 64-bit object x86_64

причем что важно - i386 указывается ранее x86_64.

а из man ld следует:

   Universal
     The linker accepts universal (multiple-architecture) input files,
but always creates a "thin" (single-architecture), standard Mach-O
output file.  The architecture for the output file is specified using the
     -arch option.  If this option is not used, ld attempts to determine
the output architecture by examining the object files in command line
order.  The first "thin" architecture determines that of the output
     file.  If no input object file is a "thin" file, the native 32-bit
architecture for the host is used.


т. о. при сборке exim с помощью ld последний выбирал ту архитектуру,
которую первую находил в объектных файлах. при этом по умолчанию все
объектные файлы exim'а (кроме perl.o) и все библиотеки из состава
MacPorts собраны под x86_64. а perl.o про мнению ld был собран под i386.

отсюда и проблемы при сборке:

...
/usr/bin/clang -o exim
ld: warning: directory not found for option '-L/usr/local/lib'
ld: warning: directory not found for option '-L/usr/local/lib'
ld: warning: ignoring file acl.o, file was built for unsupported file
format ( 0xcf 0xfa 0xed 0xfe 0x 7 0x 0 0x 0 0x 1 0x 3 0x 0 0x 0 0x 0 0x
1 0x 0 0x 0 0x 0 ) which is not the architecture being linked (i386): acl.o
...
ld: warning: ignoring file /opt/local/lib/libpcre.dylib, file was built
for unsupported file format ( 0xcf 0xfa 0xed 0xfe 0x 7 0x 0 0x 0 0x 1 0x
3 0x 0 0x 0 0x 0 0x 6 0x 0 0x 0 0x 0 ) which is not the architecture
being linked (i386): /opt/local/lib/libpcre.dylib
Undefined symbols for architecture i386:
  "_debug_printf", referenced from:
      _xs_debug_write in perl.o
  "_expand_string", referenced from:
      _xs_expand_string in perl.o
     (maybe you meant: _xs_expand_string)
  "_expand_string_forcedfail", referenced from:
      _xs_expand_string in perl.o
  "_expand_string_message", referenced from:
      _xs_expand_string in perl.o
  "_log_write", referenced from:
      _xs_log_write in perl.o
     (maybe you meant: _xs_log_write)
  "_main", referenced from:
     -u command line option
  "_string_cat", referenced from:
      _call_perl_cat in perl.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
make[1]: *** [exim] Error 1
make: *** [all] Error 2


указывать -arch x86_64 в переменной окружения LFLAGS не имеет смысла, т.
к. при сборке perl.o все равно будут указаны обе архитектуры. а при
указании -arch x86_64 в переменной окружения LFLAGS архитектура x86_64
будет указана два раза.

причина в том, что при сборке perl.o используются переменные PERL_CCOPTS
и PERL_LIBS из файла build-Darwin-i386/Makefile

значения этих переменных формируются скриптом scripts/Configure-Makefile
на основании вывода команд:

/usr/bin/perl -MExtUtils::Embed -e ccopts
и
/usr/bin/perl -MExtUtils::Embed -e ldopts

при этом есть возможность значения данных переменных указать в файле
Local/Makefile.

для этого в файл порта Portfile был добавлен Tcl код, получающий вывод
/usr/bin/perl -MExtUtils::Embed -e ccopts и /usr/bin/perl
-MExtUtils::Embed -e ldopts, убирающий из него "-arch i386" и помещающий
полученные значения в переменные PERL_CCOPTS и PERL_LIBS в файле
build-Darwin-i386/Makefile


а при сборке dlfunc в файле dlfunc/Makefile.Darwin значение для
параметра -arch теперь выбирается не исходя из вывода команды uname, а
исходя из архитектуры, под которую собран exim:

ARCH := $(shell which exim | xargs file | awk '{print $$NF}')


-- 
Best wishes Victor Ustugov   mailto:victor на corvax.kiev.ua
public GnuPG/PGP key:        http://victor.corvax.kiev.ua/corvax.asc
ICQ UIN: 77186900, 371808614 nic-handle: CRV-UANIC






Подробная информация о списке рассылки exim-conf