2008-10-02 30 views
6

Tôi đang chạy tự động định cấu hình và đặt cấu hình SHELL thành '/ bin/sh'. Điều này tạo ra các vấn đề lớn. Làm thế nào để lực lượng SHELL được '/ bin/bash' cho autoconf?autoconf sử dụng sh, tôi cần SHELL = BASH, làm cách nào để buộc autoconf sử dụng bash?

Tôi đang cố gắng để có được điều này chạy trên OSX, nó hoạt động trên Linux. Linux đang sử dụng SHELL =/bin/bash. osx mặc định là/bin/sh.

Trả lời

7

Tôi có vấn đề tương tự trên Solaris với GCC - và tôi sử dụng 'tiêu chuẩn' kỹ thuật:

CONFIG_SHELL=/bin/bash ./configure ... 

(Hoặc, trên thực tế, tôi sử dụng/bin/ksh, nhưng thiết lập CONFIG_SHELL env var cho phép bạn thông báo các kịch bản tự động cấu hình sẽ sử dụng.)

Tôi đã kiểm tra kịch bản cấu hình cho git và gd (chúng đã được trích xuất) để kiểm tra xem đây có phải là một env var đặc biệt của GCC hay không.

-4

ln -f /bin/bash /bin/sh

:-P (Không, nó không phải là một câu trả lời nghiêm túc. Xin đừng vòi hệ thống của bạn bằng cách thực hiện nó!)

+0

Bạn có thể downvote tôi tất cả các bạn thích; nó chỉ chứng minh bạn không có cảm giác hài hước. :-P –

0

đâu SHELL được thiết lập với điều đó? Những gì đang được chạy với/bin/sh khi bạn muốn/bin/bash?

định cấu hình tập lệnh có nghĩa là chạy bất cứ nơi nào, ngay cả trên vỏ khủng khiếp bị hỏng và không Bash tồn tại trong tự nhiên.

Chỉnh sửa: Vấn đề chính xác là gì?

Chỉnh sửa khác: Có lẽ bạn muốn tập lệnh tự thực thi lại, như thế này. Đây có thể là lỗi:

if test "$SHELL" = "/bin/sh" && test -x /bin/bash; then 
    exec /bin/bash -c "$0" "[email protected]" 
fi 
+0

Vấn đề là đôi khi các kịch bản Cấu hình yêu cầu cú pháp không được Bourne shell hỗ trợ. Kịch bản cấu hình bị hỏng, nhưng đó là cuộc sống trong ngành công nghiệp phần mềm. Tại thời điểm đó, bạn cần thuyết phục Cấu hình để chạy với trình bao chính xác - và yêu cầu CONFIG_SHELL như tôi đã chỉ ra. –

4

"Vấn đề lớn" là gì? autoconf hoạt động rất khó để tạo ra một kịch bản cấu hình hoạt động với một tỷ lệ phần trăm rất lớn các shell. Nếu bạn có một ví dụ về một cấu trúc mà autoconf đang viết mà không phải là di động, hãy báo cáo nó vào danh sách gửi thư autoconf. Mặt khác, nếu các vấn đề bạn đang gặp phải là kết quả của mã shell của riêng bạn trong configure.ac không được di chuyển (ví dụ, bạn đang sử dụng bashisms) thì giải pháp là ngừng sử dụng mã không di động hoặc yêu cầu người dùng đặt rõ ràng SHELL hoặc CONFIG_SHELL tại thời gian định cấu hình.

Có vẻ như sự cố bạn đang gặp phải nằm trong môi trường của người dùng đang chạy định cấu hình. Trên Linux, người dùng của bạn có SHELL được đặt thành/bin/bash, nhưng trên OS X, nó được đặt thành/bin/sh. Kịch bản cấu hình được tạo bởi autoconf thực hiện một số kiểm tra ban đầu của trình bao mà nó đang chạy và cố gắng tự thực hiện lại bằng cách sử dụng một trình bao khác nếu trình bao được cung cấp thiếu một số tính năng nhất định. Tuy nhiên, nếu bạn đang giới thiệu mã shell không di động trong configure.ac, thì bạn đang vi phạm một trong những triết lý chính của autoconf - cụ thể là việc cấu hình các kịch bản nên được di động. Nếu bạn thực sự muốn sử dụng bashisms trong mã shell của mình, thì bạn yêu cầu người dùng chuyển SHELL =/bin/bash làm đối số cho kịch bản cấu hình. Đây không phải là một lỗi trong autoconf, nhưng sẽ được nhiều người coi là lỗi trong quá trình xây dựng dự án của bạn.

+0

Chỉ cần FYI, có thực sự tình huống mà/bin/sh là một vấn đề. Ví dụ, trên AIX, việc sử dụng/bin/sh có thể làm cho một bản dựng mất độ tuổi vì/bin/sh xử lý các bài kiểm tra cấu hình điển hình rất, rất chậm. (Có thể được sửa trong các phiên bản mới hơn, đã đến lúc tôi gặp phải vấn đề cụ thể đó.) – DevSolar

2

Autoconf có nhiệm vụ giải quyết các vấn đề về tính di động bằng cách tạo tập lệnh có thể chạy "ở bất kỳ đâu".Đó là lý do tại sao nó tạo ra mã kỳ lạ như:

if test X$foo = X ; then ... # check if foo is empty 

hơn:

if [ "$x" = "" ] ; then ... 

rằng loại mã crufty lẽ từng được cho phép các kịch bản để chạy trên một số hệ thống Ultrix cổ hoặc bất cứ điều gì.

Tập lệnh định cấu hình không chạy vì sự khác biệt của trình bao giống như cuộc đua Công thức 1 với 10 lít khí và ba lốp dự phòng.

Nếu bạn đang phát triển tập lệnh cấu hình với Autoconf và nhạy cảm với vỏ là Bash hay vỏ OSX, bạn đang làm điều gì sai, hoặc người Autoconf đã phá vỡ điều gì đó. Nếu đó là từ bạn, hãy sửa bất kỳ phần vỏ nào bạn thêm vào tập lệnh bằng cách làm cho chúng có thể di chuyển được.

+0

Sử dụng '" x $ foo "' (với dấu ngoặc kép ngoài tiền tố 'x') thay vì' "$ foo" ' không có gì để làm với các chuỗi rỗng. Nó có liên quan đến các trường hợp "$ foo" có thể đánh giá một thứ có thể trông giống như một tùy chọn kiểm tra như '-f'. – adl

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