2016-08-11 18 views
5

Tôi có một dự án sử dụng automake để tạo configure và tất cả các tệp có liên quan (Tôi đang sử dụng lệnh autoreconf để thực hiện tất cả nội dung này). Vì vậy, tôi đang cố gắng để thiết lập một số tập tin có điều kiện để biên dịch khi dự án được biên dịch cho macOS (OS X), Windows hoặc Linux. Nhưng nó không thành công như sau:Cách kiểm tra hệ điều hành với tự động

$ autoreconf -i .. 
src/Makefile.am:30: error: LINUX does not appear in AM_CONDITIONAL 
autoreconf: automake failed with exit status: 1 

Và phần có chứa các lỗi trong Makefile.am được như sau:

if OSX 
    butt_SOURCES += CurrentTrackOSX.h CurrentTrackOSX.m 
endif 
if LINUX 
    butt_SOURCES += currentTrack.h currentTrackLinux.cpp 
endif 
if WINDOWS 
    butt_SOURCES += currentTrack.h currentTrack.cpp 
endif 

Câu hỏi của tôi là, làm thế nào tôi có thể kiểm tra nếu hệ điều hành là Linux? Và nếu nó có thể, có cách nào tốt hơn để kiểm tra hệ điều hành trong automake?

+0

Để trở thành pedantic (và pedantry là cần thiết khi giao dịch với autotools), 'automake' không tạo' configure' và không có gì để làm với nó cả. 'automake' tạo' Makefile.in' dựa trên mẫu 'Makefile.am'. –

+0

Có nhiều cách để kiểm tra xem hệ điều hành có phải là Linux hay không, nhưng bạn không quan tâm và bạn không nên quan tâm. Bạn quan tâm đến các tính năng cụ thể của hệ thống, chứ không phải hệ thống là gì. Xác định các tính năng bạn cần, kiểm tra các tính năng cụ thể đó và đừng lo lắng về việc đó là Linux hay OS X hay Windows. Làm như vậy sẽ mạnh mẽ hơn, vì bạn không nên cho rằng tất cả Linux đều giống nhau. –

+0

@William Pursell Cảm ơn bạn đã làm rõ về automake, tôi sử dụng 'autoreconf' để làm cho tất cả các công cụ, và tôi không biết tên chính xác cho nó. Và đối với các tệp này đặc biệt, tôi chỉ cần thư viện C chuẩn. Trên OS X cần AppleScript, chỉ có sẵn ở đó. Và trên Windows không được hỗ trợ trực tiếp (là một chức năng sơ khai). Vì vậy, tôi chỉ cần kiểm tra xem liệu Linux có phải là thư viện C phổ biến trên tất cả Linux hay không. – melchor629

Trả lời

12

Bạn có thể phát hiện nó directly in the Makefile, hoặc xác định các điều kiện trong file nguồn configure (có lẽ configure.ac), kể từ khi bạn đang sử dụng autoreconf:

# AC_CANONICAL_HOST is needed to access the 'host_os' variable  
AC_CANONICAL_HOST 

build_linux=no 
build_windows=no 
build_mac=no 

# Detect the target system 
case "${host_os}" in 
    linux*) 
     build_linux=yes 
     ;; 
    cygwin*|mingw*) 
     build_windows=yes 
     ;; 
    darwin*) 
     build_mac=yes 
     ;; 
    *) 
     AC_MSG_ERROR(["OS $host_os is not supported"]) 
     ;; 
esac 

# Pass the conditionals to automake 
AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"]) 
AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"]) 
AM_CONDITIONAL([OSX], [test "$build_mac" = "yes"]) 

Lưu ý: host_os đề cập đến hệ thống mục tiêu, vì vậy nếu bạn đang biên dịch chéo nó đặt hệ điều hành có điều kiện của hệ thống bạn đang biên soạn thành.

+0

Tôi đã cố gắng để phát hiện nó trực tiếp trong 'Makefile.am' nhưng mang lại cho tôi một lỗi. Không khi sử dụng giải pháp với 'configure.ac'. Cảm ơn vì câu trả lời – melchor629

-3

Bạn đã thử sử dụng lệnh lsb_release để xác định loại và phiên bản hệ điều hành?

+0

Có thể thực hiện thủ thuật. Tôi sẽ thử – melchor629

+1

'lsb' có nghĩa là Linux Standard Base. Bạn có nghĩ rằng lệnh này sẽ có sẵn trên nhiều hệ điều hành khác ..? Nó không phải trên MSYS2/MinGW64, ví dụ, mà làm cho nó vô dụng trong cuốn sách của tôi. 'uname' là một lệnh thích hợp hơn nhiều và có khả năng tồn tại. Nhưng dù sao, lý tưởng là loại kiểm tra này là thứ mà Autotools cần xử lý, thay vì yêu cầu người dùng gọi và phân tích cú pháp một số công cụ khác, ngay cả khi nó có liên quan. (Autotools không phải là _quite_ lý tưởng, mặc dù!) –

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