انجمنهای فارسی اوبونتو
کمک و پشتیبانی => انجمن عمومی => نویسنده: norouzi90 در 29 خرداد 1401، 04:48 بظ
-
با سلام و احترام،
می خواستم آخرین ورژن jwm را که از github دانلود کرده ام بر روی سیستمم نصب کنم.
در موارد زیر اگر مرا راهنمایی بفرمایید ، ممنون خواهم شد.منبع:
https://github.com/joewing/jwm (https://github.com/joewing/jwm)
۱-
To build JWM you will need a C compiler (gcc works), X11, and the
"development headers" for X11 and Xlib.
برای اینکار تنها نصب بسته build-essential کفایت می کند؟ یا بسته دیگری هم بایستی نصب کنم؟
۲-
If available and not disabled at compile time, JWM will also use
the following libraries:
- cairo and librsvg2 for SVG icons and backgrounds.
- pango (with the xft backend) for text layout.
- libjpeg for JPEG icons and backgrounds.
- libpng for PNG icons and backgrounds.
- libXext for the shape extension.
- libXrender for the render extension.
- libXmu for rounded corners.
- libXinerama for multiple head support.
- libXpm for XPM icons and backgrounds.
مفهومش چیه؟ کامپایل کرنل لینوکس یا کامپایل jwm ؟ اگر منظور در زمان کامپایل کرنل لینوکس ، از کجا می توانم بفهم کدامیک از اینها disable شده یا نه؟
۳-
0. For building from the git repository, run "./autogen.sh".
یعنی چکار کنم؟
-
سلام
توی مخازن هست که!
۱. نمیدونم
۲. برای کامپایل برنامه لازمن. با مدیر بسته نصبشون کنید.
۳. داخل پوشهای که بارگیری کردید، از فهرست راستکلیک، پایانه رو باز کنید (یا پایانه رو باز کنید و با cd به شاخهی jwm برید) و بعد اون دستور رو اجرا کنید. یه اسکریپته. «./» اولش میگه که یه پرونده داخل همین شاخهست.
-
توی مخازن هست که!
بله ، در مخازن هست ولی من دوست دارم آخرین ورژنش را بررسی کنم.البته بک آپ های لازم هم از سیستمم دارم که هر موقع خواستم به حالت قبل برگردانم. مشکلی از این بابت ندارم.
۲
. برای کامپایل برنامه لازمن. با مدیر بسته نصبشون کنید.
مثلا برای :
libjpeg for JPEG icons and backgrounds
برنامه ای بانام اختصاصی libjpeg وجود ندارد. در سیناپتیک هم که می زنم چندین برنامه در رابطه با این اسم وجود دارد.( عکس 1)
۳. داخل پوشهای که بارگیری کردید، از فهرست راستکلیک، پایانه رو باز کنید (یا پایانه رو باز کنید و با cd به شاخهی jwm برید) و بعد اون دستور رو اجرا کنید. یه اسکریپته. «./» اولش میگه که یه پرونده داخل همین شاخهست.
نمی شود. (عکس های 2 و 3)
-
۱- نه کافی نیست. باید علاوه بر build-essential، بسته libx11-dev رو هم نصب کنید.
۲- میگه اگه این چیزها رو موقع کامپایل jwm غیرفعال نکنید، باید یه سری چیزهای دیگه هم داشته باشید تا jwm بتونه کامپایل بشه.
۳- برای کامپایل jwm اول وارد دایرکتوری بشید که کد منبع jwm قرار داره.
اونجا اسکریپت autogen.sh رو اجرا کنید تا اسکریپت configure از فایل configure.ac ساخته بشه.
بعد اسکریپت configure رو اجرا کنید تا Makefile از فایل Makefile.in ایجاد بشه.
اگه آپشن help-- رو به اسکریپت configure بدید، یه راهنما درباره خودش نشون میده.
بعد از اینکه Makefile ایجاد شد، دستور make رو بزنید تا کامپایل شروع بشه. شاید بخواهید تعداد پردازشهای make رو بالا ببرید تا زمان کامپایل کم بشه. برای اینکار، آپشن j- رو به make بدید و جلوی آپشن، تعداد پردازشها رو مشخص کنید. مثلا اینجوری، کار کامپایل با ۶ تا پردازش انجام میشه:
make -j6
معمولا تعداد پردازشها رو برابر با تعداد هستههای فعال پردازنده در نظر میگیرن. با دستور nproc میتونید اون تعداد رو بدست بیارید.
پس با این حساب، این دستور باید توی سیستمهای مختلف مناسب باشه
make -j$(nproc)
ممکنه یه برنامه درست با چندین پردازش جدا کامپایل نشه. مطمئن نیستم که jwm اینجوری هست یا نه. ولی بعید میدونم اینجوری باشه.
در آخر بعد از اینکه کامپایل انجام شد، jwm رو روی سیستم نصب کنید.
make install
احتمالا برای اینکه نصب انجام بشه، لازم هست تا دستور بالا رو با دسترسی روت اجرا کنید. در این حالت میتونید از sudo استفاده کنید.
به احتمال زیاد، شما توی همون مرحله اجرای اسکریپت autogen.sh به مشکل میخورید چون فکر کنم یه سری از چیزهایی که برای کامپایل لازم هست رو ندارید.
-
؟!
-
با تشکر فراوان از آقایان Dragon- و mskf1383
-
چیکار کردید؟
-
در برخی از source code ها که می خواهیم ،آنها را کامپایل نماییم، کار خیلی راحت است ،تنها با سه دستور configure/. و make و sudo make install کار تمام است.چون:
۱- بسته هایی که برای خود سازوکار کامپایل کردن لازم است مانند automake , libx11-dev و... (این بسته ها چون می شود گفت تنها مختص کامپایل کردن هستند و به ندرت در توزیع ها بصورت پیش فرض نصب می گردند.) در سیستممان نصب کرده ایم.
مثلا برای کامپایل source code موردنظرمان، تنها کامپایل گر gcc کفایت می کند و یا اینکه به کامپایل گر ++g نیازمندیم؟ و سوالاتی از این دست....
۲-آیا وابستگی های نرم افزاری مربوط به خود پکیجی که می خواهیم نصب بکنیم در سیستممان وجود دارد؟ و یا آنها را می شناسیم تا نصب بکنیم؟
مثلا احتمال دارد نرم افزاری بنام gettext در سیستم شما ورژنش 0.19 باشد ولی لازم است که برای نصب این پکیج موردنظرمان ، ورژن gettext را ارتقا بدهیم به 0.20
۳- آیا برنامه نویس کارش را تا حد ممکن بدرستی انجام داده؟
آیا برنامه نویس در فایل README ، که معمولا در داخل همان پکیجی که دانلود کرده ایم هست، توضیحات لازم و کافی در رابطه با نصب برنامه و وابستگی های برنامه داده است؟
آیا برنامه نویس اسکریپتی در خود برنامه گنجانده که در قبال خطاهای پیش آمده و همچنین کمبود وابستگی ها در سیستم کاربر نصب کننده، راهنمایی های لازم را به کاربر بدهد؟
گاهی علاوه بر سه فرمان بالایی به یک فرمان دیگری هم نیازمندیم و آن هم زمانی است که برنامه نویس فایلی بنام autogen.sh در پکیج برنامه اش گنجاده باشد.
در اینجا ما قبل از اجرای سه تا فرمان بالایی ، دستور autogen.sh/. را اجرا می کنیم. همینطور که از نام این فایل پیداست ،این یک اسکریپت است و کارش این است که مجموعه دستوراتی که در داخلش است را اجرا بکند.( نمونه عکس autogen.sh.png )
ولی بهتر است بجای فرمان autogen.sh/. از فرمان autoreconf --install یا همان autoreconf -i استفاده شود.
مطالب بالایی ، مطالب کلی بود ، برویم سراغ نصب پکیج موردنظر من و مشکلاتی که با آن دست بگریبان بودم.البته با عکس می خواهم هم مشکلات و هم مراحلی را که طی کردم تا به نتیجه برسم را به شما نشان بدهم.
عکس ۱: چون بسته هایی برای نصاب پکیج موردنظرم نداشتم این خطا را داد. حداقل بایستی یک چیزهایی را نصب می کردم تا سیستم حداقل یک تکونی بخودش بده!
عکس۲:بسته dh-autoreconf را نصب کردم که با نصب آن کلی ابزار در رابطه با کامپایل به سیستمم اضافه می شود.
عکس ۳: نصاب برنامه به من می گوید که نیازمند gettext با ورژن 0.20 می باشم.
عکس ۴: ورژن gettext در سیستم من 0.19.18.1 است. یعنی چی؟ یعنی کارم دراومد. حالا خر پیدا کن و باقالی بار کن !!
عکس ۵: در پایین پنجره محاوره ای چیزی در رابطه با Force Version نوشته. بروم ببینم با آن یک کاری می توانم بکنم؟
عکس ۶: نامرد Force Version ، کمرنگ است. ای وای حالا چیکار کنم؟!
عکس ۷: بروم سراغ Unstable packages .
عکس ۸: یک update ای بکنم.
عکس ۹:یک upgrade ای بکنم تا با همه پکیج های Unstable در سیستمم جشن ترخیص بگیریم.
عکس ۱۰:با همه این کارها ورژن gettext فرقی نکرد،بروم سراغ گزینه Make for Reinstallition ، شاید دل آن برایم بسوزه؟
آقا نشد. بروم اینبار سراغ همان گزینه source code و یک بسته با ورژن بالاتر از gettext از اینترنت دانلود کنم، بلکه ، آره بلکه !
عکس ۱۱: خدا خیرش بده، نصب gettext توسط source code اش اذیتم نکرد، پسر خوبی بود. ولی اما....
می فرمایند هر چند که زحمت کشیدید و gettext را ارتقا دادید به ورژن بالاتر همونی که ما می خواستیم اما
gettext version 0.20 but the autoconf macros are from gettext version 0.19
حالا چکار بکنم؟! خوب اینبار می روم سر وقت source code برای autoconf ، ولی پیدا کردن این بسته به این راحتی ها نیست. خسته برمی گردم جای اولم و دوباره سیستمم ام
را restore را می نمایم تا فکر دیگری بکنم.
ورژن لینوکس mint ام 20.2 است ارتقا می دهم به 20.3 ( احتمالا حاوی مخازن unstable) ، ولی ورژن gettext پایین است. دوباره restore کردن سیستم.
در دبیان ما چهار تا حالت دارم :
stable - unstable - testing - experimental
شاید به نحوی بتوانم لینوکس مینت را هم به حالت experimental ارتقا بدهم. می روم در اینترنت تحقیق می کنم، انگار ورژن 21 برای اینکار گذاشته اند. خلاصه یک چیزی پیدا کردم و نصب کردم :
1. sudo apt update; sudo apt upgrade
2. sudo sed -i 's/una/vanessa/' /etc/apt/sources.list
3. sudo sed -i 's/una/vanessa/' /etc/apt/sources.list.d/official-package-repositories.list
2. sudo sed -i 's/focal/jammy/' /etc/apt/sources.list
3. sudo sed -i 's/focal/jammy/' /etc/apt/sources.list.d/official-package-repositories.list
sudo apt update;
sudo apt-get dist-upgrade
ولی حسابی پدرم را درآورد، تو این زمان طولانی که این نصب می شود باور کنید می توانستم حداقل سه تا خود لینوکس را نصب کنم!
بعد از نصب این چیز ، هر چند که سیستم آدم را به هم می زنه و همه چیز ریخته بهم مثلا صفحه لاگین نداری ، آیکن صدا نداری و الی ماشاا... ، ولی حداقل ورژن این gettext ،
درست شد و دیگه autoconf macros هم پسر خوبی شده بودند.
عکس ۱۲: ورژن gettext در سیستم نصب شده جدید.
عکس ۱۳: در رابطه با عکس ۱۳ یک نکته بسیار مهمی وجود دارد، آنهم در رابطه با خطای Makefile.am است. تا جایی که من فهمیدم فایل Makefile.am یک فایل تعریف شده توسط برنامه نویس است و توسط automake برای تولید فایل Makefile.in ( حروف am مخفف automake) استفاده می شود.
در ضمن اسکریپت پیکربندی از Makefile.in برای تولید Makefile استفاده می کند.
اینجا خطا داده که این فایل داخل فایل های منبع اتان نیست ، یعنی این فایل را برنامه نویس نساخته ، بهمین علت خطا داده است. از این خطا چشم پوشی کنید. برنامه نویس لزومی ندیده که این فایل را داخل پکیج source code نگذاشته است. مشکلی از این بایت پیش نمی آید و در ضمن شما در این رابطه نمی توانید کاری بکنید این فایل به برنامه نویس مربوط است نه شما.
پس بطور کلی این دستورات را بکار می بریم، البته بعد از نصب و ارتقا بسته های لازم:
autoreconf --install
configure/.
make
sudo make install
پاورقی: همچنین در مورد خطای config.rpath ، که ممکن است با آن مواجه بشویدکه می گوید چنین فایلی وجود ندارد ، مشکل این قضیه در این است که شما از دستور autogen.sh/. استفاده کرده اید.از این دستور استفاده نکنید و از دستور autoreconf --install استفاده کنید.
-
ادامه عکس ها:
-
ادامه عکس ها:
-
ادامه عکس ها:
-
در ضمن این بسته ها را نصب کردم ( و یا اینکه نصب بودند.)، البته بطور دقیق نمی توان بگویم کدامیک برای کاری که انجام می خواستم بدهم، لازم و کدامیک ضرورتی نداشت:
automake - autopoint - libx11-dev - libtool - gnulib - build-essential - autogen - shtool - dh-autoreconf - libssl-dev - libcurl4-gnutls-dev - libexpat1-dev - gettext - cmake - gcc - curl
البته بالشخصه ترجیح می دهم وقتی با موردی در زمینه کامپایل می خواهم کار بکنم، همگی اینها بر روی سیستمم باشد ، اینطوری کمتر توی دردسرهای بی خودی می افتم.
-
اون نسخه لینوکس مینت یکم قدیمیه. اون نسخه مبتنی بر اوبونتو ۲۰.۰۴ هست که دو سال پیش منتشر شده، پس برنامههای اون هم مال حدود ۲ سال پیش هست.
اینکه گفتید autoreconf رو به جای اسکریپت autogen.sh اجرا کنید، درست نیست. ممکنه فایلهای configure.ac و بقیه چیزهای مرتبط با نسخه autoreconf شما سازگار نباشه (مثل همین الان که دید) و اون اسکریپت autogen.sh این رو به شما بگه و کاری انجام نده.
ولی این مسئولیت برنامهنویس هست که اسکریپت رو به شکلی بنویسه که اون بررسیها رو انجام بده. توی مورد jwm، برنامهنویس اینکار رو نکرده بوده و شما موقع کامپایل به مشکل خوردید.
در ضمن ممکنه اسکریپت autogen.sh کارهای دیگهای هم انجام بده.
اینکه همینجوری مستقیم autoreconf رو به جای اسکریپت autogen.sh اجرا کنید، ممکنه نتایج غیرمنتظرهای داشته باشه.
اگه میخواهید اون اسکریپت رو اجرا نکنید، باید اول بررسیش کنید که چیکار میکنه و با توجه به اون، دستورات مورد نیاز رو خودتون به طور دستی اجرا کنید.
-
چون اقای Dragon- لطف نمودند و ارسالی دیگری داشتند ، هر چند که بسته jwm را نصب کرده بودم و مراحل نصب آن را در ارسالی قبل توضیح داده بودم، دلم خواست کمی بیشتر به این مورد بپردازم و با هم کمی با جزییات بیشتر به این موضوع بپردازیم.
سازنده و توسعه دهنده (JWM (Joe's Window Manager ، آقای Joe Wingbermuehle ( بصورت مخفف آقای joewing )می باشد.
در جستجوی مجددی که در اینترنت داشتم، توانستم به صفحه وبی در اینترنت دست پیدا کنم که پرسشگری می شود گفت که همین سوال مرا مطرح کرده بود
و جالب اینکه خود آقای Joe Wingbermuehle ، به این سوال پرسشگر پاسخ داده بودند.( عکس 1 و 2 )
https://bytemeta.vip/repo/joewing/jwm/issues/533 (https://bytemeta.vip/repo/joewing/jwm/issues/533)
پرسشگر از ubuntu 20.04 استفاده می کرد و من هم فعلا از Linux Mint 20.2 استفاده می کنم. هر دو تایمان برای نصب این برنامه یک مشکل داریم، gettext ای که در سیستم عاملمان داریم پایین تر از ورژن 0.20 می باشد و این برنامه به ورژن 0.20 یا بالاتر از gettext نیازمند است.
جواب آقای Joe Wingbermuehle :
There are a few options:
Probably the easiest is to download the latest release tarball for 2.4.0 (it should be pretty up-to-date), and not bother with autogen.sh.
You could instead update configure.ac to request the version of gettext for your system (the AM_GNU_GETTEXT_VERSION line).
You could try updating your system's gettext (rather than installing in /usr/local). I'd be careful doing that though
با هم این موارد را تک به تک بر روی سیستم من امتحان می کنیم:
Probably the easiest is to download the latest release tarball for 2.4.0 (it should be pretty up-to-date), and not bother with autogen.sh.
در اینجا آقای Wingbermuehle می گویند : احتمالاً سادهترین راه این است که آخرین نسخه tarball را برای نسخه 2.4.0 دانلود کنید (باید کاملاً به روز باشد) و با autogen.sh خود را خسته نکنید.
در اینجا من طبق این توصیه ، فعلا آخرین نسخه این JWM v2.4.3 را کنار می گذرم و نسخه پایین تر یعنی نسخه 2.4.0 از jwm را دانلود و می خواهم نصب نمایم.
در اینجا تنها همین سه فرمان configure/. و make و sudo make install کفایت می کند و همچنان که آقای Wingbermuehle برای این روش گفته اند ، اصلا نیازی
به استفاده از فرمان autogen.sh نیست. ( عکس های 3 تا 7 )
You could instead update configure.ac to request the version of gettext for your system (the AM_GNU_GETTEXT_VERSION line).
در اینجا دوباره بر می گردیم سراغ آخرین ورژن JWM v2.4.3 و اینبار می خواهیم آنرا نصب نماییم.
اینبار می رویم در داخل فایل configure.ac ، ورژن gettext را از 0.20 به 0.19 بصورت دستی تغییر می دهیم. ( عکس 8 )
با اجرای فرمان configure/. برخلاف نتایجی که از آن در آپشن قبلی گرفتیم، هیچ چیزی رخ نمی دهد.( عکس 9) بنابراین بنظر می رسد که علاوه بر دو بسته build-essential و libx11-dev ، نیازمندم ،بسته دیگری بنام dh-autoreconf را نصب کنم.
اینبار دستور autogen.sh/. را اجرا می کنم. این دستور عمل می کند و در ادامه مراحل نصب با این دستور مشکلی ندارم. ( عکس 10 )
دلم می خواهد از دستور autoreconf --install را هم اجرا کنم تا ببینم بجای دستور autogen.sh/. می توان این دستور را بکار ببرم. . ( عکس 11 ) ، چون فایل configure.ac برای ویرایش ورژن gettext سیستممان ویرایش کرده ایم ، این متن خطا می گوید که چون این فایل configure.ac بصورت محلی ویرایش شده است ، آنها را رونویسی نمی کند ،زیرا force-- مشخص نشده است.
اینبار از دستور autoreconf -vsi --force بجای دستور autoreconf --install استفاده می کنم.( عکس 12)
( همچنانکه قبلا هم گفته بودم به خطای no Make.file.am found هم توجه نمی کنیم.)
و ادامه مراحل در عکس های 13 الی 17 .
پس بطور خلاصه:
۱- نصب build-essential و libx11-dev و dh-autoreconf .
۲- ویرایش فایل configure.ac .
۳- دستور autogen.sh/. یا دستور autoreconf -vsi --force
۴- دستور configure/.
۵- دستور make
۶- دستور sudo make install
You could try updating your system's gettext (rather than installing in /usr/local). I'd be careful doing that though.
می شود گفت که این همان روشی است که من در ارسالی قبلی ام آنرا توضیح داده ام.
-
ادامه عکسها:
-
ادامه عکسها:
-
ادامه عکسها:
-
Probably the easiest is to download the latest release tarball for 2.4.0 (it should be pretty up-to-date), and not bother with autogen.sh.
در اینجا آقای Wingbermuehle می گویند : احتمالاً سادهترین راه این است که آخرین نسخه tarball را برای نسخه 2.4.0 دانلود کنید (باید کاملاً به روز باشد) و با autogen.sh خود را خسته نکنید.
در اینجا من طبق این توصیه ، فعلا آخرین نسخه این JWM v2.4.3 را کنار می گذرم و نسخه پایین تر یعنی نسخه 2.4.0 از jwm را دانلود و می خواهم نصب نمایم.
در اینجا تنها همین سه فرمان configure/. و make و sudo make install کفایت می کند و همچنان که آقای Wingbermuehle برای این روش گفته اند ، اصلا نیازی
به استفاده از فرمان autogen.sh نیست. ( عکس های 3 تا 7 )
جوابی که دادند، مربوط به ۶ ماه پیش بوده. توی اون زمان آخرین نسخه منتشر شده jwm، نسخه ۲.۴.۰ بوده.
اگه با آخرین نسخه منتشر شده فعلی، یعنی ۲.۴.۲ همین کارها رو امتحان کنید، باید باز هم جواب بده.
در ضمن هنوز نسخه ۲.۴.۳ از jwm منتشر نشده.
You could instead update configure.ac to request the version of gettext for your system (the AM_GNU_GETTEXT_VERSION line).
در اینجا دوباره بر می گردیم سراغ آخرین ورژن JWM v2.4.3 و اینبار می خواهیم آنرا نصب نماییم.
اینبار می رویم در داخل فایل configure.ac ، ورژن gettext را از 0.20 به 0.19 بصورت دستی تغییر می دهیم. ( عکس 8 )
با اجرای فرمان configure/. برخلاف نتایجی که از آن در آپشن قبلی گرفتیم، هیچ چیزی رخ نمی دهد.( عکس 9)
چون که اون موقع اسکریپت autogen.sh رو اجرا نکرده بودید. در نتیجه فایل configure هم وجود نداشته.
بنابراین بنظر می رسد که علاوه بر دو بسته build-essential و libx11-dev ، نیازمندم ،بسته دیگری بنام dh-autoreconf را نصب کنم.
به بسته dh-autoreconf نیازی نداشتید. این بسته پشتیبانی از autoreconf رو به debhelper اضافه میکنه. debhelper یه برنامه برای ایجاد بستههای deb هست.
شما به بستههای autoconf وlibtool و automake نیاز داشتید. بسته dh-autoreconf به این بستهها وابسته هست. به خاطر همین با نصب dh-autoreconf، اون بستهها هم نصب شدند و تونستید jwm رو کامپایل کنید.
دلم می خواهد از دستور autoreconf --install را هم اجرا کنم تا ببینم بجای دستور autogen.sh/. می توان این دستور را بکار ببرم. . ( عکس 11 ) ، چون فایل configure.ac برای ویرایش ورژن gettext سیستممان ویرایش کرده ایم ، این متن خطا می گوید که چون این فایل configure.ac بصورت محلی ویرایش شده است ، آنها را رونویسی نمی کند ،زیرا force-- مشخص نشده است.
فکر نکنم اون خطاها به این خاطر بوده باشند که فایل configure.ac رو ویرایش کردید.
احتمالا به این خاطر اون خطاها رو دیدید که قبلا یه بار اسکریپت configure رو ایجاد و اجرا کرده بودید. اگه در اون شرایط make clean رو میزدید، احتمالا اون فایلها به حالت قبلی بر میگشتند و autoreconf خطا نمیداد.
-
!
-
شاید توی کدهای برنامه، نسخهای که نمایش داده میشه تغییر کرده باشه ولی هنوز اون نسخه به طور رسمی منتشر نشده.
اگه منتشر شده بود، میتونستید توی این صفحه (https://github.com/joewing/jwm/releases) ببینیدش. آخرین نسخه توی این صفحه، ۲.۴.۲ هست.
-
شاید توی کدهای برنامه، نسخهای که نمایش داده میشه تغییر کرده باشه ولی هنوز اون نسخه به طور رسمی منتشر نشده.
اگه منتشر شده بود، میتونید توی این صفحه (https://github.com/joewing/jwm/releases) ببینیدش. آخرین نسخه توی این صفحه، ۲.۴.۲ هست.
یعنی خودش تغییر داده؟
-
شاید توی کدهای برنامه، نسخهای که نمایش داده میشه تغییر کرده باشه ولی هنوز اون نسخه به طور رسمی منتشر نشده.
اگه منتشر شده بود، میتونید توی این صفحه (https://github.com/joewing/jwm/releases) ببینیدش. آخرین نسخه توی این صفحه، ۲.۴.۲ هست.
عکسهای 1 و 2 .
در ضمن بعد از اتمام کامپایل و نصب برنامه در مرحله sudo make install ، چکار بایستی بکنم؟ آیا بایستی بصورت دستی روی پوشه ای که عمل کامپایل انجام داده ام ، کلیک راست کنم و آنرا delete کنم ؟
-
توضیح بیشتر در رابطه با ارسالی قبلی ام و کمی مطالب بیشتر:
در رابطه با عکس 1 ارسالی قبلی:
در صفحه اصلی https://github.com/joewing/jwm (https://github.com/joewing/jwm) ، همانطور که در عکس 1 ، در ارسالی قبلیم نشان داده ام ، اگر بر روی دکمه Code کلیک کنید و سپس بر روی
کادر محاوره ای باز شده بر روی Download ZIP کلیک کنید ، فایلی بنام jwm-master.zip برایتان دانلود خواهد شد که با نصب آن نسخه JWM v2.4.3 برایتان نصب خواهد شد.
اگر هم در صفحه اصلی https://github.com/joewing/jwm (https://github.com/joewing/jwm) ،در قسمت سمت راست بروید سر وقت Releases و از آنجا بخواهید دانلود کنید ،
سه تا ورژن با نامهای v2.4.2 و v2.4.1 و v2.4.0 در اختیارتان خواهد بود.
فکر نکنم اون خطاها به این خاطر بوده باشند که فایل configure.ac رو ویرایش کردید.
احتمالا به این خاطر اون خطاها رو دیدید که قبلا یه بار اسکریپت configure رو ایجاد و اجرا کرده بودید. اگه در اون شرایط make clean رو میزدید، احتمالا اون فایلها به حالت قبلی بر میگشتند و autoreconf خطا نمیداد.
این مطلب را دوباره چک کردم. البته اینبار هم مثل تمامی دفعات قبلی در ارسالی هایم در اینجا، برای اینکه نتایج عملکرد موارد قبلی بر موارد فعلی تاثیر نگذاشته باشد هر جا که لازم می دیدم یا به دفعات سیستم را restore می کردم(مخصوصا بعد از suso make install) و یا اینکه پوشه extract شده را حذف و دوباره از فایل تاربال مادر extract می کردم.
در اینجا سیستم را restore کردم و دوباره از فایل zip ، پوشه جدید را extract کردم ، بعد از ویرایش فایل configure.ac ، اولین فرمانی را که اجرا کردم،
فرمان autoreconf --install بود، همانطور که می بینید همان خطای force-- دیده می شود، که با بکارگیری فرمان autoreconf -vsi --force ، این مشکل حل می شود.
جهل نمی کنم، اگر باز فکر می کنید که شاید این خطا از جای دیگری بوده باشد بگویید ،امتحان کنم.( عکس force-error.png )
یک مورد دیگری هم که برایم سوال شده این است که در مراحل کامپایل ، تنها در مرحله sudo make install ، فایل ها را در دایرکتوری مقصد در شاخه های سیستم عامل کپی می کند(معمولا در مسیرهای مانند usr/lib/ یا usr/bin/ ) ؟ یا اینکه اینکار در مراحل قبل تر در configure/. یا make هم صورت می پذیرد؟ و فایل هایی در شاخه هایی از سیستم عامل کپی یا تغییراتی در تنظیمات آن فایل ها صورت می پذیرد؟
خیلی ساده تر اینکه در فرامین قبل از sudo make install ، هر چی رخ می ده فقط در داخل همین پوشه extract شده که در داخلش فرآیند کامپایل را انجام می دهیم ، رخ می ده و کاری با جاهای دیگر ندارد؟
ولی در configure/. یک چیزهایی در رابطه با gcc -c -g -O2 -DLOCALEDIR=\"/usr/local/share/locale\" action.c و ....نوشته شده ، یعنی یک چیزهایی رفته
در usr/local/share/ کپی کرده یا تغییر داده؟! ( عکس make )
یک مورد دیگر اینکه، استفاده کنندگان نرم افزارها از طریق کامپایل source code ها ، آیا تنها به دلیل کمبود وقتشان مجبورند از دستوراتی مانند:
make clean - make distclean - make uninstall - make maintainer-clean - make mrproper - make clobber - make mostlyclean
استفاده نمایند؟ و یا دلایل دیگری هم دارند؟ چرا همه چیز را پاک نمی کنند و از اول کامپایل نمی کنند؟
در ضمن این دستورات بالایی تنها در محدوده عملکرد قبل از اجرای sudo make install بدرد می خورند ویا اینکه حتی بعد از اجرای sudo make install می توانند ، مفید باشند؟
-
یعنی خودش تغییر داده؟
چه کسی چه چیزی رو تغییر داده؟
منظورتون چیه؟
در ضمن بعد از اتمام کامپایل و نصب برنامه در مرحله sudo make install ، چکار بایستی بکنم؟ آیا بایستی بصورت دستی روی پوشه ای که عمل کامپایل انجام داده ام ، کلیک راست کنم و آنرا delete کنم ؟
بعد از نصب میتونید هر کاری خواستید با اون دایرکتوری انجام بدید. شاید بخواهید نگهش دارید تا بدونید چه چیزهایی کامپایل شدند. شاید هم بخواهید برای آزاد کردن فضای ذخیرهسازی، اون دایرکتوری رو کلا پاک کنید.
توضیح بیشتر در رابطه با ارسالی قبلی ام و کمی مطالب بیشتر:
در رابطه با عکس 1 ارسالی قبلی:
در صفحه اصلی https://github.com/joewing/jwm (https://github.com/joewing/jwm) ، همانطور که در عکس 1 ، در ارسالی قبلیم نشان داده ام ، اگر بر روی دکمه Code کلیک کنید و سپس بر روی
کادر محاوره ای باز شده بر روی Download ZIP کلیک کنید ، فایلی بنام jwm-master.zip برایتان دانلود خواهد شد که با نصب آن نسخه JWM v2.4.3 برایتان نصب خواهد شد.
اون چیزی که دانلود میکنید، jwm نسخه ۲.۴.۳ نیست. این چیزهایی که میبینید، چیزهایی هستند که قراره توی نسخه ۲.۴.۳ قرار بگیرن. اون نسخه هنوز به طور رسمی منتشر نشده. چیزی که دریافت کردید، نسخه در حال توسعه برنامه هست.
اگر هم در صفحه اصلی https://github.com/joewing/jwm (https://github.com/joewing/jwm) ،در قسمت سمت راست بروید سر وقت Releases و از آنجا بخواهید دانلود کنید ،
سه تا ورژن با نامهای v2.4.2 و v2.4.1 و v2.4.0 در اختیارتان خواهد بود.
اینجا جایی هست که میتونید نسخههای رسمی منتشر شده رو ببینید. همونطور که مشخصه، هنوز نسخه ۲.۴.۳ اینجا نیست. یعنی هنوز به طور رسمی منتشر نشده و در حال توسعه هست.
فکر نکنم اون خطاها به این خاطر بوده باشند که فایل configure.ac رو ویرایش کردید.
احتمالا به این خاطر اون خطاها رو دیدید که قبلا یه بار اسکریپت configure رو ایجاد و اجرا کرده بودید. اگه در اون شرایط make clean رو میزدید، احتمالا اون فایلها به حالت قبلی بر میگشتند و autoreconf خطا نمیداد.
این مطلب را دوباره چک کردم.
...
دوباره اسکریپت autogen.sh رو دیدم. خود توسعهدهنده هم آپشن f- رو به autoreconf داده. برای autoreconf، آپشن f- نسخه کوتاه شده force-- هست.
پس به نظر میاد با توجه به شرایط پروژه، لازمه اون آپشن به autoreconf داده بشه.
پروژههای دیگه رو هم که بررسی کردم، اونها هم آپشن f- رو به autoreconf داده بودند.
یک مورد دیگری هم که برایم سوال شده این است که در مراحل کامپایل ، تنها در مرحله sudo make install ، فایل ها را در دایرکتوری مقصد در شاخه های سیستم عامل کپی می کند(معمولا در مسیرهای مانند usr/lib/ یا usr/bin/ ) ؟ یا اینکه اینکار در مراحل قبل تر در configure/. یا make هم صورت می پذیرد؟ و فایل هایی در شاخه هایی از سیستم عامل کپی یا تغییراتی در تنظیمات آن فایل ها صورت می پذیرد؟
خیلی ساده تر اینکه در فرامین قبل از sudo make install ، هر چی رخ می ده فقط در داخل همین پوشه extract شده که در داخلش فرآیند کامپایل را انجام می دهیم ، رخ می ده و کاری با جاهای دیگر ندارد؟
تا قبل از اجرای make install، چیزی توی دایرکتوریهای سیستمی نصب نمیشه. حداقل به طور معمول چنین اتفاقی نمیافته. توسعهدهنده میتونه اسکریپتها و makefile ها جوری بنویسه که چنین اتفاقی بیوفته ولی من تا حالا ندیدم کسی اینجوری عمل کنه.
تا جایی که makefile مربوط به jwm رو دیدم، اینکار رو انجام نمیداد.
به غیر از این، معمولا برای تغییر یا قرار دادن فایل داخل دایرکتوریهای مهم مثل /usr/ یا /etc/ لازمه دسترسی روت داشت. از اونجایی که شما اون مراحل رو بدون دسترسی روت انجام دادید، حتی اگه اسکریپتها یا makefile میخواستند چنین کاری انجام بدهند، نمیتونستند.
ولی در configure/. یک چیزهایی در رابطه با gcc -c -g -O2 -DLOCALEDIR=\"/usr/local/share/locale\" action.c و ....نوشته شده ، یعنی یک چیزهایی رفته
در usr/local/share/ کپی کرده یا تغییر داده؟! ( عکس make )
نه. چیزی رو داخل /usr/local/share/locale/ تغییر نداده.
=DLOCALEDIR- باعث شده یه ماکرو با اسم LOCALEDIR و مقدار "/usr/local/share/locale/" برای پیش پردازنده c ایجاد بشه. اون علامتهای " هم جز مقدار ماکرو LOCALEDIR هست.
اون علامتهای backslash (\) برای این هستند تا پوسته اونها رو برای خودش معنی نکنه. اگه اون backslash ها نبود، پوسته علامتهای " رو خودش معنی میکرد و مقدار ماکرو LOCALEDIR میشد /usr/local/share/locales/ که جلوتر، کامپایلر c به اون گیر میداد و کامپایل انجام نمیشد.
با توجه به اسمی که اون ماکرو داره، احتمالا کارش این هست که برای jwm مشخص کنه دایرکتوری locale ها کجاست. داخل دایرکتوری locale ها، چیزهایی که میتونه باعث بشه برنامه برای یه محل خاص قابل استفاده بشه قرار میگیره. مثلا چینش صفحه کلید، زبان اونجا، نحوه نمایش تاریخ و اینجور چیزها.
پیش پردازنده c که بالاتر دیدید، ربط خاصی به پردازنده کامپیوتر نداره.
کامپایل کد c به فایل اجرایی یه فرایند یه مرحلهای نیست، بلکه یه فرایندیه که توی چندین مرحله انجام میشه.
مرحله اول پیش پردازش هست. توی این مرحله، پیش پردازنده c اجرا میشه و متن کد رو تغییر میده. خروجی این مرحله همچنان متن هست که هنوز به صورت کد c شناسایی میشه.
توی این مرحله در واقعیت متن برنامه جایگزین میشه. اینکه چه چیزی جایگزین بشه، به راهنماهای پیش پردازنده توی کد بستگی داره. توی این مرحله، کامنتهای برنامه هم پاک میشن.
راهنماهای پیش پردازنده توی c با علامت # شروع میشن. برای مثال ممکنه توی خیلی از کدهای c، اولهای فایل چنین چیزی ببینید:
#include <"stdio.h">
یکی از راهنماهای پیش پردازنده c، راهنمای define# هست. با این میشه یه ماکرو رو توی کد تعریف کرد. میشه برای اون ماکرو مقدار در نظر گرفت، میشه هم اون رو بدون مقدار تعریف کرد.
برای مثال این رو ببینید:
#define A 10
#define B 6.9
#define TEXT "this is an example"
int n = A;
double m = B;
const char *msg = TEXT;
بعد از اجرای مرحله پیش پردازش روی کد بالا، خروجی میشه این:
int n = 10;
double m = 6.9;
const char *msg = "this is an example"
در واقعیت کار خیلی خاصی انجام نشده، فقط متن برنامه تغییر کرده.
ماکروها رو میشه توی خود کد برنامه تعریف کرد. میشه اونها رو هم از طریق خط فرمانِ پیش پردازنده c مشخص کرد.
با gcc -E code.c میتونید پیش پردازش شده فایل code.c رو دید.
از پیش پردازنده c میشه برای کارهای جایگزین کردن متن استفاده کرد ولی اگه قراره جایگزین کردن، زیاد و پیشرفته باشه؛ بهتره از ابزارهای مخصوص اینکار مثل m4 استفاده بشه.
یک مورد دیگر اینکه، توسعه دهندگان نرم افزارها ، آیا تنها به دلیل کمبود وقتشان مجبورند از دستوراتی مانند:
make clean - make distclean - make uninstall - make maintainer-clean - make mrproper - make clobber - make mostlyclean
استفاده نمایند؟ و یا دلایل دیگری هم دارند؟ چرا همه چیز را پاک نمی کنند و از اول کامپایل نمی کنند؟
چون ممکنه لازم باشه به یه سری از چیزهایی که موقع کامپایل ایجاد شده دسترسی داشته باشند و پاک کردن هر چیزی که موقع کامپایل ایجاد شده، گزینه مناسبی نباشه.
در ضمن این دستورات بالایی تنها در محدوده عملکرد قبل از اجرای sudo make install بدرد می خورند ویا اینکه حتی بعد از اجرای sudo make install می توانند ، مفید باشند؟
بستگی داره که makefile چجوری نوشته شده باشه. مثلا ممکنه یه make uninstall هم باشه که کارش اینه که چیزی که نصب شده رو پاک کنه.
-
در نصب هایی که تاکنون برای jwm از source آن داشته ایم ، با package manager سیستم عامل مان کاری نداشته ایم. چون خارج از سیستم مدیریت بسته ، بسته ای
را از source اش نصب کرده ایم ، بنابراین در هنگام حذف این بسته ، از package manager سیستممان نمی توانیم کمک بگیریم.
می توانیم از دستوراتی که در ارسالی قبلی ام داشته ام برای حذف این بسته از سیستممان بهره بگیریم مثلا sudo make uninstall
ولی اگر بخواهیم پکیج منیجر سیستممان این بسته موردنظرمان را بشناسد.
بنابراین ابتدا، بسته ای بنام checkinstall را نصب می نماییم.
sudo apt install checkinstall
این CheckInstall یک برنامه کامپیوتری برای سیستم عامل های مشابه یونیکس است که با استفاده از سیستم های مدیریت بسته، نصب
و حذف نرم افزارهای کامپایل شده از منبع را آسان می کند.
بنابراین مراحل نصب اینطوری می شود:
۱- ویرایش فایل configure.ac و تغییر ورژن gettext از 0.20 به 0.19 .
۲- سپس autogen.sh/.
۳- سپس configure/.
۴- سپس make
۵- اما در این قسمت از دستور sudo make install دیگر استفاده نمی کنیم و بجایش از دستور sudo checkinstall استفاده می کنیم.( عکس 1)
در اینجا چند نکته مهم وجود دارد که به آنها می پردازیم:
بعد از اینکه این دستور را اجرا کردیم ، سیستم می پرسد:
The package documentation directory ./doc-pak does not exist.
Should I create a default set of package docs? [y]:
کلید y را زده و سپس اینتر را می زنیم.(عکس 2)
بعد این مورد را از ما می خواهد که :
Please write a description for the package.
End your description with an empty line or EOF
لطفا توضیحاتی برای بسته بنویسید.توضیحات خود را با یک خط خالی یا EOF پایان دهید. البته من چون نیازی برای نوشتن توضیحی برای این بسته نداشتم ، چیزی نمی نویسم
و تنها اینتر می زنم.(عکس 3)
بعد این مورد را از ما می پرسد که :
This package will be built according to these values:
این بسته با توجه به این مقادیر ساخته خواهد شد .( عکس 4)
ولی در اینجا ضروری است که نسبت به اصلاح دو تا آیتم اقدام نماییم:
در قسمت :
Enter a number to change any of them or press ENTER to continue:
عدد 2 (را که مربوط به :Name است) را می نویسیم و سپس اینتر را می زنیم. همانطور که می بینید برای :Name بصورت پیش فرض jwm را در نظر گرفته است.
بهتر است این واژه را تغییر دهیم ، اگر ما این برنامه را با این نام نصب کنیم ، بسته مورد نظرمان
نصب می شود ولی چون در مخازن اصلی بسته ای بنام jwm وجود دارد. هر وقت ما sudo apt update و سپس sudo apt upgrade نماییم ، بسته موردنظرمان در لیست
بسته های update شده می آید و سپس با upgrade بسته فعلی امان حذف و بسته موجود در مخازن نصب می گردد.
بنابراین من اسمی را انتخاب می کنم که در مخازن بسته ای با آن اسم نباشد مثلا: my-jwm ( عکس 5)
اینبار نوبت تغییر مقدار Version می باشیم ، اگر تغییرش ندهیم این خطا را بعدا خواهید دید.(عکس های 6 و 7)
برای تغییر مقدار Version در جلوی عبارت :
Enter a number to change any of them or press ENTER to continue:
عدد 3 را می نویسم و سپس اینتر را می زنم. من مقدار متغییر Version را از مقدار " master" به مقدار "1" تغییر می دهم.( عکس 8 )
سپس دوباره اینتر را می زنم تا مراحل نصب ادامه یابد ، در اینجا با پیام Done. The new package has been installed and saved to
متوجه می شوم که نصب بسته جدیدمان با موفقیت تمام شده است.(عکس 9)
همچنین در پایان قید کرده است که :
You can remove it from your system anytime using:
dpkg -r my-jwm
یعنی هر زمان که بخواهید می توانید با این دستور این بسته را از سیستمتان البته با کمک و مدیریت package manager از سیستمتان حذف نمایید.
یک سری هم به synaptic می زنیم ، همانطور که می بینید ، بسته ای با نام my-jwm وجود دارد( عکس 10) که این بسته را از آنجا هم می توانید حذف کنید و همچنین
از طریق sudo apt remove هم می توانید آنرا حذف نمایید.(عکس 11)
بنظرم این روش نسبت به روشهای قبلی اصولی تر است چونکه پکیج منیجر سیستممان آنرا می شناسد.
-
ادامه عکسها:
-
ادامه عکسها:
-
ممکنه این روش بعضی وقتا جواب نده. برای مثال ممکنه makefile یه سری کارهایی هم انجام بده که معمولا اسکریپتهای preinstall یا postinstall توی بستههای deb انجام میدن. در اینصورت ممکنه checkinstall یه بسته deb ایجاد کنه که فقط فایلهای اون برنامه رو داره ولی اسکریپتهای postinstall و preinstall مناسب نداره.
ممکنه لازم باشه قبل یا بعد از حذف برنامه، یه سری کار انجام بشه. برای بستههای نصب شده از مخازن، اینکارها توسط اسکریپتهای postrm و prerm انجام میشه. اما اون بسته deb که توسط checkinstall ساخته شده، بعیده چنین اسکریپتهای داشته باشه.
در حالت کلی، نصب درست یه برنامه از طریق کد منبع، نیاز به این داره که به درستی از برنامه آگاه باشید و بدونید چه کارهایی لازمه انجام بشن.
در مورد بستههای مخازن رسمی، اینکارها توسط توسعهدهندههای توزیع انجام شده. وقتی خودتون دستی یه چیزی رو نصب میکنید، اینکارها به عهده خودتون قرار میگیره.
-
با تشکر مجدد از آقای Dragon- عزیز.