Lỗi khi build package trên El Capitan và cách khắc phục
Python
43
mac os
6
White

studybot viết ngày 05/04/2016

Vấn đề

Mình có dự án python và dùng virtualenv để quản lý packages. Trên MacOS phiên bản Mavericks trở về trước, câu lệnh pip cài đặt không có vấn đề gì. Tuy vậy gần đây phải đem đống code cũ lên môi trường elcapitan mới và khi chạy pip để cài đặt python packages dùng cho việc phát triển thì gặp vấn đề build error.

Cụ thể package mình cần build qua pippython-ldap dùng sasl và khi build thì gặp phải lỗi như sau:

 running build_ext
  building '_ldap' extension
  creating build/temp.macosx-10.11-x86_64-2.7
  creating build/temp.macosx-10.11-x86_64-2.7/Modules
  clang -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/ -DHAVE_SASL -DHAVE_TLS -DHAVE_LIBLDAP_R -DHAVE_LIBLDAP_R -DLDAPMODULE_VERSION=2.4.25 -IModules -I/usr/include -I/usr/include/sasl -I/usr/local/include -I/usr/local/include/sasl -I/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c Modules/LDAPObject.c -o build/temp.macosx-10.11-x86_64-2.7/Modules/LDAPObject.o
  Modules/LDAPObject.c:18:10: fatal error: 'sasl.h' file not found
  #include <sasl.h>
              ^
  1 error generated.
  error: command 'clang' failed with exit status 1
  ----------------------------------------

Lý giải lỗi

Rõ ràng là sasl.h là tập header được cài đặt qua XCode do vậy việc trình cài đặt không tìm thấy file để include chỉ do một khả năng duy nhất là đường dẫn đến file này đã bị thay đổi. Thông thường các File header của thư viện C được lưu trữ ở các đường dẫn cố định và được chuẩn hoá như

/usr/local/include
/usr/include
...

Do vậy việc lỗi này chứng tỏ một trong các đường dẫn trên đã bị xoá khỏi hệ thống.

Tìm hiểu

Sau một hồi Google mình biết được là đường dẫn /usr/include đã được xoá từ MacOSX El Capitan. Các file include này giờ đã có "nhà mới". Việc di dời nhà mới này làm cho các pip không tìm thấy các file header và không thể build được thư viện mình cần dùng. Chi tiết có thể tham khảo các link dưới đây:

  1. http://superuser.com/questions/995360/missing-usr-include-in-os-x-el-capitan
  2. http://stackoverflow.com/questions/22079173/installing-py-ldap-on-mac-os-x-mavericks-missing-sasl-h
  3. http://jose-manuel.me/2015/09/how-to-install-python-ldap-on-mac-os-x-and-solve-sasl-h-error/
  4. Google search...

Giải quyết

Để giải quyết vấn đề mình nghĩ có 2 cách:

  1. Tạo một symlink đến thư mục include có chứa file cần dùng và link đến /usr/include
  2. Ghi đè biến CFLAGS, là biến chứa thông tin thư viện (lib và include) trong quá trình build, thêm đường dẫn đến include

Cách 1 có vẻ không khả thi vì MacOS có SIP để chống việc ghi vào các thư mục hệ thống như: /System, /bin, /sbin, /usr kể cả khi user thực hiện có quyền root. Ta hoàn toàn có thể disable SIP nhưng có vẻ đấy không phải là giải pháp tốt.

Cách 2 có vẻ cách giải quyết đơn giản hơn và an toàn hơn. Mình chọn cách giải quyết 2.

Tìm đường dẫn include mới

Đường dẫn đến thư mục include trong MacOS có thể biến bằng câu lệnh sau:

$ xcrun --show-sdk-path
$ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk

Ghi đè

$ export CFLAGS=-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/sasl

Sau khi ghi đè xong, chạy pip lại và mọi thứ lại trở nên êm ru; package lại được cài đặt như bình thường.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

studybot

15 bài viết.
9 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
14 12
Một vài thủ thuật vim mới biết, ghi lại cho khỏi quên Căn lề các cột dữ liệu Để căn lề ấn phím esc (để sang command mode) :%column t Chọn th...
studybot viết hơn 3 năm trước
14 12
White
11 9
Javascript context (ngữ cảnh?) là một khái niệm khó hiểu trong Javascript. Tuy vậy để code Javascript thành thạo thì việc nắm vững context là điểu ...
studybot viết hơn 3 năm trước
11 9
White
9 1
Một vài ghi chép về Java Hotspot GC Garbage collector thực hiện việc quản lý bộ nhớ thông qua 3 công việc: Gán đối tượng vào pool các đối tượng m...
studybot viết hơn 3 năm trước
9 1
Bài viết liên quan
White
1 0
Mở đầu Như đã nói ở bài trước, mình đang nghiên cứu về Spark nên cần log lại một số thứ để dành sau này dùng đến :smile: Đối tượng hướng đến vẫn ...
Phạm Quốc Thắng viết hơn 2 năm trước
1 0
White
5 3
Observer pattern (python example) 1. Observer là gì : Theo như (Link) Observer Pattern là : A software design pattern in which an object, calle...
Khôi Trọng Nguyễn viết 2 năm trước
5 3
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
15 bài viết.
9 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!