Đây là lệnh makepp_repositories có thể chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình giả lập trực tuyến MAC OS
CHƯƠNG TRÌNH:
TÊN
makepp_repositories - Cách sử dụng kho lưu trữ cho các bản dựng biến thể, để duy trì
tập hợp các nguồn trung tâm và những thứ khác
MÔ TẢ
A kho là một thư mục hoặc hệ thống phân cấp thư mục bên ngoài thư mục mặc định
chứa các tệp mà makefile cần trong cây thư mục hiện tại. Makepp có thể
tự động liên kết các tệp từ kho lưu trữ vào cây thư mục hiện tại nếu chúng
cần thiết. Kho lưu trữ cung cấp chức năng tương tự như biến "VPATH", nhưng (không giống như
"VPATH" trong các phiên bản khác của make) bạn không phải làm gì đặc biệt với makefile của mình
để họ làm việc.
Kho lưu trữ được chỉ định bằng tùy chọn dòng lệnh "-R" hoặc "- kho lưu trữ" hoặc với
câu lệnh "repository" trong makefile. Lưu ý rằng nếu bạn có thói quen gọi makepp
trong các thư mục con khác nhau của cây xây dựng của bạn, rất dễ vô tình nhập lại
kho lưu trữ ở một nơi khác. Như một biện pháp bảo vệ chống lại điều này, nếu bạn sử dụng RootMakeppfile, trang điểm
sẽ từ chối bắt đầu nếu nó tìm thấy một bên trên hoặc bên dưới nơi nó sẽ được nhập.
Điều này có thể so sánh với hệ thống tệp liên hợp của hệ điều hành (unionfs ...)
thư mục hiện tại giống như lớp có thể ghi ở mức cao nhất. Tất cả các kho lưu trữ giống như
các lớp chỉ đọc thấp hơn.
Kho lưu trữ hữu ích trong một số trường hợp khác nhau:
· Khi bạn muốn đặt đối tượng và các tệp thực thi của mình trong một thư mục riêng biệt, nhưng
makefile được viết để đặt chúng trong cùng thư mục với các nguồn.
· Khi bạn muốn xây dựng cùng một chương trình theo hai cách khác nhau (ví dụ: với hai cách khác nhau
tập hợp các tùy chọn biên dịch, hoặc cho hai kiến trúc khác nhau).
· Khi bạn không có quyền ghi vào tất cả hoặc một phần của cây nguồn.
· Khi một số nhà phát triển đang làm việc trên cùng một dự án và có một nguồn chung
kho chứa tất cả các nguồn cho dự án. Mỗi nhà phát triển chỉ có thể sửa đổi
các tệp anh ấy cần thay đổi trong thư mục cục bộ của mình mà không ảnh hưởng đến
nhà phát triển và makepp sẽ tự động tìm nạp các tệp chưa sửa đổi từ nguồn
kho.
Việc triển khai các kho lưu trữ của Makepp không yêu cầu viết lại các lệnh xây dựng
ở tất cả, không giống như (ví dụ) các kho lưu trữ ở khuyết điểm. Makepp đặt một liên kết tượng trưng vào
thư mục mà lệnh đang mong đợi nó. Miễn là lệnh không tham chiếu đến
các thư mục tuyệt đối, lệnh shell giống hệt nhau sẽ hoạt động với các tệp từ kho lưu trữ.
Điều này có nghĩa là nó không chỉ hoạt động với các lệnh biên dịch, mà còn bất kỳ loại lệnh nào bạn
có thể suy nghĩ để đưa vào makefile của bạn.
Makepp có một loại cơ chế khác được gọi là xây dựng bộ nhớ cache giải quyết một số vấn đề giống nhau
các loại vấn đề như kho lưu trữ theo một cách khác. Tùy thuộc vào vấn đề của bạn, một công trình
bộ nhớ cache có thể hữu ích hơn một kho lưu trữ. Xem makepp_build_cache để biết thông tin về
xây dựng bộ nhớ đệm và so sánh giữa bộ đệm và kho lưu trữ xây dựng.
Các ví dụ
Kho lưu trữ được giải thích tốt nhất bằng một số ví dụ về những gì bạn có thể làm.
Khác nhau biên soạn lựa chọn
Giả sử bạn có một chương trình đơn giản với makefile trông giống như sau:
CỜ = -O2
OBJECTS = ao bo co
my_program: $ (OBJECTS)
cc $ (đầu vào) -o $ (đầu ra)
% .o:% .c
cc $ (CFLAGS) -c $ (đầu vào) -o $ (đầu ra)
Makefile này đặt các tệp "ao", "bo", "co" và "my_program" trong cùng một thư mục
dưới dạng các tệp nguồn.
Đôi khi bạn muốn đặt các tệp nhị phân vào một thư mục riêng biệt. Ví dụ, bạn
có thể xây dựng chương trình của bạn trên một số kiến trúc khác nhau và bạn không muốn
các tệp trên một kiến trúc sẽ được thay thế bằng các tệp nhị phân trên cấu trúc khác. Hoặc bạn có thể
muốn thực hiện một thay đổi tạm thời và biên dịch lại mà không xóa bản biên dịch trước đó
kết quả. Nếu không có kho lưu trữ, bạn sẽ phải sửa đổi makefile của mình để đặt
đối tượng ở nơi khác.
Tuy nhiên, với một kho lưu trữ, bạn hoàn toàn không phải động đến makefile của mình. Xem xét
chuỗi lệnh sau:
% cd my_program_source
% makepp # Bản dựng bằng cách sử dụng makefile ở trên và
# tệp đối tượng đi vào thư mục
# nguồn_chương_trình_của_tôi.
% đĩa CD ..
% mkdir binary-debug # Tạo một thư mục sạch để xây dựng
% cd binary-debug # cùng một chương trình với các tùy chọn khác nhau.
% makepp -R ../my_program_source CFLAGS = -g
# Bây giờ các đối tượng chuyển sang gỡ lỗi nhị phân.
Lệnh makepp đầu tiên biên dịch các tệp nguồn với sự tối ưu hóa và đặt các đối tượng
vào thư mục "my_program_source", bởi vì đó là những gì mà makefile phải
làm. Bây giờ chúng tôi muốn xây dựng lại chương trình, nhưng chúng tôi muốn thay đổi giá trị của "CFLAGS" thành
biên dịch để gỡ lỗi. Chúng tôi chỉ định giá trị mới của "CFLAGS" trên dòng lệnh và chúng tôi cũng
nói với makepp rằng thư mục "my_program_source" là một kho lưu trữ bằng cách sử dụng tùy chọn "-R".
Mỗi khi makepp nhận ra rằng nó cần một tệp mà hiện tại nó chưa có
thư mục, nó tìm trong kho lưu trữ. Trong trường hợp này, trước tiên, nó tìm kiếm tệp makefile,
không tồn tại trong thư mục con "binary-debug". Vì vậy, nó tạo ra một liên kết tượng trưng để
nó từ makefile trong "my_program_source", rồi đọc trong makefile. Sau đó nó
nhận thấy rằng nó cần tệp "ac" để tạo "ao" và vì vậy nó liên kết trong "ac"
từ kho lưu trữ. Nếu "ac" bao gồm bất kỳ tệp nào có trong "my_program_source", thì
chúng cũng sẽ được tự động liên kết trong. Lưu ý: Những liên kết đó hữu ích cho những việc
như gỡ lỗi, nhưng nếu bạn không thích chúng, "makeppclean -R" có thể xóa chúng.
Chạy lệnh xây dựng trong "binary-debug" sẽ không chạm vào bất kỳ tệp nào trong
"my_program_source". Do đó, từ cùng một tập hợp các tệp nguồn, bây giờ bạn có hai
bản sao của chương trình, một bản được biên dịch với tính năng tối ưu hóa và một bản được biên dịch để gỡ lỗi. Và
điều này đã xảy ra mà không chạm vào makefile nào cả.
Lợi thế của việc sử dụng kho lưu trữ thay vì chỉ đơn giản là biên dịch lại và ghi đè
mã nhị phân ban đầu là bây giờ nếu chúng tôi sửa lỗi của mình và muốn quay lại
phiên bản, chúng tôi không phải biên dịch lại mọi thứ. Vì các tệp đối tượng ban đầu vẫn còn
xung quanh, và hầu hết chúng vẫn còn giá trị, chúng tôi có thể tiết kiệm rất nhiều thời gian biên dịch lại.
Điều này không tạo ra sự khác biệt lớn khi chỉ có ba tệp nguồn có liên quan, nhưng đối với một
bản dựng lớn hơn mất vài phút hoặc hàng giờ để hoàn thành, tiết kiệm thời gian của lập trình viên và
sự thất vọng có thể là đáng kể.
Xây dựng lại một hồ sơ với a nhỏ sửa đổi đến các biên soạn lệnh
Makepp không chỉ tìm nạp các tệp nguồn từ kho lưu trữ. Nếu đối tượng tập tin trong
kho lưu trữ không cần xây dựng lại, nó sẽ sử dụng chúng. Ví dụ, hãy xem xét một chút
sửa đổi makefile ở trên:
CFLAGS: = -O2
A_CFLAGS: = -O6 -funroll-vòng
ĐỐI TƯỢNG: = ao bo co
my_program: $ (OBJECTS)
cc $ (đầu vào) -o $ (đầu ra)
% .o:% .c
cc $ (CFLAGS) -c $ (đầu vào) -o $ (đầu ra)
ao: ac
cc $ (A_CFLAGS) -c $ (đầu vào) -o $ (đầu ra)
Ý tưởng là "ao" chứa mã quan trọng về thời gian, vì vậy nó được biên dịch với
tối ưu hóa hơn các đối tượng còn lại. Bây giờ, giả sử chúng ta muốn kiểm tra xem
thời gian là với các tùy chọn biên dịch khác nhau. Một kho lưu trữ cũng có thể trợ giúp điều này:
% cd my_program_source
% makepp # Bản dựng bằng cách sử dụng makefile ở trên và
# tệp đối tượng đi vào thư mục
# nguồn_chương_trình_của_tôi.
% đĩa CD ..
% mkdir no-unrolling # Tạo một thư mục sạch để xây dựng
% cd no-unrolling # cùng một chương trình với các tùy chọn khác nhau.
% makepp -R ../my_program_source A_CFLAGS = -O2
% đĩa CD ..
% time no-unrolling / my_program # Điểm chuẩn cho hai phiên bản của chương trình.
% time my_program_source / my_program
Makepp vẫn tiến hành như trước, liên kết trong một bản sao của makefile và sau đó kiểm tra đối tượng
các tập tin. Bây giờ chỉ mô-đun "ao" cần biên dịch lại, vì các tùy chọn cho "bo" và "co"
không thay đổi. Makepp nhận thấy rằng nó có thể sử dụng "bo" và "co" từ kho lưu trữ, vì vậy
nó chỉ liên kết những người trong. Tuy nhiên, nó sẽ biên dịch lại "ao" trong thư mục "no-unrolling".
Khi quá trình biên dịch kết thúc, hai phiên bản khác nhau của chương trình có thể
chuẩn.
Xây dựng lại với a nhỏ sửa đổi đến các nguồn
Bây giờ, giả sử chúng ta muốn thực hiện thay đổi đối với "ac" và chuẩn chương trình trước và sau
sự thay đổi. Kho lưu trữ có thể giúp một lần nữa. Hãy xem xét chuỗi lệnh này:
% mkdir đã sửa đổi-a
% cp my_program_source / ac fixed-a
% cd đã sửa đổi-a
% emacs ac # Thực hiện một số sửa đổi chỉ đối với mô-đun này.
% makepp -R ../my_program_source
Ở đây, chúng tôi đã tạo một thư mục mới chỉ chứa tệp nguồn duy nhất mà chúng tôi muốn
biến đổi. Makepp hiện lấy "ac" từ thư mục con "mod-a", nhưng sử dụng các bản sao của
"b" và "c" từ thư mục "my_program_source". Mà không cần thay đổi bất kỳ nhị phân nào
trong "my_program_source", chúng tôi đã tạo một bản sao riêng của chương trình
kết hợp các thay đổi của chúng tôi thành "ac". Nếu có các nhà phát triển khác sử dụng các nguồn trong
"my_program_source", chúng sẽ không bị ảnh hưởng bởi các thay đổi của chúng tôi.
Do đó, kho lưu trữ có thể được sử dụng như một cách nhanh chóng để xây dựng các biến thể của một chương trình mà không cần
thêm các điều kiện phức tạp vào makefile. Không có tệp nào trong bản gốc
thư mục được sửa đổi; chúng được sử dụng khi cần thiết.
Sử dụng a thư mục hệ thống cấp bậc
Một kho lưu trữ thực sự không chỉ là một thư mục đơn lẻ, nó là một hệ thống phân cấp toàn bộ thư mục.
Giả sử bạn sử dụng / our / library như một kho lưu trữ. Bây giờ / our / library cũng có thể chứa nhiều
thư mục con, ví dụ: / our / library / gui và / our / library / network. Hãy xem xét lệnh này:
% makepp -R / our / library
Bất kỳ lệnh nào trong makefile tham chiếu đến các tệp trong thư mục ./mạng sẽ thực sự
lấy các tập tin từ / our / library / networkvà tương tự cho ./giao diện người dùng. Makepp tự động
tạo bất kỳ thư mục nào tồn tại trong kho lưu trữ nhưng không có trong thư mục hiện tại.
Liên kết đến bất kì nơi in các hồ sơ hệ thống
Tất cả các ví dụ trên hiển thị các tệp từ một kho lưu trữ được liên kết với
thư mục hoặc các thư mục con của nó, nhưng bạn thực sự có thể có makepp liên kết chúng vào bất kỳ nơi nào
trong hệ thống tệp mà bạn có quyền ghi vào. Điều này được thực hiện bằng cách chỉ định
"-R new-location = old-location".
Ví dụ, đôi khi hơi tẻ nhạt khi nhập những thứ sau:
mkdir thay thế-xây dựng
cd thay thế-xây dựng
trang điểm -R ..
Bạn có thể làm tất cả chỉ với một lệnh, như sau:
makepp -R alternate-build =. -F thay thế-xây dựng
"-F" hoặc "-makeppfile" thay đổi thành thư mục đó trước khi tải makefile. Bạn phải
chỉ định "-R" trước "-F". Lưu ý rằng ví dụ này đặt cây xây dựng mới bên trong
kho. Điều đó sẽ không hoạt động nếu bạn sử dụng RootMakeppfile bởi vì các biện pháp bảo vệ makepp
chống cây lồng vào nhau. Nó cũng không phải là một ý kiến hay nếu bạn sử dụng **, bởi vì nếu bạn từng xây dựng
trong kho lưu trữ, nó cũng sẽ tìm thấy các tệp đã chỉnh sửa và tạo trong cây con này.
Việc chỉ định một vị trí khác trong hệ thống tệp cũng có thể hữu ích cho việc phức tạp hơn
bản dựng, nơi có một số thư mục con của thư viện. Ví dụ, đây là một lệnh tôi
đã sử dụng để tạo các biến thể của một trong các chương trình của tôi:
% makepp -R test-build / seecape = / src / seecape \
-R test-build / HLib = / src / HLib \
-R test-build / H5pp = / src / H5pp \
-R qwt = / src / external_libraries / qwt \
-F test-build / seecape
Lệnh này tải trong các tệp từ bốn kho lưu trữ khác nhau, và sau đó cds đến
./test-build/xem cảnh quan thư mục và thực thi makefile ở đó. Các tệp có trong
cây thư mục bắt đầu bằng / src / seecape được liên kết thành ./test-build/xem cảnh quan. Trong
nói cách khác, makepp sẽ tạm thời liên kết tệp /src/seescape/gui/image_canvas.cxx đến
./test-build/seescape/gui/image_canvas.cxx khi cần thiết. Lệnh này sẽ hoạt động ngay cả
nếu thư mục "test-build" chưa tồn tại; makepp sẽ tạo nó cho bạn. (Nhưng bạn
phải chỉ định các tùy chọn "-R" trước tùy chọn "-F" trên dòng lệnh.)
nhiều tương đương kho
Giả sử dự án của bạn được duy trì bởi một số nhóm khá tự chủ. Bạn có thể có một
hoàn thành kho lưu trữ với tất cả các nguồn như chúng đang được sản xuất hoặc ít nhất là
đã thử nghiệm thành công. Mọi nhóm đều có thể có một kho lưu trữ gần như trống rỗng với (một phần của)
cùng cấu trúc, chứa các tệp thành viên nhóm đã phát triển xong.
Các thư mục hiện tại của nhà phát triển sẽ có các tệp mà họ vẫn đang làm việc. Nhóm
kho lưu trữ sẽ là kho đầu tiên được cung cấp và kho lưu trữ sản xuất là kho cuối cùng, do đó
nó cung cấp các tệp không được tìm thấy trong kho nhóm:
$ makepp -R / path / to / group / repository -R / path / to / production / repository
Vì điều này có thể khá tĩnh cho thư mục đó, bạn có thể muốn đặt một tệp
.makepprc tại gốc của nó với nội dung sau:
-R / path / to / group / repository -R / path / to / production / repository
Hoặc, giả sử rằng nó có một đường dẫn cố định, bạn có thể viết vào makefile của mình:
kho lưu trữ / đường dẫn / đến / sản xuất / kho lưu trữ
và, bởi vì các tùy chọn được nhìn thấy trước khi các tệp trang được đọc, sau đó bạn có thể chỉ cần gọi
$ makepp -R / path / to / group / repository
Kho as cố định một phần of qua một vài thao tác đơn giản về xây dựng hệ thống
Nếu bạn biết bạn luôn sử dụng một số kho lưu trữ, bạn có thể sử dụng "kho lưu trữ" hoặc "vpath"
các câu lệnh trong makefile của bạn.
Hãy cẩn thận với kho
Thời Gian các liên kết được in các cách
Để tìm theo cách của bạn xung quanh hệ thống phân cấp tệp của bạn và để cho phép trình gỡ lỗi tìm thấy
nguồn hữu ích để có các liên kết được sử dụng trong khi xây dựng. Nhưng khi bạn muốn chỉnh sửa
hoặc đồng bộ lại nó với điều khiển phiên bản của bạn, các liên kết có thể cản trở. Đó là
bởi vì hệ thống duyệt liên kết và ghi vào tệp trong kho lưu trữ. Trừ phi
đó là kho lưu trữ cá nhân của bạn được sử dụng chỉ để giữ mọi thứ riêng biệt, đó có thể không phải là thứ bạn
muốn.
Như một biện pháp bảo vệ chống lại việc vô tình ghi đè lên các tệp công khai, bạn nên thực hiện
nguồn trong kho lưu trữ không thể ghi được. Nó thậm chí có thể không đủ để xóa viết
bit, bởi vì một hệ thống kiểm soát phiên bản yêu cầu bạn khóa các tệp để chỉnh sửa
cũng có thể làm điều đó, nhưng tạm thời làm cho tệp có thể ghi được trong khi đồng bộ hóa lại. Nếu đó là
đối với bạn, kho lưu trữ thực sự phải thuộc về một người dùng khác.
Có một số chiến thuật để giải quyết vấn đề này:
· Giữ các nguồn bạn chỉnh sửa trong một kho lưu trữ, tách biệt với cây xây dựng của bạn. Bất cứ khi nào
bạn đặt một tệp, trước đó đã được tìm nạp từ một kho lưu trữ khác, vào tệp này
kho lưu trữ chỉnh sửa, makepp sẽ thông báo và tìm nạp nó từ đó, miễn là nó là
kho lưu trữ đầu tiên mà bạn chỉ định.
· Hãy nhớ xóa bất kỳ tệp nào, trước khi bạn tạo một bản sao để viết. Nếu bạn làm theo
đề xuất bảo vệ ở trên, việc quên thực hiện việc này sẽ đưa ra thông báo lỗi khi
viết. Để giúp bạn, hàm sau "delink" sẽ thay thế một liên kết bằng một bản sao
của tệp được liên kết. Biến thể đầu tiên dành cho tất cả các loại Vỏ Bournish, biến thể thứ hai
một cho csh (hoặc ít nhất là tcsh):
$ delink () {{rm $ 1 && cat> $ 1; } <$ 1; }
% bí danh delink '(rm \ !: 1 && cat> \ !: 1;) <\ !: 1'
· Nếu bạn cảm thấy bạn không cần chúng, bạn có thể xóa tất cả chúng, bất cứ khi nào bạn muốn, ví dụ:
sau mỗi lần chạy makepp, có thể ở chế độ nền (ở dạng ngắn hoặc dài):
makeppclean --recurse --only-repository-links
mppc-rR
Đừng xây dựng in a kho suốt trong sử dụng
Một kho lưu trữ có nghĩa là chỉ đọc trong khi nó đang được sử dụng như một kho lưu trữ. Makepp sẽ
không hoạt động bình thường nếu bạn thay đổi tệp trong kho lưu trữ của mình trong quá trình xây dựng.
Các bản dựng hàng đêm có thể phù hợp với bạn, nếu không có ai khác sử dụng kho lưu trữ tại thời điểm đó. Trước
nó bắt đầu xây dựng, makepp nhận danh sách tất cả các tệp tồn tại trong kho lưu trữ và
không bao giờ cập nhật danh sách của nó, ngoại trừ các tệp mà nó mong đợi sẽ xuất hiện.
Nếu bạn cần một kho lưu trữ thay đổi khi bạn xây dựng, bạn có thể muốn xem xét
xây dựng cơ chế bộ nhớ cache (xem makepp_build_cache). Ngoài ra, bạn có thể sử dụng một "người nghèo
kho lưu trữ ": bạn có thể đặt các quy tắc rõ ràng vào makefile của mình để tạo các liên kết mềm, như
điều này:
% .c: $ (directory_I_wish_was_a_repository) /%. c
& ln -fs $ (đầu vào) $ (đầu ra)
Điều này chỉ hoạt động cho các tệp nguồn; bạn không thể dễ dàng sử dụng nó để liên kết một tệp nếu nó là
đã được xây dựng trong kho lưu trữ, nhưng hãy xây dựng nó ở đây nếu nó chưa được xây dựng, vì ở đó
chỉ được phép là một cách để tạo tệp.
Sử dụng có thể tương đối tên tập tin
Kho lưu trữ hoạt động hoàn toàn minh bạch if các trang điểm sử dụng có thể tương đối tên tập tin.
Trong ví dụ trên, sẽ ổn nếu makefile trong / src / seecape đề cập đến ../HLib, nhưng
lệnh trên sẽ không hoạt động như mong đợi nếu nó tham chiếu đến / src / HLib. Nếu bạn cần sử dụng
tên tệp tuyệt đối, bạn có thể đặt chúng vào các biến tạo và sau đó ghi đè chúng trên
dòng lệnh, như thế này:
% makepp -R test-build / seecape = / src / sawcape SEESCAPE = / home / holt / test-build / sawcape \
-R test-build / HLib = / src / HLib HLIB = / home / holt / test-build / HLib \
-R test-build / H5pp = / src / H5pp H5pp = / home / holt / test-build / H5pp \
-R qwt = / src / external_libraries / qwt QWT = / home / holt / test-build / qwt \
-F test-build / seecape
Ở trên sẽ hoạt động miễn là thư mục "HLib" được gọi là "$ (HLIB)" trong tất cả các
trang điểm. Lưu ý rằng bạn phải chỉ định đường dẫn tuyệt đối cho các thư mục, bởi vì
makepp cd's thành "test-build / seecape" trước khi đọc makefile. Điều này dẫn đến lâu và
lệnh make phức tạp; sử dụng các đường dẫn tương đối khi có thể.
Makepp phải Biết về tất cả các phụ thuộc
Kho lưu trữ sẽ không hoạt động nếu có ẩn phụ thuộc mà makepp không biết
Về. (Trên thực tế, xây dựng bằng cách sử dụng kho lưu trữ, là một cách để kiểm tra xem có bị quên
sự phụ thuộc. Tuy nhiên, chỉ để kiểm tra này, không kết hợp nó với một bộ đệm ẩn bản dựng, vì
tìm nạp một thứ gì đó ở đó, thay vì xây dựng nó, có thể ẩn một phần phụ thuộc bị lãng quên.)
Đôi khi những sự phụ thuộc này có thể khá tinh vi. Ví dụ, libtool lệnh sẽ
không chỉ tạo các tệp ".lo" và ".la" như được liệt kê trên dòng lệnh, mà nó còn có thể
tạo một thư mục con có tên ".libs" chứa các tệp đối tượng thực. Để ngăn chặn
xây dựng sai lầm, makepp từ chối liên kết trong tệp ".la" từ kho lưu trữ. Hy vọng rằng trong
libtool trong tương lai sẽ được hỗ trợ tốt hơn.
Nhiều phụ thuộc ẩn liên quan đến biên dịch bị chặn bởi trình quét dòng lệnh.
Nếu trình biên dịch của bạn sử dụng cờ biên dịch Unix phổ biến (ví dụ: "-I", "-D", v.v.), thì
makepp thường sẽ tìm ra vị trí của tất cả các tệp bao gồm của bạn. Bạn có thể phải
cẩn thận nếu bạn có bất kỳ tập lệnh cây nhà lá vườn nào tạo ra các tệp mà makepp không biết
Về. Đối với các bản dựng chính xác, điều tối quan trọng là phải liệt kê tất cả các mục tiêu và phụ thuộc
(hoặc xác định chúng tự động bằng cách quét).
Đặt tuyệt đối tên tập tin trong chương trình
Các kho lưu trữ cũng sẽ không hoạt động nếu bất kỳ tệp nào được tạo chứa các tên tệp tuyệt đối trong
chúng (ví dụ: nếu bất kỳ lệnh xây dựng nào của bạn ghi ra một tên tệp tuyệt đối). Ví dụ,
hóa ra là các tệp ".la" được tạo ra bởi libtool có tài sản này. (Nếu bạn nhìn vào
nội dung của tệp ".la", bạn sẽ thấy rằng danh sách phụ thuộc chứa tuyệt đối
tên tệp.) Để giải quyết vấn đề cụ thể này, makepp sẽ không liên kết tệp ".la"
từ một kho lưu trữ; nó sẽ nhấn mạnh vào việc xây dựng lại chúng.
Tránh liên kết in không cần thiết thư mục
Các kho lưu trữ có thể chậm khi khởi động và sử dụng nhiều bộ nhớ nếu có nhiều
các tệp không cần thiết trong kho lưu trữ. Ví dụ: nếu bạn sử dụng HTML tự động
trình tạo tài liệu tạo hàng nghìn tệp ".html" từ mã nguồn của bạn, bạn
có thể không muốn đặt chúng trong một thư mục con của một thư mục được sử dụng như một kho lưu trữ.
Tốt hơn nên đặt chúng hoàn toàn trong một cây thư mục khác, vì vậy kho lưu trữ
cơ chế sẽ không tải trong tên của họ.
Quá nhiều Các Tập Tin
Nhược điểm của kho lưu trữ là các liên kết tượng trưng, mà cơ chế kho lưu trữ
sử dụng, là các tệp riêng lẻ (mặc dù chúng hầu như không sử dụng dung lượng đĩa). Điều này không giống như thực
nhưng những liên kết đó không thể vượt qua ranh giới hệ thống tệp. Trong trường hợp nghiêm trọng, sự hiện diện của
rất nhiều liên kết tượng trưng có thể dẫn đến cạn kiệt số lượng tệp dự kiến (được gọi là
inodes), mặc dù còn nhiều chỗ trống. Trong trường hợp này, sysadmin sẽ cần
để điều chỉnh hệ thống tệp.
Ghi đè kho bản sao
Nếu bạn thực hiện bất kỳ sửa đổi nào đối với tệp cục bộ, makepp thông thường sẽ nhận ra điều này và
biên dịch lại tệp bằng bản sao cục bộ thay vì bản sao kho lưu trữ.
Nếu bạn đang sử dụng kho lưu trữ để duy trì cơ sở mã trung tâm và bạn có các nhà phát triển
làm việc trên các bản sao cục bộ chỉ chứa các tệp mà họ đã sửa đổi, một vấn đề
vấn đề là: điều gì sẽ xảy ra nếu một nhà phát triển muốn xóa một tệp khỏi bản dựng cục bộ của mình nhưng
kho lưu trữ vẫn chứa nó? Nếu nhà phát triển xóa bản sao cục bộ, makepp sẽ
vui vẻ đưa vào bản sao từ kho lưu trữ và quá trình xây dựng sẽ tiến hành như thể tệp
tồn tại
Một kỹ thuật (không phải cho người dùng root) cho vấn đề này là tạo tệp mà bạn muốn
không bao gồm trong quá trình xây dựng không thể đọc được, như thế này:
chmod a-rw tệp-to-được-loại trừ
Điều này sẽ ngăn makepp kết hợp nó từ kho lưu trữ. Makepp cũng bao gồm
mã đặc biệt để các tệp không đọc được không khớp với ký tự đại diện hoặc quy tắc mẫu.
Tương tự, để ngăn makepp kết hợp toàn bộ thư mục con, hãy tạo địa chỉ
thư mục có cùng tên nhưng không thể đọc được. Nếu bạn muốn makepp bỏ qua
toàn bộ thư mục, sau đó cũng làm cho nó không thể đọc được. (Các thư mục chỉ đọc được tìm kiếm nhưng
các mục tiêu trong đó thường không được xây dựng.)
Cách khác để làm điều này là gọi makepp với một hoặc nhiều tùy chọn loại trừ:
mpp -R / path / to / rep --dont-read = / path / to / rep / file-to-be-remove
Đừng sử dụng kho cho các tập tin cái nào có thể thay đổi!
Đừng cố gắng sử dụng kho lưu trữ cho một tệp là một phần của bản dựng của bạn. Ví dụ, bạn
có thể bị cám dỗ để cố gắng sử dụng các kho lưu trữ để đặt tất cả các tệp .h công khai của bạn vào cùng một
thư mục, như thế này:
# makefile cấp cao nhất
kho lưu trữ bao gồm = module1 / bao gồm
kho lưu trữ bao gồm = module2 / bao gồm
kho lưu trữ bao gồm = module3 / bao gồm
kho lưu trữ bao gồm = module4 / bao gồm
Đây có lẽ không phải là một ý kiến hay nếu bất kì của .h các tệp tin là kết quả đầu ra của một
chương trình (ví dụ: yacc hoặc một số chương trình khác lấy ra mã nguồn C), bởi vì makepp
giả định rằng các tệp trong kho không bao giờ thay đổi. Nếu bản dựng cần bao gồm / xyz.hvà
module2 / include / xyz.h thực sự cần được sản xuất bởi một số chương trình, makepp sẽ không biết
để chạy chương trình. Tốt hơn là sử dụng một kỹ thuật như thế này để đưa tất cả .h các tập tin
thành một thư mục bao gồm chung:
# module1 / Makeppfile
../include/%.h: bao gồm /%. h
& cp $ (đầu vào) $ (đầu ra)
# Bạn cũng có thể (hiệu quả hơn nhưng có vấn đề trên Windows) làm như sau:
# & ln -r $ (đầu vào) $ (đầu ra)
Makepp vẫn có thể cố gắng tạo các tệp có trong kho lưu trữ nếu có điều gì đó yêu cầu
cho họ trực tiếp, nhưng nó sẽ không xây dựng họ on thay mặt của thư mục cục bộ. Kết quả
điều này có thể khá khó hiểu, vì nó có thể dẫn đến một liên kết tượng trưng của kho lưu trữ
được sử dụng trong khi mục tiêu kho lưu trữ của nó đã lỗi thời, nhưng mục tiêu đó có thể được cập nhật sau
trong bản dựng. Bạn có thể ngăn điều này xảy ra bằng cách đảm bảo rằng
kho lưu trữ được đề cập đến có thể thông qua đường dẫn kho lưu trữ hoặc bằng cách đảm bảo rằng
cũng là một quy tắc cục bộ cho tất cả các tệp kho lưu trữ được tạo.
Một cách khác để tránh biên dịch lại các tệp giống hệt nhau trong các thư mục khác nhau là sử dụng
xây dựng bộ đệm (xem makepp_build_cache để biết thêm chi tiết). Bộ nhớ cache bản dựng không có
hạn chế rằng tệp có thể không thay đổi.
Sử dụng makepp_repositories trực tuyến bằng các dịch vụ onworks.net