थिटन के उत्तर से प्रेरित कुछ खुदाई के बाद, और पूरी तरह से परीक्षण और त्रुटि, मुझे अंत में मेरी समस्या का समाधान मिला। यह पता चला है कि dpkg-gencontrol एक्जिक्यूटिव से पैकेज निर्भरताओं को अनुमानित करने का टूल नहीं है, dpkg-shlibdeps है। हालांकि, पैकेज तैयार करने में मदद के लिए दोनों कार्यक्रमों के लिए चीजों को ध्यान से स्थापित करने की आवश्यकता है। पढ़ें ....
dpkg-shlibdeps -O <executable>
रनिंग के परिणामस्वरूप उस निष्पादन योग्य के लिए स्थापित किए जाने वाले संकुल और संस्करणों की एक सूची में परिणाम होता है। उत्तम। लगभग। आदर्श रूप से dpkg-gencontrol इसकी प्रसंस्करण में इसका उपयोग कर सकता है, जो कि इसके परिवर्तनीय प्रतिस्थापन सुविधा के माध्यम से करने में सक्षम होने का दावा करता है।
इसे आसानी से करने के लिए, मुझे एक निर्देशिका संरचना बनाना पड़ा जो डेबियन पैकेजिंग टूल की अपेक्षा से मेल खाता था। यह इस तरह से मूल रूप से दिखता है:
my_project_directory/
main.c (or other source code, etc.)
debian/
changelog (created by hand; see below)
control (this is basically a template, created by hand; see below)
files (created by dpkg-gencontrol)
substvars (created by dpkg-shlibdeps and used by dpkg-gencontrol)
tmp/ (tmp is the root of the target system's filesystem)
path/
to/
my/
project/
executable_1 (this will be installed at /path/to/my/project)
executable_2 (this, too)
var/
www/
index.php (this will be installed at /var/www on target systems)
DEBIAN/ (create this by hand)
control (created by dpkg-gencontrol and used in the final package)
ध्यान दें कि डेबियन पैकेजिंग उपकरण के तहत डेबियन/tmp/मालिक और सभी फ़ाइलों के समूह की रक्षा। इस प्रकार यदि आप रूट या स्वामित्व वाले किसी अन्य उपयोगकर्ता के स्वामित्व वाली फाइलें चाहते हैं, तो चीजें मुश्किल हो जाती हैं। एक विकल्प है कि डेबियन निर्देशिका पेड़ को रूट के रूप में तैयार करना है, और मालिकों को अपनी पसंद के अनुसार सेट करना है। यदि आप रूट के रूप में नहीं चलना पसंद करते हैं, या इसकी अनुमति नहीं है, तो दूसरा तरीका है।
dpkg-deb -b debian/tmp .
(जो .deb पैकेज बनाता है, उदाहरण के लिए नीचे देखें) के साथ स्वामित्व को समायोजित करने के लिए चोटी इत्यादि जैसी एक स्क्रिप्ट बनाएं। फेकरूट के माध्यम से इसे चलाएं, एक अन्य डेबियन टूल, जैसे: fakeroot ./fix_ownerships_and_build.sh
। फ़करूट प्रोग्राम को व्यवहार करने देता है जैसे कि वे मूल थे, वास्तव में चीजों को बदलने के बिना रूट करते थे। यह सिर्फ इस परिदृश्य के लिए बनाया गया था।
मैंने देखा कि क्यों डीपीकेजी-जेनस्ट्रक्चर "पहले ब्लॉक में स्रोत क्षेत्र की कमी" त्रुटि उत्पन्न कर रहा था, यहां तक कि अपने पर्ल स्रोत को पढ़ने के लिए भी जा रहा है। जैसे-जैसे होता है, त्रुटि कोड पर्याप्त संदर्भ प्रदान किए बिना सटीक है, यह जानने के लिए कि क्या करना है: नियंत्रण फ़ाइल को वास्तव में "स्रोत" नामक फ़ील्ड की आवश्यकता होती है, जिसमें पहले (दो) ब्लॉक होते हैं।
दो प्रकार के डेबियन पैकेज, स्रोत और बाइनरी हैं। मैंने सोचा कि मुझे बाइनरी की जरूरत है क्योंकि मैं बस इसमें संकलित निष्पादन योग्य रखना चाहता हूं, लेकिन मैं इसे काम नहीं कर सका। मैंने एक स्रोत पैकेज की कोशिश की, और मेरी नियंत्रण फ़ाइल में एक स्रोत फ़ील्ड जोड़ा। यह "पहले ब्लॉक में स्रोत क्षेत्र की कमी" त्रुटि से छुटकारा पा लिया, लेकिन दूसरे का नेतृत्व किया। दस्तावेज़ीकरण को और अधिक बारीकी से पढ़ते हुए, मुझे एहसास हुआ कि स्रोत संकुल need two "paragraphs" उनकी नियंत्रण फ़ाइलों में। एक बार जब मैं अपने नियंत्रण फ़ाइल इस तरह देखने के लिए बदल गया है, यह (लगभग) काम करना शुरू किया:
Source: my-package
Maintainer: Joe Coder <[email protected]>
Package: my-package
Priority: optional
Architecture: amd64
Depends: ${shlibs:Depends}, apache2, php5
Description: The My-Package System
A longer description that runs to the end of one line and then
extends to another line.
क्या अभी भी याद आ रही थी एक बदलाव का फ़ाइल था। यह महत्वपूर्ण परिवर्तन, संस्करण संख्या, तिथियां, और जिम्मेदार लोगों के साथ पैकेज की रिलीज का इतिहास रखने के लिए एक फ़ाइल है। मैं आमतौर पर इस तरह की चीज को अपने प्रारूप में बनाए रखता हूं, जिसे मैंने ध्यान से डेबियन चेंजलॉग प्रारूप में परिवर्तित कर दिया। किसी कारण से, बदलाव का अंतिम पैकेज से निकाल दिया गया है, इसलिए मैं अपने इतिहास फ़ाइल अकेला छोड़ दिया और बदले में एक प्लेसहोल्डर इस्तेमाल किया है, जो इस प्रकार है:
my-package (1.0) unstable; urgency=low
* placeholder changelog to satisfy dpkg-gencontrol
-- Joe Coder <[email protected]> Thu, 3 Nov 2011 16:49:00 -0700
* के साथ लाइन पर दो प्रमुख रिक्त स्थान के लिए आवश्यक हैं , जैसा कि ईमेल पते और तारीख के बीच दो रिक्त स्थान हैं, के साथ लाइन पर एकल अग्रणी स्थान है। और हां, तारीख को सटीक, टाइमज़ोन और सभी होने की आवश्यकता है, भले ही इसे सटीक होने की आवश्यकता न हो।
सब कुछ एक साथ लाना, एक डेबियन निर्देशिका वृक्ष जैसा कि ऊपर वर्णित की स्थापना के साथ, एक पैकेज बनाने की जरूरत आदेशों के अनुक्रम इस प्रकार हैं:
dpkg-shlibdeps debian/tmp/path/to/my/project/executable_1 \
debian/tmp/path/to/my/project/executable_2
dpkg-gencontrol -v1.1 (or whatever version you are building)
fakeroot ./fix_ownerships_and_build.sh
जहां fix_ownerships_and_build.sh इस तरह दिखता है:
chown -R root:root debian/tmp/path (or whatever user is appropriate)
chown -R www-data:www-data debian/tmp/var/www/* (same goes here)
dpkg-deb -b debian/tmp . (this leads to a nice my-package_1.1_amd64.deb file)
तो यह है। उम्मीद है कि यह जवाब दूसरों की प्रगति को तेज़ी से करने में मदद करेगा।
अच्छा काम, लेकिन आपने डीपीकेजी-बिल्डपैकेज का एक अच्छा हिस्सा पुन: प्रोग्राम किया। आप उस उपकरण से अवगत हैं, है ना? – thiton
कुछ हद तक। दर्जनों डीपीकेजी से संबंधित उपकरण हैं, और मुझे चीजों को सरल रखने में दिलचस्पी थी। डेबियन उपकरण भी डेबियन के साथ वितरण के लिए अपस्ट्रीम स्रोतों से संकुल बनाने पर केंद्रित थे, जो कि मैं ऐसा करने की कोशिश नहीं कर रहा था। मैंने एक साधारण निर्देशिका पेड़, न्यूनतम नियंत्रण फ़ाइल, और 'डीपीकेजी-डीबी-बी' के लिए एक एकल कॉल बनाने के साथ शुरुआत की थी। मैं जो चाहता था उसे पाने के लिए उस आधार पर न्यूनतम जोड़ों को खोजने की कोशिश कर रहा था। यह तरह बढ़ गया। :) मैं dpkg-buildpackage में देखता हूँ। व्हील पुनर्विचार अक्सर चीजों को सीखने का एक बड़ा हिस्सा होता है। –