مقدمه مقدماتی

اتوماسیون ساخت یک جزء حیاتی از توسعه نرم افزار مدرن است و اهمیت آن زمانی که پروژه ها باید بر روی ویندوز، لینوکس و macOS اجرا شود، یک سیستم اتوماسیون ساخت متقابل پلتفرم در C، کنترل دقیق بر جمع آوری، تست و استقرار بدون نیاز به یک زبان اسکریپت نویسی خارجی را فراهم می کند.با نوشتن هسته اتوماسیون در C، توسعه دهندگان حداکثر پورتability، اجرای ابزار به طور کامل و یکپارچه سازی قطعات پردازش کلید، و اجرای سیستم عامل، به بررسی این سیستم فرمان هدایت می کند.

چرا اتوماسیون را در C برای پروژه های Cross-Platform بسازید؟

بسیاری از توسعه دهندگان به پایتون، Perl یا اسکریپت های پوسته هنگامی که خودکار سازی می کند می رسند.با این حال، C مزایای منحصر به فرد برای اتوماسیون متقابل پلتفرم ارائه می دهد:

  • یک برنامه به خوبی نوشته شده C را می توان بر روی هر پلت فرم با کامپایلر استاندارد C (GCC، Clang، MSVC)، اجتناب از وابستگی های مترجم جمع آوری شده است.
  • ارزیابی: قابلیت های سطح پایین C اجازه می دهد فایل کارآمد I / O، فرایند برای کشیدن و مدیریت حافظه، ضروری برای انجام گراف های بزرگ ساخت.
  • [[۱] [۱۰] [۱] [۱] [۱] [۱] [۱]] [۱] [۳] [۳] [۱] [۱] [۱]] دسترسی مستقیم به سیستم API [به عنوان مثال] [۱۰] [۱۰] [۱۰] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳]] [۱] [۱] [۲] [۳] [۳] [۱] [۱] [۲] [۳] [۲] [۲] [۳] [۲] [۳]] [۳]] [۱] [۱]]] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۲] [۳] [۳] [۲] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۲] [۲] [۳] [
  • ردپایی کوچک و متوسط: نیازی به پایتون یا جاوا زمان اجرا نیست؛ باینری اتوماسیون کوچک و آسان است.

در حالی که ابزارهایی مانند CMake و GNU وجود دارند، یک سیستم اتوماسیون مبتنی بر C سفارشی زمانی ارزشمند است که منطق ساخت منحصر به فرد، وضوح وابستگی پیچیده یا ادغام دقیق با پایه های کد C میراث مورد نیاز است.

اجزای اصلی سیستم اتوماسیون Cross-Platform Build Automation System

هر سیستم اتوماسیون ساخت نیاز به مجموعه ای از قابلیت های اساسی دارد.در C، این اجزا باید با قابلیت پورتینگ در ذهن اجرا شوند.

دانلود فیلم Configurationing

سیستم باید یک فایل پیکربندی را بخواند که اهداف، منابع، وابستگی ها و پرچم های کامپایلر را تعریف می کند. فرمت های قابل حمل شامل JSON، INI یا یک طرح ارزش کلیدی ساده است.از فرمت های خاص پلت فرم مانند Windows Registry یا XML اجتناب کنید (اگر چه کتابخانه های C مانند libxml2 وجود دارند، آنها وابستگی اضافه می کنند).

یک ترور حداقل INI-like را می توان در استاندارد C بدون کتابخانه های خارجی نوشت:

[[ویرایش] [[[ویرایش]
[FLT3] [FLT: ] [ [[[ ] [ ] [ [ ] [ ] [ ] [ [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ [ ] [ ] [ ] [ ] [ [ ] [ ] [ ] [ [ [ ] [ [ ] [ ] [ ] [ [ ] ] [ [ ] [ ] [ [ [ ] ] [ ] ] ] [ ] [ ] [ ] [ [ [ ] ] ] ] ] [ [ [ [ ] ] ] ] [ [ [ [ [ ] ] ] ] ] ] ] ] ] ] ] ] ] [ [ [ [ [ [ [ ] [ [ [ [ ] [ ] [ [ [ [ ] ] ] ] [ [ [ ] ] ] ] ] ] ] ] ] ] ] ] ] [ [ [ [ [ [ [ [ [ [ ] ] ] ] ] ] ] ] ] ] ] ] ] [ [ [ [ [ [ [ [ [ [ [ [ [ ] ] ] [ [ [ [ [ [ [ [ [ [ [ ] ] ] ] ] ] ] ] ] ] ] ] ] ]

برای تجزیه و تحلیل دقیق تر، از یک کتابخانه سبک JSON مانند cJSON استفاده کنید، یک فایل تک C بدون وابستگی خارجی.پل JSON Parsing تضمین رفتار سازگار در همه اهداف.

فرمان اعدام

اجرای کامپایلرها، پیوندها و تست ها نیازمند ایجاد فرآیندهای کودک است.C استاندارد عملکرد در همه جا کار می کند، اما محدودیت دارد: هیچ کنترلی بر جریان های I/O، هیچ تصرف خروجی و رفتار مسدود کننده برای اتوماسیون قوی، بسته سازی فرایند ایجاد در یک لایه قابل حمل.

  • سیستم های POSIX (لینوکس، macOS) : استفاده از [FLT-7] + با برای ثبت نام وان.
  • [[ویرایش] [۱۰] [۱۰] [۱۰] [۱۰] [[۱۰]]] [[۱۰]]] [[۱۰]]] [[۱۰]]] [[۱۰]]] [[۱۰]]] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [و [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [۳] [۳] [۳] [بر [۳] [۳] [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [
  • بسته بندی قابل حمل: استفاده از [FLT13] (در POSIX و بر روی ویندوز از طریق در MSVC] برای موارد ساده تر استفاده کنید که تنها در آن جذب خروجی مورد نیاز است.

مثال قابل حمل تابع اجرای فرمان:

[[ویرایش] [[[ویرایش]
[FLT16]
[FLT: [FLT3] [FLT3] [FLT3] [FLT3] [FLT3] [FLT3 ] [FLT3 ] [

همیشه به دنبال خطا و مدیریت جزئیات خاص پلت فرم مانند نقل قول (استفاده از برای مسیرهای یونیکد در ویندوز باشید.

دانلود بازی کامپیوتر

سیستم اتوماسیون شما باید بداند که در حال اجرا است تشخیص می تواند در زمان کامپایل (از طریق ماکروهای پیش پردازنده) یا در زمان اجرا اتفاق بیفتد.

[در این باره] [در زمان قیامت] [[[ویرایش]

(FLT 21)

[در این باره] [[[ویرایش]

  • در سیستم های مشابه یونیکس، با نام (FLT 22) تماس بگیرید و [FLT23] را بررسی کنید.
  • در ویندوز، از (یا [FLT25] جدیدتر برای ویندوز 8.1 استفاده کنید.

ترکیب هر دو به شما اجازه می دهد تا دستورات را به صورت پویا تنظیم کنید - به عنوان مثال، با استفاده از [FLT 26] در ویندوز، [FLT 27] در لینوکس و در macOS.

ورود و مدیریت خطا

یک سیستم ساخت تولید باید پیشرفت، هشدارها و خطا را وارد کند.یک ماژول ساده ورود با شدت (INFO، WARN، ERROR) را توسعه دهد (FLT 29 برای خطا و (FLT:30) برای اطلاعات مداوم، نوشتن به یک فایل با زمان بندی.

خطای برخورد باید بین خطاهای قابل بازیابی (به عنوان مثال، دستور خروج غیر صفر) و خطاهای کشنده (به عنوان مثال، از حافظه) تمایز قائل شود.استفاده از [FLT 31] / [ برای بازیابی خطا در تجزیه و تحلیل پیچیده، اما ترجیح می دهد کدهای بازگشت صریح برای سادگی.

مثال: خطای خطای خطایی:

[در این باره]

طراحی معماری قراردادی

برای حفظ سیستم اتوماسیون در سراسر سیستم عامل ها، یک طراحی مدولار با جدایی واضح از نگرانی ها را اتخاذ کنید:

  • ماژولConfig: خواندن و اعتبار فایل های پیکربندی، در معرض یک فروشگاه ارزش کلیدی قرار می گیرد.
  • [[۱] [۱۰] [[۱۰]] [[۱۰]] [[۱۰]]] [[۱۰]]] [۱]] [۱]] [۱]] [۱]] [۱] [۱۰]] [۱]] [۱] [۱۰] [۱]] [۱] [۱]] [۱]] [۱] [۱] [۱]] [۱] [۱] [۱] [۱] [۲]] [۲] [۲] [۱] [۲] [۱]] [۲] [۲]]]] [۲]] [۲]] [۲] [۲]]]]]] [۱]]]]] [۱] [۱] [۱] [۱] [۱] [۲] [۱] [۱] [۱] [۱] [۱] [۲]] [۲] [۲] [۲] [۱] [۱] [۱] [۱] [۱]] [۱] [۱] [۱] [۱] [۲] [۲] [۲] [۱]]] [۲] [۱] [۲] [۲] [۱
  • ماژول فرم: توابع سیستم عامل خاص (مشروط جداکننده هایpath، متغیرهای محیط، تشخیص) را فراهم می کند.
  • [[ویرایش] [۱] [۱۰] [۱] [۱۰] [۱]] [۱]] [۱] [۱] [۱]]) ثبت نام با خروجی قابل تنظیم
  • ماژول گراف ساخت: اهداف و وابستگی ها را نمایندگی می کند، قادر به مرتب سازی بالا برای اجرای موازی است.

هر ماژول باید یک API ساده C را با ساختار های مبهم نشان دهد.برای مثال، ماژول پلت فرم ممکن است ارائه دهد:

[FLT 34 ]

این انتزاع به شما اجازه می دهد تا سیستم را بر روی یک پلت فرم جدید با پیاده سازی فقط قلاب های پلتفرم کامپایل کنید.

مثال های پیاده سازی Snippets

شناسایی سیستم عامل (Runtime)

تابع C زیر بر روی هر سه سیستم عامل اصلی با استفاده از دستورالعمل های پیش پردازنده و عملکرد در دسترس است:

[FLT36]

راه اندازی یک فرمان و Caping Output

یک تابع قابل حمل مبتنی بر پاپن برای اجرای یک دستور و گرفتن آن:

[در این باره]

دانلود بازی زیبای INI Configuration

فرض کنید فایل پیکربندی مانند:

[در این باره] [[[[ویرایش] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۳] [۱۰] [۳] [۱۰] [۳] [۳] [۱] [۱۰] [۳] [۳] [۱۰] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[

پارس با استفاده از توابع استاندارد C:

[FLT41]

تست در سراسر پلتفرم

تست خودکار سیستم اتوماسیون ساخت خود بسیار مهم است. تنظیم یک خط لوله ادغام مداوم (CI) که کامپایل و اجرا سیستم در همه سیستم عامل های هدف. خدمات CI محبوب مانند ] [FLT: 1، GitLab CI، یا Jenkins اجازه می دهد ماتریس برای ویندوز، لینوکس و macOS ایجاد کند.

برای هر پلتفرم، شغل CI باید:

  1. ابزار اتوماسیون را با استفاده از کامپایلر بومی تکمیل کنید.
  2. تست های واحد (استفاده از یک چارچوب تست سبک C مانند cmocka یا Unity).
  3. تست های ادغام را اجرا کنید: یک پروژه آزمایشی کوچک ایجاد کنید، ابزار اتوماسیون را اجرا کنید و خروجی ساخت را تأیید کنید.
  4. موارد لبه تست: فایل های پیکربندی، دستورات نامعتبر، گراف های وابستگی بزرگ.

از containerها (Docker) برای محیط های لینوکس و ماشین های مجازی برای ویندوز /macOS برای اطمینان از حالت تمیز استفاده کنید، علاوه بر این، تست متقابل-compilation را در نظر بگیرید: ابزار اتوماسیون برای معماری مختلف را جمع آوری کنید و تحت یک محرک (QEMU) برای تأیید مسائل مربوط به پایان و اندازه نقطه اجرا کنید.

قرص های معمول و پلت فرم-Specific Workways

دانلود بازی The Path Diss

ویندوز از backslash ( استفاده می کند، در حالی که یونیکس از پیش استفاده می کند ( در C، از استفاده می کند یا در زمان اجرا تشخیص می دهد، همیشه از جداکننده مناسب استفاده می کند، برای پورت پذیری، استفاده از پیش در فایل های پیکربندی - حتی توابع API ویندوز مانند کاهش پیش رو می پذیرد.

متغیرهای محیطی

از [[FLT 46| استفاده می کند؛ ویندوز از استفاده می کند.

[در این میان]

پایان نامه ها

ویندوز از CRLF استفاده می کند؛ یونیکس هنگام خواندن فایل های پیکربندی، مسیر حرکت را باز می کند. [FLT51] و را در صورت وجود حذف می کند.

خط فرمان (Sal Line)

فضاها در مسیرها یا استدلالها نیاز به نقل قول دارند.در POSIX، از نقل قول های تک استفاده کنید؛ در ویندوز، نقل قول های دوگانه، یک تابع اختصاصی برای ساخت رشته های فرمان که به نقل قول در هر پلت فرم می پردازند.

مدیریت سیگنال

هنگامی که فرآیند کودک در حال اجرا است، سیستم های یونیکس ممکن است SIGCHLD را ارائه دهند یا این سیگنال ها را تشخیص دهند، از فرآیندهای زامبی جلوگیری می کنند.

ادغام با سیستم های ساخت موجود

ابزار اتوماسیون C شما مجبور به جایگزینی یا CMake نیست؛ می تواند آنها را افزایش دهد.به عنوان مثال، ابزار شما می تواند فایل های Makefiles یا CMakeList.txt را بر اساس یک پیکربندی سطح بالاتر، آن را می تواند به عنوان یک پرتاب کننده که چندین (FLT:54) را هدایت می کند یا (FLT:55 دستورات در سراسر زیردستان مختلف.

مثال: ابزار شما یک ماژول (FLT 56) را می خواند، سپس برای هر ماژول (FLT57) و [FLT 58]، این رویکرد ترکیبی به شما انعطاف پذیری یک سیستم ساخت سفارشی را در حالی که استفاده از ابزارهای بالغ برای جمع آوری سطح پایین.

عملکرد و موازی

برای سرعت بخشیدن به ساخت، پیاده سازی موازی اهداف مستقل.استفاده از موضوعات (معامل های POSIX در یونیکس، بر روی ویندوز) یا غیر بلوکه سازی فرایند تولید، یک رویکرد ساده: حفظ یک استخر از فرآیندهای کودک با حداکثر محدودیت های ارز. ماژول ساخت یک نوع بالا و ارسال اهداف آماده برای یک استخر.

مراقب منابع مشترک باشید (برای مثال فایل های log) از خاموش کردن یا عملیات اتمی برای مرتب سازی می نویسد.

ملاحظات امنیتی

اتوماسیون سازی اغلب با امتیازات بالا اجرا می شود.حفاظت از حملات تزریق:

  • هرگز از [FLT: 60] با استفاده از رشته های کاربر بدون اطمینان استفاده نکنید.
  • اگر شما باید یک رشته فرمان را بسازید، از با نقل قول مناسب استفاده کنید.
  • تمام ورودی های فایل پیکربندی را تأیید کنید – شخصیت های غیرمنتظره یا مسیر عبور را رد کنید.
  • هنگام بارگیری وابستگی (اگر سیستم شما از آن پشتیبانی کند)، از TLS (libcurl) استفاده کنید و چکه ها را تأیید کنید.

مسیر های آینده

سیستم اتوماسیون سازی C می تواند با:

  • پشتیبانی از پاداش: اجازه می دهد تا یک پیشوند سه و ابزار هدف را مشخص کنید.
  • [[۱] [۱۰] بهینه سازی: [[۱۰] [۱۰] [۱]] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱]] [۱۰] [۱] [۱۰] [۱]] [۱۰] [۱۰] [۱]] [۱] [۱۰] [۲]] [۳] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۲] [۲] [۳] [۳] [۳] [۱]] [۲] [۲]]]] [۲]] [۲] [۲]] [۳]]]]] [۱]]]]]] [۳] [۳] [۳] [۲] [۲] [۲] [۲] [۳] [۳] [۳] [۲] [۲]]] [۲] [۲] [۲] [۲] [۳]] [۳] [۳] [۳] [۳] [۳] [۲] [۳] [۲] [۲] [۲] [۲]]] [۲] [۲]]]] [۲]]
  • Remote می سازد: توزیع در سراسر دستگاه های متعدد با استفاده از سوکت یا SSH.
  • سیستم Plugin: کتابخانه های پویا (.so/.dll) برای پشتیبانی از مراحل سفارشی ساخت بدون بازخرید هسته.

نتیجه گیری

ساخت یک سیستم اتوماسیون متقابل پلتفرم در C یک تلاش چالش برانگیز اما ارزشمند است.با دقت طراحی انتزاع قابل حمل برای اجرای فرآیند، تشخیص پلت فرم، پیکربندی و دستکاری خطا، شما می توانید یک ابزار را ایجاد کنید که به طور قابل اعتماد در ویندوز، لینوکس و macOS کار می کند، نتیجه یک چارچوب اتوماسیون سریع، خود-اعتباری است که یکپارچه با پروژه های موجود / C سازگار است و پیاده سازی سیستم کنترل غیر سفارشی مانند راه حل های کنترل سیستم، ارائه می دهد.