2012-09-18 32 views
8

Tôi đang xây dựng lxml trên Mac OS X 10.8.1 và Python 2.7.2 và gặp sự cố. (Tôi đã nhân bản kho lưu trữ Github và làm theo hướng dẫn dành cho Mac OS X tại đây: http://lxml.de/build.html)Tôi đang làm gì sai khi cài đặt lxml trên Mac OS X 10.8.1?

Có vẻ như có gì đó bị treo trong xây dựng libxml2; sau đây là phần đuôi cuối đầu ra thiết bị đầu cuối:

configure: creating ./config.status 
config.status: creating libxml2.spec 
config.status: creating Makefile 
config.status: creating include/Makefile 
config.status: creating include/libxml/Makefile 
config.status: creating doc/Makefile 
config.status: creating doc/examples/Makefile 
config.status: creating doc/devhelp/Makefile 
config.status: creating example/Makefile 
config.status: creating python/Makefile 
config.status: creating python/tests/Makefile 
config.status: creating xstc/Makefile 
config.status: creating include/libxml/xmlversion.h 
config.status: creating xml2-config 
config.status: creating libxml-2.0.pc 
config.status: creating libxml-2.0-uninstalled.pc 
config.status: creating python/setup.py 
config.status: creating config.h 
config.status: executing depfiles commands 
config.status: executing libtool commands 
rm: libtoolT: No such file or directory 
Done configuring 
make all-recursive 
Making all in include 
Making all in libxml 
make[3]: Nothing to be done for `all'. 
make[3]: Nothing to be done for `all-am'. 
Making all in . 
    CC  error.lo 

[snipped]

CC  hash.lo 
parser.c: In function 'xmlParseInNodeContext': 
parser.c:13492: warning: pointer targets in passing argument 1 of 'xmlFindCharEncodingHandler' differ in signedness 
    CC  list.lo 

[snipped]

CC  xpointer.lo 
xpath.c: In function 'xmlXPathRegisterFuncNS': 
xpath.c:4870: warning: ISO C forbids passing argument 4 of 'xmlHashAddEntry2' between function pointer and 'void *' 
xpath.c: In function 'xmlXPathFunctionLookupNS': 
xpath.c:4951: warning: ISO C forbids assignment between function pointer and 'void *' 
xpath.c: In function 'xmlXPathCompOpEval': 
xpath.c:13535: warning: ISO C forbids assignment between function pointer and 'void *' 
xpath.c:13562: warning: ISO C forbids assignment between function pointer and 'void *' 
xpath.c: At top level: 
trionan.c:221: warning: 'trio_is_negative' defined but not used 
    CC  xinclude.lo 

[snipped]

CC  xmlstring.lo 
threads.c: In function 'xmlCleanupThreads': 
threads.c:918: error: expected expression before '{' token 
make[2]: *** [threads.lo] Error 1 
make[2]: *** Waiting for unfinished jobs.... 
make[1]: *** [all-recursive] Error 1 
make: *** [all] Error 2 
Traceback (most recent call last): 
    File "setup.py", line 225, in <module> 
    **setup_extra_options() 
    File "setup.py", line 139, in setup_extra_options 
    STATIC_CFLAGS, STATIC_BINARIES) 
    File "/Users/jedc/Downloads/lxml/setupinfo.py", line 57, in ext_modules 
    multicore=OPTION_MULTICORE) 
    File "/Users/jedc/Downloads/lxml/buildlibxml.py", line 338, in build_libxml2xslt 
    cmmi(libxml2_configure_cmd, libxml2_dir, multicore, **call_setup) 
    File "/Users/jedc/Downloads/lxml/buildlibxml.py", line 266, in cmmi 
    cwd=build_dir, **call_setup) 
    File "/Users/jedc/Downloads/lxml/buildlibxml.py", line 249, in call_subprocess 
    raise Exception('Command "%s" returned code %s' % (cmd_desc, returncode)) 
Exception: Command "make -j5" returned code 512 

tôi m WAY bên ngoài chiều sâu của tôi trong việc cố gắng tìm ra có gì sai ở đây Có ai có thể chỉ cho tôi theo hướng tôi cần làm để sửa lỗi này không?

Trả lời

17

Đây là lỗi trong libxml2 2.9.

Các lỗi mà bạn đang nhận được là trên dòng này:

once_control = PTHREAD_ONCE_INIT; 

Đó là mã bất hợp pháp, mà chỉ xảy ra để làm việc trên Linux. PTHREAD_ONCE_INIT chỉ có thể được sử dụng để khởi tạo, không được chỉ định và có lý do cụ thể cho điều đó: vì vậy, nền tảng có thể xác định PTHREAD_ONCE_INIT làm trình khởi tạo tổng hợp. OS X nào. Từ 10.8.1 của /usr/include/pthread.h:

#define PTHREAD_ONCE_INIT {_PTHREAD_ONCE_SIG_init, {0}} 

Nó trông như thế này đã được báo cáo vào danh sách gửi thư libxml2 cách đây vài ngày (https://mail.gnome.org/archives/xml/2012-September/msg00036. html), được lưu trong bugzilla hai ngày sau đó (https://bugzilla.gnome.org/show_bug.cgi?id=684024) và được sửa vào ngày hôm sau (http://git.gnome.org/browse/libxml2/commit /? id = 3f6cfbd1d38d0634a2ddcb9a0a13e1b5a2195a5e), vì vậy có lẽ 2.9.1 sẽ không có vấn đề này.

Vì vậy, dưới đây là các tùy chọn của bạn:

Tất nhiên bạn có thể đợi 2.9.1 xuất hiện.

Thay thế, mặc dù trang xây dựng nói gì, phiên bản libxml2 đi kèm với Mountain Lion, 2.7.8, không phải là "lỗi thời khủng khiếp" —nó mới hơn phiên bản 2.7.3 mà anh đề xuất sử dụng. Vì vậy, bạn chỉ có thể bỏ qua các --static-deps và sử dụng được xây dựng trong 2.7.8.

Nếu bạn muốn một cái gì đó mới hơn 2.7.8, nhưng không mới như 2.9.0 (không hoạt động), trang xây dựng cho biết cách chỉ định rõ ràng và http://www.xmlsoft.org phải có lịch sử phiên bản ở đâu đó để bạn có thể chọn phiên bản bạn muốn. Ví dụ:

python setup.py build --static-deps \ 
    --libxml2-version=2.8.0 

Hoặc bạn tự có thể áp dụng các bản vá từ http://git.gnome.org/browse/libxml2/commit/?id=3f6cfbd1d38d0634a2ddcb9a0a13e1b5a2195a5e và xây dựng tự kiểm tra, hoặc kéo trên cùng của cây thay vì phiên bản 2.9.0, xây dựng, và sau đó nói với lxml sử dụng xây dựng đó.

Trong tương lai, nếu bạn không muốn phải xử lý các bản dựng lỗi, tôi khuyên bạn chỉ nên sử dụng pip để cài đặt các gói Python và Homebrew để cài đặt bất kỳ phụ thuộc bị thiếu nào.Bạn không phải lúc nào cũng có được bản dựng lý tưởng của phiên bản mới nhất của mọi thứ, nhưng nó sẽ dễ dàng hơn nhiều và thường đủ tốt.

+0

Wow, cảm ơn rất nhiều vì câu trả lời vô cùng toàn diện! Tôi biết tôi đã thử sử dụng pip lúc đầu nhưng nó không hoạt động; Tôi đã thử nó ngay bây giờ và nó đã hoàn thành thành công. (Đầu ra đầu cuối ở cuối = "Cài đặt thành công lxml") Nhưng khi tôi đi vào python và gõ "import lxml" tôi nhận được "ImportError: No module named lxml". Bất kỳ ý tưởng về những gì tôi đang làm sai? –

+1

Bạn có cài đặt không phải của Apple Python nào không? Có thể bạn đang chạy phiên bản pip và python không khớp. Một điều khá phổ biến là bạn kết thúc với/usr/local/bin/pip (hoặc/opt/local/bin/pip, vv) làm pip đầu tiên trên đường dẫn của bạn, và nó cài đặt các module cho/usr/local/bin/python, nhưng sau đó/usr/bin/python là python đầu tiên. – abarnert

+0

Rất có thể tôi đã xoay xở để khắc phục điều đó vào một thời điểm nào đó. Làm thế nào tôi có thể chẩn đoán điều này? (Tôi là một người mới thực sự trên UNIX lệnh/đường dẫn/giao thức!) –