2015-06-22 16 views
5

Tôi đang xây dựng một dự án cython độc lập nền tảng nơi tôi muốn chuyển trình biên dịch dựa trên trình biên dịch đang được sử dụng. Tôi có thể đoán trình biên dịch dựa trên nền tảng hoặc giả sử nó là trình biên dịch tương tự được sử dụng cho Python nhưng nó không được đảm bảo để phù hợp. Thông thường tôi đưa vào cmdclass arg để thiết lập phương thức setuptool và bọc lệnh install hoặc build_ext để kiểm tra trạng thái bên trong. Nhưng trong trường hợp này tôi phải cythonize các mô-đun mở rộng trước khi tôi đạt đến trình bao bọc.Làm thế nào để xác định trình biên dịch trước khi xác định các phần mở rộng của Python?

Có cách nào để xác định trình biên dịch bên trong setup.py trước khi tạo mô-đun mở rộng không?

+0

bạn không thể chuyển trình biên dịch làm đối số thành setup.py: 'python setup.py build --compiler = mingw32'? – denfromufa

+0

bạn cũng có thể sử dụng cmake để biên dịch mã cython theo cách đa nền tảng: https://github.com/thewtex/cython-cmake-example – denfromufa

+0

@denfromufa Bạn có thể chuyển '--compiler = mingw32', nhưng những người nhận khác của kho lưu trữ sẽ không nhất thiết phải biết những gì để thiết lập các đối số trình biên dịch, hoặc nếu đó là một phụ thuộc của repo khác. Và 'pip install' chắc chắn sẽ không tạo ra một đối số như vậy cho setuptools. Tôi có thể đọc các đối số nếu tôi chỉ sử dụng 'python setup.py install' bản thân mình - đó là sự thật. – Pyrce

Trả lời

2

Sau khi đăng trên diễn đàn cython và tìm kiếm các sự cố có liên quan trong các bản dịch tôi tìm thấy this post cho biết cách di chuyển đối số trình biên dịch sang phân công build_ext. Nếu sau đó tôi loại bỏ tất cả các đối số trình biên dịch từ lớp mở rộng, bây giờ tôi có thể lười biếng gán chúng bên trong lớp lệnh như tôi mong đợi. Tôi cũng có thể nhận được installegg_info các lớp lệnh để gọi phiên bản mới của tôi của build_ext là tốt.

BUILD_ARGS = defaultdict(lambda: ['-O3', '-g0']) 
for compiler, args in [ 
     ('msvc', ['/EHsc', '/DHUNSPELL_STATIC']), 
     ('gcc', ['-O3', '-g0'])]: 
    BUILD_ARGS[compiler] = args 

class build_ext_compiler_check(build_ext): 
    def build_extensions(self): 
     compiler = self.compiler.compiler_type 
     args = BUILD_ARGS[compiler] 
     for ext in self.extensions: 
      ext.extra_compile_args = args 
     build_ext.build_extensions(self) 

... 
setup(
    ... 
    cmdclass={ 'build_ext': build_ext_compiler_check }) 
+0

Điều tương tự dường như hoạt động với '' 'từ setuptools.command.build_ext import build_ext''' (liên kết trước đó có các mâu thuẫn mà mọi người xem là không được chấp nhận hoặc tích hợp đầy đủ vào setuptools ngày nay nếu tôi không nhầm, sửa tôi nếu tôi sai) –

+0

Đúng vậy. Việc nhập khẩu setuptool hoạt động chính xác như nhau và nên được sử dụng thay cho nhập khẩu distutils; mặc dù tôi không biết khi nào các méo thực sự sẽ biến mất hoặc được cho là hoàng hôn vì tôi chỉ nhìn thấy nó được đề cập như là một mong muốn trên các bảng python và không phải là một yêu cầu. – Pyrce

Các vấn đề liên quan