2011-01-29 25 views
19

Tôi có tham ái này để làm một số thí nghiệm với sửa đổi dưới bụng của thư viện thời gian chạy Delphi (RTL), system.pas và thích ... Có thể hay không?Biên dịch lại RTL - nếu có thể, thì làm cách nào?

Tôi rất thích những thách thức như "có, nhưng bạn sẽ phải cung cấp các tệp .obj tùy chỉnh cho một số thuật sĩ lắp ráp vì chúng chưa bao giờ được phân phối với nguồn Delphi chính thức". Tốt với tôi, tôi chỉ muốn biết.

Tôi muốn thực hiện thử nghiệm này với Delphi 7, nhưng thông tin bên trong trên bất kỳ phiên bản nào khác đều tốt. Đây là một trong những đặc quyền của một công ty làm việc với Delphi từ thời kỳ đồ đá.

(Tôi luôn hình dung này là một trong những câu hỏi RTFM, với câu trả lời là một vang dội "NO!", Nhưng đối với một số lý do google sẽ không xác nhận nó.)

Trả lời

19

Bạn có thể biên dịch lại RTL như bất kỳ đơn vị nào khác.

Đối với System.pas, bạn phải sử dụng trình biên dịch dòng lệnh.

Ví dụ, đây là một nội dung tập tin batch làm việc (có một số dòng lệnh không được ghi nhận switch):

del *.dcu /s 
"c:\program files\borland\delphi7\bin\dcc32.exe" -O+ -Q -M -Y -Z -$D+ System.pas 

này sẽ biên dịch lại System.pas và SysInit.pas (cả mức thấp nhất các file RTL) .

Nhưng để sử dụng các tệp DCU được tạo lại, bạn sẽ phải đặt thư mục chứa tệp dcu được cập nhật vào vị trí đầu tiên của IDE: ví dụ, trong Delphi 7 đó là Option/Environment Options/Library, đặt thư mục của bạn FIRST vào cả hai trường "Đường dẫn Libary" và "Đường dẫn duyệt web".

Và có lẽ đáng để xóa các tệp .dcu gốc trong thư mục cài đặt Delphi của bạn.

Nhưng hãy chắc chắn bạn sẽ không thay đổi phần "giao diện" của thiết bị hoặc bạn sẽ gặp khó khăn khi biên dịch với các đơn vị không được sửa đổi khác của RTL (hoặc các thành phần của bên thứ ba). Bạn có thể thay đổi phần "triển khai", áp dụng các bản sửa lỗi hoặc viết lại một số phần cho tốc độ hoặc như vậy, nhưng không thay đổi phần "giao diện" để tránh bất kỳ lỗi liên kết nào.

Luôn sao lưu các tệp .pas và .dcu gốc mà bạn đang thay đổi. Và bạn nên thực hiện một số thử nghiệm biên dịch tự động, để bạn có thể chắc chắn rằng các sửa đổi của RTL sẽ không thêm bất kỳ hồi quy nào.

Chúng tôi đã biên dịch RTL như vậy cho số Enhanced Run Time Library của chúng tôi để có tốc độ tốt hơn các hàm RTL ở mức thấp (chủ yếu là System.pas và SysUtils.pas). Được thiết kế cho Delphi 7 và 2007. Đối với phiên bản Delphi gần đây hơn, bạn vẫn có thể sử dụng nguyên tắc tương tự.

+0

Cảm ơn bạn đã viết rõ ràng, được hỗ trợ bởi trải nghiệm khó khăn. Xuất sắc! –

16

Bạn chỉ có thể biên dịch lại các RTL từ dòng lệnh. Nên có một makefile trong thư mục nguồn RTL của tiến trình cài đặt của bạn. Nó được thiết kế để sử dụng với tiện ích dòng lệnh make.exe phải nằm trong thư mục "bin" của bản cài đặt của bạn. Tôi khuyên bạn nên sao chép các nguồn có liên quan đến một vị trí riêng biệt để thử nghiệm. Tôi phải cảnh báo bạn rằng đơn vị Hệ thống được kết hợp chặt chẽ với trình biên dịch, nó dự kiến ​​sẽ có nhiều hàm để có một tên cụ thể và có các danh sách tham số cụ thể, nếu có bất kỳ khai báo nào. Nhiều RTL "helper" chức năng không có bất kỳ thông số chính thức khai báo, nhưng hy vọng các thông số được thông qua trong một thời trang nhất định.

Một chút cảnh báo khác là thay đổi các khai báo giao diện của các lớp, chức năng hoặc loại nhất định. Làm như vậy có thể gây ra sự không tương thích nghiêm trọng với các tệp và thành phần DCU hiện có. Vì lý do này, bạn phải rất cẩn thận khi trộn các tệp DCU từ RTL được bao gồm hoặc các thành phần của bên thứ ba với các phiên bản sửa đổi tùy chỉnh của bạn. Tôi sẽ đề nghị bạn bắt đầu bằng cách chỉ thực hiện thay đổi phần thực hiện chỉ trước khi mạo hiểm vào lĩnh vực mỏ của thay đổi phá vỡ giao diện.

+0

Tôi nhớ một lần trình biên dịch cũng dựa vào thứ tự khai báo System.pas. Nó đã được từ lâu rồi kể từ khi tôi biên dịch lại RTL, vì vậy điều này có thể đã được trong thời đại Turbo Pascal/Delphi 1 (16-bit). –

+2

Chúng tôi gọi RTL là gì? Đối với System.pas và SysInit.pas, nó có thể được thực hiện chỉ từ dòng lệnh. Nhưng đối với các đơn vị cấp cao khác (như Classes.pas hoặc SysUtils.pas) nó có thể được thực hiện từ IDE, chỉ bằng cách thay đổi các tệp Library cũ hơn trong các tùy chọn IDE và cung cấp một nguồn .pas khác sẽ được sử dụng thay cho phiên bản mặc định. –

+0

Như tôi nhớ Variants.pas không thể dễ dàng biên dịch lại ngay cả khi không có thay đổi. – Torbins

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