Là trực tiếp sử dụng Làm cho coi là lỗi thời? [đóng cửa]


31

Vì vậy, tôi đã bắt gặp rất nhiều bình luận / bài đăng / vv liên quan đến việc tạo ra các tệp tạo tệp trực tiếp và đó là một điều ngớ ngẩn phải làm trong năm 2015. Tôi biết về các công cụ như CMake và tôi thực sự sử dụng CMake khá thường xuyên. Vấn đề là, CMake chỉ đang tạo Makefile cho bạn và giúp loại bỏ sự nhàm chán khi tự làm việc đó. Tất nhiên nó bổ sung rất nhiều tính năng tuyệt vời khác ... nhưng cuối cùng nó vẫn là một Makefile.

Vì vậy, câu hỏi của tôi là, cuộc nói chuyện 'lỗi thời' liên quan đến việc đề cập đến toàn bộ tiện ích Make, hay chỉ là ý tưởng tự viết Makefiles của riêng bạn? Tôi hoàn toàn không sử dụng IDE để phát triển C / C ++ (chỉ là emacs), vì vậy tôi luôn viết Makefiles.

Nếu Make bị coi là lỗi thời, nhà phát triển C / C ++ nên sử dụng gì để xây dựng các dự án nhỏ, cá nhân?


8
Đối với các dự án nhỏ, cá nhân, makekhông có Makefile là đủ. Những gì rắc rối?
ott--

8
Mỗi phần mềm có sẵn trên các hệ thống FreeBSD của tôi, cả máy tính để bàn và máy chủ, đều có một Makefile được bắt đầu bằng 'make'. Không. "Làm" không lỗi thời.
Rob

3
Mọi người có thể sử dụng IDE miễn phí, nhưng nếu IDE của họ không thể hỗ trợ các dự án sử dụng Makefiles gần 40 năm sau khi makeđược viết lần đầu tiên, thì họ không nên mong mọi người làm việc xung quanh điều đó.
Miles Rout

1
" Cuộc nói chuyện lỗi thời liên quan đến việc thực hiện" chỉ là một triệu chứng hoặc một điểm đau , không phải là một tuyên bố về sự phản đối. Đặc biệt là khi chưa có sự thay thế hoàn toàn vượt trội và tất cả các cách tiếp cận để giảm đau vẫn sử dụng theo một số cách, chỉ ẩn với những người dùng dễ bị đau nhất. Mặc dù rất nhiều câu trả lời tốt đã được đưa ra, bản thân câu hỏi là dựa trên quan điểm.
rwong

1
CMakelà một lớp trừu tượng. Sự trừu tượng hóa này là cần thiết để chế ngự sự đa dạng của các sản phẩm IDE tiêu dùng không tuân thủ nguồn mở Makefile. Một lần nữa, nó không chỉ trừu tượng mà còn cho phép các tính năng cấu hình (như autoconf). Giống như các khái niệm trừu tượng khác, nó cho phép thay thế . Nhưng nó mở đường cho ý tưởng thử nghiệm mới về các lựa chọn thay thế của Makefile dễ dàng có sẵn cho người dùng CMake.
shuva

Câu trả lời:


30

Sự khác biệt lớn là CMake là một hệ thống xây dựng meta đa nền tảng . Một dự án CMake duy nhất có thể tạo ra tệp tạo tệp Unix / Linux thông thường, dự án Visual Studio cho Windows, dự án XCode cho Mac và hầu hết mọi hệ thống xây dựng phi meta khác mà bạn có thể muốn sử dụng hoặc hỗ trợ.

Tôi không nói việc sử dụng makefiles trực tiếp hoặc thậm chí chỉnh sửa thủ công là "lỗi thời", nhưng đó là những điều bạn có thể không nên làm trừ khi bạn đang làm việc trên các công cụ Unix / Linux không cần chuyển sang Windows, giống như cách bạn không nên chỉnh sửa trực tiếp các tệp dự án Visual Studio nếu bạn muốn chuyển chúng sang Windows không. Nếu bạn có hứng thú với tính di động, đáng để tìm hiểu một hệ thống xây dựng meta như Scons hoặc CMake.


9
POSIX makecũng đa nền tảng.
Blrfl

6
@Blrfl điều này có thể đúng, nhưng nhìn chung bạn sẽ thấy các dòng lệnh bạn cần sử dụng để biên dịch và / hoặc liên kết dự án của bạn là dành riêng cho nền tảng, ngay cả khi tất cả các nền tảng bạn nhắm mục tiêu đều tuân thủ POSIX và ngay cả khi bạn Chúng tôi đang sử dụng cùng một trình biên dịch (vẫn sẽ có những vấn đề rắc rối với các vị trí bao gồm các tệp, cho dù bạn cần -lm, -lnslv.v. hoặc liệu các phương tiện đó có được bao gồm trong thư viện C, v.v.) không.
Jules

5
@Jules Có nhiều hơn (hoặc ít hơn) CMake, về cơ bản nó phù hợp với việc tạo ra ứng dụng mô-đun chuẩn, tiêu chuẩn của bạn cho các hệ thống có trình tải ELF và cung cấp trừu tượng cho tất cả các công cụ cần thiết cho chuỗi công cụ cụ thể đó. Nếu bạn khởi hành từ chuỗi công cụ đó (ví dụ: tập lệnh liên kết tùy chỉnh cho kim loại trần), CMakeđột nhiên không cung cấp hỗ trợ hoặc tính di động nào, cuối cùng bạn sẽ hack nó giống như bạn đã sử dụng để hack các tập lệnh xây dựng hoàn toàn tùy chỉnh.
Ext3h

Điều tương tự cũng xảy ra với Q make (mặc dù không phải là tài liệu tồi có hành vi không nhất quán ** ap CMake là), btw;)
mlvljr

11

makethực sự lỗi thời?

Tôi không nghĩ vậy. Cuối cùng, make vẫn đủ mạnh để cung cấp tất cả các chức năng mong muốn, như biên dịch có điều kiện của nguồn thay đổi và giống nhau. Nói makeđã lỗi thời, sẽ giống như nói viết kịch bản liên kết tùy chỉnh đã lỗi thời.

Nhưng những gì thô makekhông cung cấp, là các chức năng mở rộng và thư viện chứng khoán cho thoải mái, chẳng hạn như tạo tiêu đề tham số, khung kiểm tra tích hợp hoặc thậm chí chỉ là các thư viện có điều kiện nói chung.

Mặt khác, CMakeđược điều chỉnh trực tiếp theo hướng tạo ra các thư viện ELF chung và các tệp thực thi. Bất cứ khi nào bạn khởi hành từ chúng các quy trình được xác định trước, bạn phải bắt đầu hack CMakegiống như bạn đã sử dụng để hack Makefiles của riêng bạn.

Xem xét rằng bạn có thể tạo ra nhiều hơn trong C ++ chứ không chỉ là ứng dụng trung bình của bạn cho một hệ thống biết trình tải ELF, CMakechắc chắn không phù hợp với tất cả các tình huống. Tuy nhiên, nếu bạn đang làm việc trong một môi trường tiêu chuẩn như vậy, CMakehoặc bất kỳ khung công cụ tạo tập lệnh hiện đại nào khác chắc chắn là những người bạn tốt nhất của bạn.

Nó luôn phụ thuộc vào mức độ chuyên biệt của ứng dụng của bạn và cấu trúc của CMakekhung phù hợp với luồng công việc của bạn.


Mặc dù hữu ích, make là một hệ thống khủng khiếp với kiểu chữ nổi, cú pháp phức tạp và vô số hạn chế không cần thiết tạo ra rất nhiều khoảnh khắc.
antred

7

Ngày xưa ngôn ngữ cấp cao chỉ là một ý tưởng. Mọi người đã cố gắng thực hiện trình biên dịch. Trước đó, đã có những hạn chế nghiêm trọng về phần cứng - không có công cụ đồ họa nên "văn bản thuần túy" cuối cùng đã được sử dụng cho định dạng tệp đầu vào; các máy tính thường có dung lượng RAM cực nhỏ nên mã nguồn phải được chia thành nhiều phần và trình biên dịch được chia thành các tiện ích riêng biệt (tiền xử lý, trình biên dịch, trình biên dịch, trình liên kết); CPU chậm và đắt tiền, vì vậy bạn không thể thực hiện tối ưu hóa đắt tiền, v.v.

Tất nhiên với nhiều tệp nguồn và nhiều tiện ích đang được sử dụng để tạo nhiều tệp đối tượng, việc xây dựng mọi thứ theo cách thủ công là một mớ hỗn độn. Như một cách giải quyết các lỗi thiết kế trong các công cụ (do phần cứng bị giới hạn nghiêm trọng), mọi người tự nhiên bắt đầu viết các tập lệnh để loại bỏ một số rắc rối.

Đáng buồn thay, các kịch bản là vụng về và lộn xộn. Để giải quyết các vấn đề với các tập lệnh (vốn là một cách khắc phục các lỗi thiết kế trong các công cụ gây ra bởi phần cứng hạn chế) cuối cùng mọi người đã phát minh ra các tiện ích để làm cho mọi thứ dễ dàng hơn, như thế make.

Tuy nhiên; makefiles là vụng về và lộn xộn. Để khắc phục các sự cố với tệp tạo tệp (vốn là cách khắc phục các lỗi thiết kế trong các công cụ gây ra bởi phần cứng hạn chế), mọi người bắt đầu thử nghiệm các tệp tạo tự động; bắt đầu với những thứ như làm cho trình biên dịch tạo ra các phụ thuộc; và dẫn đến các công cụ như auto-conf và cmake.

Đây là nơi chúng ta đang ở hiện tại: giải quyết công việc cho một công việc xung quanh cho các lỗi thiết kế trong các công cụ gây ra bởi phần cứng hạn chế.

Tôi kỳ vọng rằng vào cuối thế kỷ này, sẽ có thêm một vài lớp "công việc xung quanh công việc" trên đỉnh của đống đồ hiện có. Trớ trêu thay, những hạn chế phần cứng nghiêm trọng đã khiến tất cả những điều này biến mất từ ​​nhiều thập kỷ trước và lý do duy nhất chúng ta vẫn đang sử dụng một mớ hỗn độn cổ xưa như vậy là " đây là cách nó luôn được thực hiện ".


1
Vì vậy, những gì thay thế? Là sự thay thế hoàn toàn thay đổi khái niệm về các bản dựng như chúng ta biết?
JParrilla

1
@Darkslash: Một khi bạn bắt đầu xem xét các giải pháp thay thế (giả thuyết), nó giống như mở các trận lụt - bạn kết thúc việc đặt câu hỏi cho tất cả mọi thứ (và kết thúc với các ý tưởng như phân tách ngữ nghĩa và cú pháp, và thiết kế lại các IDE và công cụ và phân phối như một bộ chứ không phải là từng phần của câu đố lớn hơn). Thực tế hơn là nhận ra rằng các công cụ như cmakechỉ điều trị triệu chứng và không thể chữa khỏi căn nguyên / s; điều này giúp dễ dàng chấp nhận thực tế rằng bạn không có lựa chọn nào khác ngoài việc sử dụng các công cụ có lẽ sẽ không bao giờ gần với "lý tưởng".
Brendan

5
Makefiles không theo bất kỳ cách nào 'vụng về và lộn xộn'. Chúng cực kỳ thanh lịch: makelà trung tâm của một động cơ để vượt qua biểu đồ phụ thuộc theo chu kỳ. Không có gì về 'tập lệnh' hoặc dòng lệnh là 'cổ xưa'.
Miles Rout

1
@MilesRout: Phần khó xử và lộn xộn là việc xây dựng biểu đồ. Các traversal là đủ thanh lịch. Nhưng chỉ lấy ví dụ phổ biến nhất của phần lộn xộn: tệp tiêu đề C. Mỗi cái #includelà một cạnh, nhưng makekhông thể phân tích các tệp C. Vẫn không thành vấn đề, vì makecó thể lưu trữ các cạnh này bằng nút tiếp theo (tệp * .o), nhưng nó cũng không làm điều đó.
MSalters

3
Tôi không đồng ý rằng một thiết kế tốt hơn là có thể. makekhông chỉ để biên dịch C! Bạn muốn một chương trình lấy .c.htập tin và cung cấp cho Makefiles. Nhưng đó không phải là make, và đó không phải là điều makenên làm. Một lần nữa, makekhông phải tất cả về C, và một giải pháp dành riêng cho C được xây dựng makelà một ý tưởng tồi (và tình cờ là vi phạm triết lý UNIX).
Miles Rout

5

make (công cụ hoặc sử dụng trực tiếp nó thông qua Makefile) không bị lỗi thời, đặc biệt là đối với "các dự án nhỏ, cá nhân" như bạn sử dụng.

Tất nhiên, bạn cũng có thể sử dụng nó cho các dự án lớn hơn, bao gồm cả những dự án được nhắm mục tiêu cho nhiều nền tảng. Với các biến cụ thể theo mục tiêu, bạn có thể dễ dàng tùy chỉnh cách bạn xây dựng cho các nền tảng khác nhau. Ngày nay, các bản phân phối Linux đi kèm với các bộ công cụ biên dịch chéo (ví dụ: mingw-w64 ) để bạn có thể xây dựng gói phần mềm Windows hoàn chỉnh (với trình cài đặt nếu bạn muốn) từ Linux, tất cả được điều khiển từ Makefile của bạn.

Các công cụ như cmakeqmake có thể hữu ích, nhưng chúng không phải không có vấn đề. Chúng thường ổn khi tự xây dựng một ứng dụng cùng với bất kỳ thư viện nào (mặc dù tôi luôn gặp vấn đề với qmake khi kiểm tra sự phụ thuộc thích hợp giữa các thư viện và chương trình sử dụng chúng), nhưng tôi luôn phải vật lộn với các ràng buộc của các công cụ đó khi thực hiện phần còn lại của công việc (tạo trình cài đặt, tạo / cài đặt tài liệu hoặc tệp dịch, thực hiện các công việc khác thường như biến kho lưu trữ thành thư viện dùng chung, v.v.). Tất cả điều này có thể được thực hiện make, mặc dù những thứ như theo dõi phụ thuộc có thể đòi hỏi một chút nỗ lực.

Các IDE như Qt Creator và Eclipse cũng có thể nhập các dự án dựa trên Makefile, do đó bạn có thể chia sẻ với các nhà phát triển sử dụng IDE. Tôi nghĩ rằng IDE Qt Creator tuyệt vời như một C ++ IDE, nhưng sau khi dành một chút thời gian để trở nên hiệu quả hơn với Emacs, và vì tôi đang phát triển Ada nhiều hơn, tôi thấy mình thích Emacs hơn cho mọi thứ. Để liên quan đến câu hỏi về make, như một bước đăng liên kết trong Makefile của tôi, tôi cập nhật tệp TAGS của mình (để điều hướng biểu tượng trong Emacs), được tải với M-x visit-tags-table:

find $(SRC_DIR) $(TEST_DIR) -regex ".*\.[ch]\(pp\)?" -print | etags -

Hoặc để phát triển Ada:

find $(SRC_DIR) $(TEST_DIR) -name "*.ad?" -print | etags -

2

Câu trả lời này bổ sung cho câu trả lời @lxrec.

Makefiles có thể được sử dụng cho nhiều thứ, không chỉ tạo chương trình / thư viện từ mã nguồn. Xây dựng các hệ thống như CMake hoặc autotools được thiết kế để lấy mã và xây dựng nó theo cách phù hợp với nền tảng của người dùng (ví dụ: tìm thư viện hoặc chỉ định các tùy chọn biên dịch chính xác). Ví dụ, bạn có thể có một tệp tạo tệp giúp tự động hóa một số tác vụ phát hành, chẳng hạn như: xây dựng tệp zip chứa mã với phiên bản được lấy từ git; chạy thử nghiệm đối với mã của bạn; tải tập tin zip lên một số dịch vụ lưu trữ. Một số hệ thống xây dựng (như automake) có thể cung cấp một cách dễ dàng để làm điều này, một số khác thì không.

Điều đó không có nghĩa là bạn cần sử dụng tệp tạo tệp cho việc này, bạn có thể sử dụng ngôn ngữ kịch bản lệnh (shell, python, v.v.) cho các tác vụ đó.


1

Tôi không nghĩ rằng chữ viết của con người Makefileđã lỗi thời, đặc biệt là khi:

  1. sử dụng POSIX make, cung cấp cho bạn một thiết bị cầm tay Makefile
  2. hoặc sử dụng GNU make 4, cung cấp cho bạn nhiều tính năng rất thú vị, đặc biệt là khả năng tạo tập lệnh GUILE, cho phép mã hóa hiệu quả các tính năng ưa thích do trình Makefiletạo (tôi tin rằng các tính năng của autotools hoặc Cmake có thể dễ dàng được viết bằng cách tùy chỉnh Guile của GNU ). Tất nhiên, cái giá phải trả là yêu cầu GNU tạo 4 (không phải là vấn đề lớn, IMHO).

0

Makefiles không bị lỗi thời, giống như cách các tệp văn bản không bị lỗi thời. Lưu trữ tất cả dữ liệu trong văn bản thuần túy không phải lúc nào cũng là cách làm đúng, nhưng nếu tất cả những gì bạn muốn là Danh sách Todo thì một tệp văn bản đơn giản là ổn. Đối với một cái gì đó phức tạp hơn, bạn có thể muốn một định dạng phức tạp hơn như Markdown hoặc XML hoặc định dạng nhị phân tùy chỉnh hoặc bất cứ thứ gì ở giữa, nhưng đối với các trường hợp đơn giản, văn bản đơn giản hoạt động tốt.

Tương tự như vậy, nếu tất cả những gì bạn muốn là một cách để tránh viết ra g++ -g src/*.c -o blah -W -Wall -Werror && ./blahmọi lúc, một Makefile viết tay là hoàn hảo!

Nếu bạn muốn xây dựng một thứ gì đó có tính di động cao, nơi bạn không phải tự mình quản lý tính di động đó, bạn có thể muốn một cái gì đó như Autotools tạo ra Makefile phù hợp với bạn. Autotools sẽ phát hiện các tính năng được hỗ trợ bởi các nền tảng khác nhau. Một chương trình được viết bằng C89 tiêu chuẩn được xây dựng với Autotools sẽ biên dịch hầu như ở mọi nơi.


"Sẽ biên dịch hầu như ở mọi nơi" -> "sẽ biên dịch trên hầu hết các hệ thống giống Unix gần đây". Tôi không nghĩ rằng autotoolshoạt động ở bất kỳ mức độ có liên quan nào trên hệ thống Windows, ví dụ (giảm giá Cygwin / MingW, đây thực sự là một hệ thống giống như Unix trên Windows).
sleske

Nó không có gì để làm với gần đây. Ưu điểm của autotools là nó hoạt động trên mọi hệ thống giống như POSIX từ xa. Windows có phần tuân thủ POSIX.
Miles Rout

Vâng, tôi đứng chính xác. Trên thực tế, tôi nhớ một lời chỉ trích về autotools chính xác là nó chứa mã ngay cả đối với các hệ thống rất cũ, vì vậy hãy gãi "gần đây". Tôi vẫn đứng bên Windows, mặc dù.
sleske

Và sự đổ lỗi cho điều đó hoàn toàn thuộc về Microsoft. Nếu họ quan tâm đến việc sản xuất một sản phẩm chất lượng thì Windows sẽ có sự hỗ trợ phù hợp cho các tiêu chuẩn hệ điều hành quốc tế (như POSIX). POSIX không chỉ là một "Unix điều", đó là các tiêu chuẩn của hệ điều hành di động cho tất cả các hệ điều hành. Windows chỉ là một đống rác không tuân thủ.
Miles Rout

@MilesRout vẫn là điểm mấu chốt là "hầu như mọi nơi" không bao gồm 90% máy tính để bàn .
el.pescado

-2

nếu dự án của bạn đơn giản và chứa rất ít tệp, thì không cần tạo tệp.

Tuy nhiên, khi dự án phức tạp, sử dụng nhiều vùng nhớ, có nhiều tệp, thì cần phải đặt từng vùng nhớ vào đúng vị trí trong bộ nhớ có thể định địa chỉ, rất mong muốn không biên dịch lại mọi tệp mỗi khi có thay đổi nhỏ làm cho một tập tin,

Nếu bạn muốn xóa các tập tin cũ / biên dịch / liên kết / cài đặt với số lượng rắc rối tối thiểu và cơ hội xảy ra lỗi nhấn phím, makefile là một lợi ích thực sự.

Khi bạn tham gia vào các dự án 'thế giới thực' hiếm khi chỉ là 1 hoặc 2 tệp, mà là hàng trăm tệp. một makefile sẽ luôn thực hiện đúng các hành động và không có các hành động không cần thiết (sau khi được gỡ lỗi), do đó bạn chỉ cần gõ một lệnh đơn giản và makefile thực hiện tất cả công việc


1
Điều đó đã không trả lời tại sao thích makehơn cmakehoặc ngược lại.
Ext3h

Sử dụng makefiles không xây dựng lại tất cả các tệp mỗi lần. (khác CMake hoặc Công cụ tự động không thể sử dụng nó)
ideaman42
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.