13.1. ساخت
این بخش یادداشتهایی را دربارهی نحوه شروع توسعه و مشارکت در Nix ارائه میدهد. برای دریافت جدیدترین نسخه Nix از گیتهاب:
نکته
هنگام دریافت (Check out) مخزن روی ویندوز، پیش از کلون کردن، مطمئن شوید که تنظیم گیت
core.symlinksفعال است؛ زیرا در مخزن پیوندهای نمادین وجود دارد.
$ git clone https://github.com/NixOS/nix.git
$ cd nix نکته
دستورالعملهای زیر فرض میکنند که شما از قبل نسخهای از Nix را به صورت محلی نصب کردهاید تا بتوانید از آن برای راهاندازی محیط توسعه استفاده کنید. اگر آن را نصب نکردهاید، دستورالعملهای نصب را دنبال کنید.
برای ساخت تمام وابستگیها و شروع یک شل (shell) که در آن تمام متغیرهای محیطی به گونهای تنظیم شدهاند که بتوان آن وابستگیها را پیدا کرد:
$ nix-shell برای دریافت یک شل با یکی دیگر از محیطهای کامپایل پشتیبانیشده:
$ nix-shell --attr devShells.x86_64-linux.native-clangStdenv نکته
میتوانید برای بهبود چشمگیر زمان ساخت مجدد (rebuild) از
native-ccacheStdenvاستفاده کنید. بهطور پیشفرض، ccache فرآوردههای ساخت را در~/.cache/ccache/نگه میدارد.
برای ساخت خود Nix در این شل:
[nix-shell]$ out="$(pwd)/outputs/out" dev=$out debug=$out mesonFlags+=" --prefix=${out}"
[nix-shell]$ dontAddPrefix=1 configurePhase
[nix-shell]$ buildPhase برای تست آن:
[nix-shell]$ checkPhase برای نصب آن در $(pwd)/outputs:
[nix-shell]$ installPhase
[nix-shell]$ ./outputs/out/bin/nix --version
nix (Nix) 2.12 برای ساخت یک نسخه انتشار (release) از Nix برای سیستمعامل فعلی و معماری پردازنده:
$ nix-build همچنین میتوانید Nix را برای یکی از پلتفرمهای پشتیبانیشده بسازید.
ساخت Nix با فلیکها
این بخش فرض میکند که شما از Nix با ویژگیهای آزمایشی فعال flakes و nix-command استفاده میکنید.
برای ساخت تمام وابستگیها و راهاندازی یک شل که در آن تمام متغیرهای محیطی به گونهای پیکربندی شدهاند که بتوان آن وابستگیها را پیدا کرد:
$ nix develop این شل همچنین ./outputs/bin/nix را به $PATH شما اضافه میکند تا بتوانید بلافاصله پس از ساختن nix، آن را اجرا کنید.
برای دریافت یک شل با یکی دیگر از محیطهای کامپایل پشتیبانیشده:
$ nix develop .#native-clangStdenv نکته
برای بهبود چشمگیر زمان ساخت مجدد، از
ccacheStdenvاستفاده کنید. به طور پیشفرض، ccache فرآوردههای ساخت را در~/.cache/ccache/نگه میدارد.
برای ساختن خود Nix در این شل:
[nix-shell]$ configurePhase
[nix-shell]$ buildPhase برای تست آن:
[nix-shell]$ checkPhase برای نصب آن در $(pwd)/outputs:
[nix-shell]$ installPhase
[nix-shell]$ nix --version
nix (Nix) 2.12 برای کسب اطلاعات بیشتر دربارهی اجرا و فیلتر کردن تستها، به testing.md مراجعه کنید.
برای ساخت نسخه انتشار (Release) از Nix برای سیستمعامل فعلی و معماری پردازنده:
$ nix build همچنین میتوانید Nix را برای یکی از پلتفرمهای پشتیبانیشده بسازید.
پلتفرمها
Nix را میتوان برای پلتفرمهای مختلفی ساخت، همانطور که در flake.nix مشخص شده است:
x86_64-linuxx86_64-darwini686-linuxaarch64-linuxaarch64-darwinarmv6l-linuxarmv7l-linuxriscv64-linux
برای ساخت Nix روی پلتفرمی متفاوت از پلتفرمی که در حال حاضر روی آن هستید، به روشی نیاز دارید تا نصب فعلی Nix شما بتواند کد را برای آن پلتفرم بسازد. راهحلهای متداول شامل [ماشینهای ساخت راه دور] و [شبیهسازی فرمت باینری] (فقط در NixOS پشتیبانی میشود) هستند.
با داشتن چنین راهاندازیای، اجرای ساخت فقط مستلزم انتخاب صفت مربوطه است.
برای مثال، جهت کامپایل برای aarch64-linux:
$ nix-build --attr packages.aarch64-linux.default یا برای Nix با قابلیتهای آزمایشی flakes و nix-command فعالشده:
$ nix build .#packages.aarch64-linux.default ساختهای کامپایلمتقاطع برای موارد زیر در دسترس هستند:
armv6l-linuxarmv7l-linuxriscv64-linuxبرای راهاندازی (bootstrap) نیکس روی پلتفرمهای پشتیبانینشده، انواع سیستم بیشتری را بهcrossSystemsدرflake.nixاضافه کنید.
ساخت برای چند پلتفرم به صورت همزمان
انجام چندین ساخت بومی و کامپایلمتقاطع روی یک درخت کد منبع واحد بسیار مفید است، برای مثال جهت اطمینان از اینکه بهبود پشتیبانی از یک پلتفرم، ساخت را برای پلتفرمی دیگر خراب نکند. خوشبختانه Meson با محدود کردن تمام فرآوردههای ساخت به پوشه ساخت، این کار را بسیار ساده میکند — به سادگی میتوانید پوشه کد منبع را بین چندین پوشه ساخت به اشتراک بگذارید که هر کدام شامل ساخت نیکس برای یک پلتفرم متفاوت هستند.
در ادامه روش انجام این کار آمده است:
- به زیرساخت Nixpkgs اعلام کنید که میخواهیم Meson پوشه ساخت خود را کجا قرار دهد
mesonBuildDir=build-my-variant-name - طبق معمول پیکربندی کنید
configurePhase - به روال معمول بسازید (Build)
buildPhase نوع سیستم
نکیس از رشتهای با فرمت زیر برای شناسایی نوع سیستم یا پلتفرم اجرایی خود استفاده میکند:
<cpu>-<os>[-<abi>] هنگامی که Nix برای سیستم مشخصی کامپایل میشود، این مقدار تنظیم میگردد و بر اساس خروجی اطلاعات host_machineی Meson است.
به دلایل تاریخی و سازگاری با نسخههای پیشین، برخی از شناسههای پردازنده و سیستمعامل به شرح زیر ترجمه میشوند:
host_machine.cpu_family() | host_machine.endian() | نیکس |
|---|---|---|
x86 | i686 | |
arm | host_machine.cpu() | |
ppc | little | powerpcle |
ppc64 | little | powerpc64le |
ppc | big | powerpc |
ppc64 | big | powerpc64 |
mips | little | mipsel |
mips64 | little | mips64el |
mips | big | mips |
mips64 | big | mips64 |
هنگام کامپایل متقاطع کردن Nix با Meson برای توسعه محلی، لازم است با استفاده از گزینه --cross-file یک فایل متقاطع (cross-file) مشخص کنید. فایلهای متقاطع، معماری هدف و ابزارهای ساخت (toolchain) را تعریف میکنند. هنگام کامپایل متقاطع کردن Nix با نیکس، مجموعهی بستههای نیکس (Nixpkgs) این کار را برای شما انجام میدهد.
در فلیک nix نیز برخی از اهداف کامپایل متقاطع در دسترس ما هستند:
nix build .#nix-everything-riscv64-unknown-linux-gnu
nix build .#nix-everything-armv7l-unknown-linux-gnueabihf
nix build .#nix-everything-armv7l-unknown-linux-gnueabihf
nix build .#nix-everything-x86_64-unknown-freebsd
nix build .#nix-everything-x86_64-w64-mingw32 محیطهای کامپایل
نیکس را میتوان با استفاده از چندین محیط کامپایل کرد:
stdenv: پیشفرض؛gccStdenv: اجبار به استفاده از کامپایلرgcc؛clangStdenv: اجبار به استفاده از کامپایلرclang؛ccacheStdenv: فعالسازی [ccache]، یک کش کامپایلر برای سرعت بخشیدن به فرآیند ساخت.
برای ساخت با یکی از این محیطها، میتوانید از استفاده کنید
$ nix build .#nix-cli-ccacheStdenv برای فلیکمحور Nix، یا
$ nix-build --attr nix-cli-ccacheStdenv برای Nix کلاسیک.
شما میتوانید به جای nix-cli-ccacheStdenv از هر یک از محیطهای پشتیبانیشدهی دیگر استفاده کنید.
یکپارچهسازی با ویرایشگر
سرور LSP به نام clangd به طور پیشفرض روی devShellهای مبتنی بر clang نصب میشود. محیطهای کامپایل پشتیبانیشده و دستورالعملهای نحوه راهاندازی شل با فلیکها یا در Nix کلاسیک را مشاهده کنید.
برای استفاده از LSP با ویرایشگر خود، به یک فایل compile_commands.json نیاز دارید که به clangd بگوید چگونه کد را کامپایل میکنیم.
پیکربندی Meson همواره این فایل را در داخل پوشه ساخت تولید میکند.
ویرایشگر خود را به گونهای پیکربندی کنید که از clangd موجود در شل .#native-clangStdenv استفاده کند.
میتوانید این کار را یا با اجرای آن در داخل محیط توسعه، یا با استفاده از nix-direnv و افزونهی مناسب ویرایشگر انجام دهید.
نکته
برای برخی از ویرایشگرها (مانند Visual Studio Code)، ممکن است نیاز باشد یک افزونهی خاص نصب کنید تا ویرایشگر بتواند با
clangdتعامل داشته باشد. برخی دیگر از ویرایشگرها (مانند Emacs، Vim) به یک پلاگین نیاز دارند تا به طور کلی از سرورهای LSP پشتیبانی کنند (مانند lsp-mode برای Emacs و vim-lsp برای vim). راهاندازی مختص هر ویرایشگر معمولاً سلیقهای است، بنابراین در اینجا جزئیات بیشتری دربارهی آن ارائه نمیدهیم.
قالببندی و قلابهای پس از ساخت
ممکن است بخواهید ابزارهای قالببندی را به صورت تکاجرا با دستور زیر اجرا کنید:
./maintainers/format.sh قلابهای پیش از کامیت (Pre-commit hooks)
اگر میخواهید قالببندها را پیش از هر کامیت اجرا کنید، قلابها را نصب کنید:
pre-commit-hooks-install این کار pre-commit را با استفاده از cachix/git-hooks.nix نصب میکند.
هنگام انجام یک کامیت، به خروجی کنسول توجه کنید.
اگر با خطا مواجه شد، دستور git add --patch را اجرا کنید تا پیشنهادها تایید شوند و مجدداً کامیت کنید.
برای بهروزرسانی فایل پیکربندی قلاب pre-commit، اقدامات زیر را انجام دهید:
- از شل توسعه خارج شده و با اجرای دستور
nix developدوباره آن را راهاندازی کنید. - اگر از قلاب pre-commit نیز استفاده میکنید، دستور
pre-commit-hooks-installرا نیز دوباره اجرا کنید.
VSCode
کد JSON زیر را در فایل .vscode/settings.json خود قرار دهید تا nixfmt پیکربندی شود.
این تنظیمات توسط دستور Format Document، گزینه "editor.formatOnSave" و غیره شناسایی خواهند شد.
{
"nix.formatterPath": "nixfmt",
"nix.serverSettings": {
"nixd": {
"formatting": {
"command": [
"nixfmt"
],
},
},
"nil": {
"formatting": {
"command": [
"nixfmt"
],
},
},
},
}