Linux, Unix хэрэглэгчдийн дунд C/C++ дээр бичигдсэн програмыг соорсоос нь хөрвүүлэн суулгах, тохируулахтай холбоотой бэрхшээл маш их тохиолддог. Харин хөгжүүлэгчдийн дунд нэг програм бичээд бүх орчин дээр ажиллахаар хийхтэй холбоотой бэрхшээл маш их өргөн байдаг. Энэ бүгд чухам юунаас болдог вэ?
Эдгээр бэрхшээлийг бага ч гэсэн шийдвэрлэдэг болоход чухал хэрэгтэйн учир GNU autotools-ийн талаар товч дурдая гэж бодлоо.
Хэрэв миний энд бичихийг алгасан энэ багажуудыг бие даан судлахаар бол дараах 2 материалыг энд байгаа дарааллаар уншаарай. Мэдээж энгийн хэрэглэгчид бол уншаад хэрэггүй. Хөгжүүлэгчид, ситемийн админ гэх мэт техникийн мэргэжлийнхэн үзэж болно.
1. http://www.lrde.epita.fr/~adl/autotools.html
2.
http://sourceware.org/autobook/autobook/autobook_toc.html#SEC_Contents Дээрх материалуудын уншихаасаа өмнө юу болох тухай товч танилцуулга өөрийн хар үгээр товч тайлбар бичие. (Албан ёсны он сар, албан газар, хүний нэрсийг мэдээж санахгүй байгаа тул нарийвчилж уншцгаана биз)
Unix-ийг түүхийн хувьд аваад үзвэл анх 1969 онд манийг төрөхөөс өмнө бичигдсэн юм гэдэг. Энэ нь далаад онуудад худалдагдах нь зөвшөөрөгдөөгүй байх үедээ их сургуулиудад маш хямд үнээр түгж байж. Ингэж байтал наяаад оноос эхлээд худалдаалах эрхийг AT&T хамгийн анхлаад ар араас нь Sun, HP эдэр гэсэн акулууд худалдаалж эхэлснээс хойш Unix-ийн хувилбар хоорондоо ялгаатай болоод салбарлаж эхлэсэн байгаа юм. Гэхдээ хооронд нэгтгэсэн стандарт огт байхгүй байлаа. Дараа нь нэгтгэх зорилготой стандартартууд гарч. Яг үнэндээ одоо ч POSIX стандарт бүрэн зангидаж чадаагүй сунжирсаар л байгаагийн зэрэгцээгээр POSIX-рүү нийцүүлж байгаа хугацааны дарааллаар нэгэн ижил бишээр бага багаар цэгцэрч байгаа.
Энгийн жишээнүүд аваад үзэхэд strndup, strnlen, strsignal гэх мэт хамгийн энгийн функцүүд ч одоо HP-UX дээр нь байхгүй, Linux дээр байгаа гэх мэт. BSD дээр memcpy байхгүй ч байх шиг. PATH_MAX гэх мэт define зарим дээр нь байхгүй эсвэл header файл нь ондоо гэх мэт зовлонтой байдал одоо ч байсаар л байгаа.
Яг энэ асуудлаас болоод л C/C++ дээр програм бичихэд нэг кодоор аль дээр нь ч ажилладаг, суулгадаг програм хялбар бичигддэггүй. Хөгжүүлэгч тухайн үед аль нэг орчинд хийдэг харин түүнийгээ бүх орчинд тест хийж чаддаггүй. Чадах байлаа ч тухайлбал FreeBSD-ийн бүх хувилбар дээр шалгаж амждаггүй. Гэтэл FreeBSD нь зарим толгой файл, функцүүд нь POSIX стандартруу хэдийд аль хувилбараасаа нийцэж эхлэсэн гэх мэт нь хянах нь төвөгтэй. Цаашлаад C/C++ хэлний хөрвүүлэгчид ч олон, тэдгээрийн хэрэглэх арга нь ялгардагаас хамаараад хөрвүүлэх үйл ажиллагаа ч ялгаатай болдог. (Ямар хөрвүүлэгчөөр ямар орчинд хөрвүүлэхээс хамаараад биелэлт хурдны асуудал ч үнэндээ яригдах нь мэдээж ч энэ тусдаа дангаараа том сэдэв болох нь мэдээж хэрэг. Жишээ нь GNU хөрвүүлэгчийн хувьд cross буюу олон орчинд ажиллах хөрвүүлэлт болон C-с бусад хэлийг хөрвүүлдэг гээд л яриа үргэлжлэх байх)
Энэ бүх бэрхшээлийг шийдэх зорилгоор GNU autotools гэж нэрлэгдэх autoconf, automake, libtool, configure гэх мэт багажууд хийгдсэн байна. Энэ багажуудын зарим гол санаанаас хэлбэл:
1. Configure гэх bourne shell скрипт нь ямар орчин дээр ажиллах гэж байгаагаас хамаарч Makefile-уудыг тухайн орчинд нь тааруулж үүсгэдэг. Гэхдээ Makefile.in гэх файлуудыг оролтондоо авч үүсгэдэг.
2. Дээрх Makefile.in -ийг аваад үзвэл мөн л нилээн том файлууд болдог тул хөгжүүлэгчид гараараа үүсгэх нь бас л цагийг авсан хар ажил болдог. Иймээс энэ файлыг үүсгэдэг automake гэсэн багаж хийгдэж. Makefile.am гэсэн бичиглэлийг маш хөнгөвчилсөн хялбар файлыг бичээд тэндээсээ automake багажаар Makefile.in үүсгэдэг.
3. Configure скрипт нь гэтэл бас л нэг ерөнхий байдлаар бичих боломжгүй буюу хөгжүүлэгчид өөрийн хэрэгцээнд нийцүүлэн configure скриптийг өөрчлөх хэрэгтэй болдог. Гэтэл энэ скрипт нь олон жилийн турш хөгжиж ирсэн маш төвөгтэй томоохон скрипт юм. Иймээс хялбар үүсгэх аргыг бас л бодож олж. configure.ac гэх бичихэд хялбар файл бичээд эндээс autoconf багажаар configure.in болон configure скриптыг үүсгэдэг.
4. Дээрх 1,2,3-т дурдсанаас гадна нэгэнт бичигдсэн програм дотор орчноос хамаарсан зүйлс байгаа эсэхийг хайдаг багаж, тэндээсээ үндэслээд configure.ac файл ямархуу байхыг таамаглах багаж, энд дурдсан багажуудыг бүгдийг нь зөв дарааллаар нэг мөр ажиллуулдаг багаж гээд өөр зөндөө олон багажууд хийгдсэн байдаг тул хэрэглэхэд ихэд хялбар болсон байдаг.
5. Хөгжүүлэлтийн компьютер дээрээ gnu autotools-ийг суулгасан байхдаа дээрх configure скрипт болон Makefile.in файлуудыг үүсгэчихвэл дараа нь аль ч OS дээр нэг л аргаар хөрвүүлж суулгах боломжтой болдог.
Ингээд бэлэн болсон соорсыг эцсийн хэрэглэгч
configure
make
make install
гээд л хөрвүүлээд суулгах асуудал. Гэвч энэ нь бүх орчин дээр санасан зоргоор явагдахгүй тул configure скриптыг ажиллуулахдаа дамжуулах олон параметрээр зохицуулах ажилууд шаардлагатай болох нь бий. Жишээ нь: /usr/include дотор толгой файлууд нь байхгүй бол хаана байгаа газарыг нь INCLUDES хувьсагчид заахаас эхлэнэ. Цаашлаад link хийхтэй холбоотой зүйлс, хэрэглэгдсэн функц байгаа байхгүйгээс хамаараад орлуулалт хийх, суулгах байрлал, суулгах директорын бүтэц гээд л зөндөө зүйлсийг зааж болдог. Бүр цаашлаад эцсийн суулгах тархацуудыг ч үүсгэж болно.
Ингээд соорсыг хөрвүүлж суулгах нь зарим орчин дээр бас л хялбар биш ажил болж хувирдаг. Хичнээн gnu autotools ашиглан gnu бүтэцтэй төсөл бичсэн байлаа ч зарим Unix дээр хөрвүүлэлт нь бас л төвөгтэй. Жишээлбэл HP-UX дээр харгалзах олон gnu төслүүд ирдэггүй. Хэдийгээр gnu төслүүдийг бүгдийг нь HP-UX дээр port хийж оруулсан depot файлууд байдаг ч гэлээ бүх багцийн хамаарлыг нь тооцож оруулах хар ажил нь хэрэглэгчийн ажил болж хувирдаг учир дутагдалтай.
Ингээд ямар орчинд суулгах хамаарлыг зохион байгуулах package management хэлбэррүү шилжиж хялбарчилсан байдаг. Дээрх gnu autotools ч гэсэн багцийн хамаарлыг шалгах боломжоор хангагдсан байдаг. Мөн gnu бүтцээр бичигдсэн төслөөс debian болон rpm багц үүсгэх нь тийм ч хэцүү биш байдаг тул package management-ийн талаар цаашид тусдаа дурдсан нь дээр байх.
Гэх мэтээр мэдээж хэрэг autotools-ийн тухай ярих нь хамрах хүрээ нилээн өргөн тул энд блогийн ганц бичлэгээр дурдахад хэцүү юм байна. Харин асуух зүйлс байвал ерөнхий болон нарийвчилсан асуулт аль ч байсан асуувал чөлөөтэй хариулах болно.