forked from lix-project/lix
Compare commits
5 commits
main
...
sb/rbt/rep
Author | SHA1 | Date | |
---|---|---|---|
Rebecca Turner | e2a1f79490 | ||
Rebecca Turner | abbd855e93 | ||
Rebecca Turner | 83729b2075 | ||
Rebecca Turner | f3f7d81988 | ||
Rebecca Turner | c41ec4e64c |
|
@ -48,3 +48,4 @@ PointerAlignment: Middle
|
||||||
SortIncludes: Never
|
SortIncludes: Never
|
||||||
SpaceAfterCStyleCast: true
|
SpaceAfterCStyleCast: true
|
||||||
SpaceAfterTemplateKeyword: false
|
SpaceAfterTemplateKeyword: false
|
||||||
|
|
||||||
|
|
18
.clang-tidy
18
.clang-tidy
|
@ -1,18 +0,0 @@
|
||||||
UseColor: true
|
|
||||||
Checks:
|
|
||||||
- -*
|
|
||||||
- bugprone-*
|
|
||||||
# too many warnings
|
|
||||||
- -bugprone-assignment-in-if-condition
|
|
||||||
# too many warnings
|
|
||||||
- -bugprone-narrowing-conversions
|
|
||||||
# kind of nonsense
|
|
||||||
- -bugprone-easily-swappable-parameters
|
|
||||||
# too many warnings for now
|
|
||||||
- -bugprone-implicit-widening-of-multiplication-result
|
|
||||||
# Lix's exception handling is Questionable
|
|
||||||
- -bugprone-empty-catch
|
|
||||||
# many warnings
|
|
||||||
- -bugprone-unchecked-optional-access
|
|
||||||
# many warnings, seems like a questionable lint
|
|
||||||
- -bugprone-branch-clone
|
|
32
.github/workflows/backport.yml
vendored
Normal file
32
.github/workflows/backport.yml
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
name: Backport
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [closed, labeled]
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
jobs:
|
||||||
|
backport:
|
||||||
|
name: Backport Pull Request
|
||||||
|
permissions:
|
||||||
|
# for zeebe-io/backport-action
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
if: github.repository_owner == 'NixOS' && github.event.pull_request.merged == true && (github.event_name != 'labeled' || startsWith('backport', github.event.label.name))
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
|
# required to find all branches
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Create backport PRs
|
||||||
|
# should be kept in sync with `version`
|
||||||
|
uses: zeebe-io/backport-action@v1.4.0
|
||||||
|
with:
|
||||||
|
# Config README: https://github.com/zeebe-io/backport-action#backport-action
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
github_workspace: ${{ github.workspace }}
|
||||||
|
pull_description: |-
|
||||||
|
Automatic backport to `${target_branch}`, triggered by a label in #${pull_number}.
|
||||||
|
# should be kept in sync with `uses`
|
||||||
|
version: v0.0.5
|
135
.github/workflows/ci.yml
vendored
Normal file
135
.github/workflows/ci.yml
vendored
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
name: "CI"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
|
||||||
|
permissions: read-all
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
tests:
|
||||||
|
needs: [check_secrets]
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, macos-latest]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
timeout-minutes: 60
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: cachix/install-nix-action@v23
|
||||||
|
with:
|
||||||
|
# The sandbox would otherwise be disabled by default on Darwin
|
||||||
|
extra_nix_config: "sandbox = true"
|
||||||
|
- run: echo CACHIX_NAME="$(echo $GITHUB_REPOSITORY-install-tests | tr "[A-Z]/" "[a-z]-")" >> $GITHUB_ENV
|
||||||
|
- uses: cachix/cachix-action@v12
|
||||||
|
if: needs.check_secrets.outputs.cachix == 'true'
|
||||||
|
with:
|
||||||
|
name: '${{ env.CACHIX_NAME }}'
|
||||||
|
signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
|
||||||
|
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
||||||
|
- run: nix --experimental-features 'nix-command flakes' flake check -L
|
||||||
|
|
||||||
|
check_secrets:
|
||||||
|
permissions:
|
||||||
|
contents: none
|
||||||
|
name: Check Cachix and Docker secrets present for installer tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
cachix: ${{ steps.secret.outputs.cachix }}
|
||||||
|
docker: ${{ steps.secret.outputs.docker }}
|
||||||
|
steps:
|
||||||
|
- name: Check for secrets
|
||||||
|
id: secret
|
||||||
|
env:
|
||||||
|
_CACHIX_SECRETS: ${{ secrets.CACHIX_SIGNING_KEY }}${{ secrets.CACHIX_AUTH_TOKEN }}
|
||||||
|
_DOCKER_SECRETS: ${{ secrets.DOCKERHUB_USERNAME }}${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
echo "::set-output name=cachix::${{ env._CACHIX_SECRETS != '' }}"
|
||||||
|
echo "::set-output name=docker::${{ env._DOCKER_SECRETS != '' }}"
|
||||||
|
|
||||||
|
installer:
|
||||||
|
needs: [tests, check_secrets]
|
||||||
|
if: github.event_name == 'push' && needs.check_secrets.outputs.cachix == 'true'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
installerURL: ${{ steps.prepare-installer.outputs.installerURL }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- run: echo CACHIX_NAME="$(echo $GITHUB_REPOSITORY-install-tests | tr "[A-Z]/" "[a-z]-")" >> $GITHUB_ENV
|
||||||
|
- uses: cachix/install-nix-action@v23
|
||||||
|
with:
|
||||||
|
install_url: https://releases.nixos.org/nix/nix-2.13.3/install
|
||||||
|
- uses: cachix/cachix-action@v12
|
||||||
|
with:
|
||||||
|
name: '${{ env.CACHIX_NAME }}'
|
||||||
|
signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
|
||||||
|
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
||||||
|
- id: prepare-installer
|
||||||
|
run: scripts/prepare-installer-for-github-actions
|
||||||
|
|
||||||
|
installer_test:
|
||||||
|
needs: [installer, check_secrets]
|
||||||
|
if: github.event_name == 'push' && needs.check_secrets.outputs.cachix == 'true'
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, macos-latest]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- run: echo CACHIX_NAME="$(echo $GITHUB_REPOSITORY-install-tests | tr "[A-Z]/" "[a-z]-")" >> $GITHUB_ENV
|
||||||
|
- uses: cachix/install-nix-action@v23
|
||||||
|
with:
|
||||||
|
install_url: '${{needs.installer.outputs.installerURL}}'
|
||||||
|
install_options: "--tarball-url-prefix https://${{ env.CACHIX_NAME }}.cachix.org/serve"
|
||||||
|
- run: sudo apt install fish zsh
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
- run: brew install fish
|
||||||
|
if: matrix.os == 'macos-latest'
|
||||||
|
- run: exec bash -c "nix-instantiate -E 'builtins.currentTime' --eval"
|
||||||
|
- run: exec sh -c "nix-instantiate -E 'builtins.currentTime' --eval"
|
||||||
|
- run: exec zsh -c "nix-instantiate -E 'builtins.currentTime' --eval"
|
||||||
|
- run: exec fish -c "nix-instantiate -E 'builtins.currentTime' --eval"
|
||||||
|
- run: exec bash -c "nix-channel --add https://releases.nixos.org/nixos/unstable/nixos-23.05pre466020.60c1d71f2ba nixpkgs"
|
||||||
|
- run: exec bash -c "nix-channel --update && nix-env -iA nixpkgs.hello && hello"
|
||||||
|
|
||||||
|
docker_push_image:
|
||||||
|
needs: [check_secrets, tests]
|
||||||
|
if: >-
|
||||||
|
github.event_name == 'push' &&
|
||||||
|
github.ref_name == 'master' &&
|
||||||
|
needs.check_secrets.outputs.cachix == 'true' &&
|
||||||
|
needs.check_secrets.outputs.docker == 'true'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: cachix/install-nix-action@v23
|
||||||
|
with:
|
||||||
|
install_url: https://releases.nixos.org/nix/nix-2.13.3/install
|
||||||
|
- run: echo CACHIX_NAME="$(echo $GITHUB_REPOSITORY-install-tests | tr "[A-Z]/" "[a-z]-")" >> $GITHUB_ENV
|
||||||
|
- run: echo NIX_VERSION="$(nix --experimental-features 'nix-command flakes' eval .\#default.version | tr -d \")" >> $GITHUB_ENV
|
||||||
|
- uses: cachix/cachix-action@v12
|
||||||
|
if: needs.check_secrets.outputs.cachix == 'true'
|
||||||
|
with:
|
||||||
|
name: '${{ env.CACHIX_NAME }}'
|
||||||
|
signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
|
||||||
|
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
||||||
|
- run: nix --experimental-features 'nix-command flakes' build .#dockerImage -L
|
||||||
|
- run: docker load -i ./result/image.tar.gz
|
||||||
|
- run: docker tag nix:$NIX_VERSION nixos/nix:$NIX_VERSION
|
||||||
|
- run: docker tag nix:$NIX_VERSION nixos/nix:master
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- run: docker push nixos/nix:$NIX_VERSION
|
||||||
|
- run: docker push nixos/nix:master
|
20
.github/workflows/hydra_status.yml
vendored
Normal file
20
.github/workflows/hydra_status.yml
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
name: Hydra status
|
||||||
|
|
||||||
|
permissions: read-all
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "12,42 * * * *"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_hydra_status:
|
||||||
|
name: Check Hydra status
|
||||||
|
if: github.repository_owner == 'NixOS'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- run: bash scripts/check-hydra-status.sh
|
||||||
|
|
24
.github/workflows/labels.yml
vendored
Normal file
24
.github/workflows/labels.yml
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
name: "Label PR"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [edited, opened, synchronize, reopened]
|
||||||
|
|
||||||
|
# WARNING:
|
||||||
|
# When extending this action, be aware that $GITHUB_TOKEN allows some write
|
||||||
|
# access to the GitHub API. This means that it should not evaluate user input in
|
||||||
|
# a way that allows code injection.
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
labels:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.repository_owner == 'NixOS'
|
||||||
|
steps:
|
||||||
|
- uses: actions/labeler@v4
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
sync-labels: false
|
12
.gitignore
vendored
12
.gitignore
vendored
|
@ -10,7 +10,6 @@ perl/Makefile.config
|
||||||
/stamp-h1
|
/stamp-h1
|
||||||
/svn-revision
|
/svn-revision
|
||||||
/libtool
|
/libtool
|
||||||
/config
|
|
||||||
|
|
||||||
# /doc/manual/
|
# /doc/manual/
|
||||||
/doc/manual/*.1
|
/doc/manual/*.1
|
||||||
|
@ -21,9 +20,15 @@ perl/Makefile.config
|
||||||
/doc/manual/conf-file.json
|
/doc/manual/conf-file.json
|
||||||
/doc/manual/language.json
|
/doc/manual/language.json
|
||||||
/doc/manual/xp-features.json
|
/doc/manual/xp-features.json
|
||||||
|
/doc/manual/src/SUMMARY.md
|
||||||
|
/doc/manual/src/SUMMARY-rl-next.md
|
||||||
|
/doc/manual/src/command-ref/new-cli
|
||||||
|
/doc/manual/src/command-ref/conf-file.md
|
||||||
/doc/manual/src/command-ref/experimental-features-shortlist.md
|
/doc/manual/src/command-ref/experimental-features-shortlist.md
|
||||||
/doc/manual/src/contributing/experimental-feature-descriptions.md
|
/doc/manual/src/contributing/experimental-feature-descriptions.md
|
||||||
/doc/manual/src/release-notes/rl-next-generated.md
|
/doc/manual/src/language/builtins.md
|
||||||
|
/doc/manual/src/language/builtin-constants.md
|
||||||
|
/doc/manual/src/release-notes/rl-next.md
|
||||||
|
|
||||||
# /scripts/
|
# /scripts/
|
||||||
/scripts/nix-profile.sh
|
/scripts/nix-profile.sh
|
||||||
|
@ -154,6 +159,3 @@ result-*
|
||||||
buildtime.bin
|
buildtime.bin
|
||||||
|
|
||||||
.envrc.local
|
.envrc.local
|
||||||
# We generate this with a Nix shell hook
|
|
||||||
/.pre-commit-config.yaml
|
|
||||||
/.nocontribmsg
|
|
||||||
|
|
|
@ -1,53 +1,76 @@
|
||||||
# Contributing to Lix
|
# Contributing to Nix
|
||||||
|
|
||||||
Welcome and thank you for considering contributing to Lix! We're currently in a soft release phase, and your support means a lot to us.
|
Welcome and thank you for your interest in contributing to Nix!
|
||||||
|
We appreciate your support.
|
||||||
|
|
||||||
To ensure a smooth and effective contribution process, here is a summary of our guidelines:
|
Reading and following these guidelines will help us make the contribution process easy and effective for everyone involved.
|
||||||
|
|
||||||
## Getting help?
|
|
||||||
|
|
||||||
If you have any question regarding getting started or reporting bugs, feel free
|
|
||||||
to reach out to us.
|
|
||||||
|
|
||||||
On Matrix, we have a space at `#space:lix.systems`, composed of:
|
|
||||||
|
|
||||||
- [`#discuss:lix.systems`](https://matrix.to/#/#discuss:lix.systems) for discussions on Lix.
|
|
||||||
- [`#dev:lix.systems`](https://matrix.to/#/#dev:lix.systems) for the development channel on Lix.
|
|
||||||
|
|
||||||
## Report a bug
|
## Report a bug
|
||||||
|
|
||||||
- Check if your bug has already been reported in the [issue tracker](https://git.lix.systems/lix-project/lix/issues).
|
1. Check on the [GitHub issue tracker](https://github.com/NixOS/nix/issues) if your bug was already reported.
|
||||||
- If you can't find the bug or feature, please open a new issue.
|
|
||||||
|
|
||||||
We maintain a copy of the upstream Nix bugs. Their organisation can be read about [here](https://wiki.lix.systems/books/lix-contributors/page/bug-tracker-organisation).
|
2. If you were not able to find the bug or feature [open a new issue](https://github.com/NixOS/nix/issues/new/choose)
|
||||||
|
|
||||||
|
3. The issue templates will guide you in specifying your issue.
|
||||||
|
The more complete the information you provide, the more likely it can be found by others and the more useful it is in the future.
|
||||||
|
Make sure reported bugs can be reproduced easily.
|
||||||
|
|
||||||
|
4. Once submitted, do not expect issues to be picked up or solved right away.
|
||||||
|
The only way to ensure this, is to [work on the issue yourself](#making-changes-to-nix).
|
||||||
|
|
||||||
## Report a security vulnerability
|
## Report a security vulnerability
|
||||||
|
|
||||||
For security vulnerabilities, reach out by email at `security at lix dot systems`.
|
Check out the [security policy](https://github.com/NixOS/nix/security/policy).
|
||||||
|
|
||||||
## Making changes to Lix
|
## Making changes to Nix
|
||||||
|
|
||||||
Before diving into making changes, we want to engage with you and your ideas.
|
1. Check for [pull requests](https://github.com/NixOS/nix/pulls) that might already cover the contribution you are about to make.
|
||||||
|
There are many open pull requests that might already do what you intent to work on.
|
||||||
|
You can use [labels](https://github.com/NixOS/nix/labels) to filter for relevant topics.
|
||||||
|
|
||||||
We have a few policies in effect; please take the time to familiarize yourself:
|
2. Search for related issues that cover what you're going to work on. It could help to mention there that you will work on the issue.
|
||||||
|
|
||||||
- [Style guide on code](https://wiki.lix.systems/books/lix-contributors/page/code)
|
Issues labeled [good first issue](https://github.com/NixOS/nix/labels/good-first-issue) should be relatively easy to fix and are likely to get merged quickly.
|
||||||
- [Freeze policy and recommended contributions](https://wiki.lix.systems/books/lix-contributors/page/freezes-and-recommended-contributions)
|
Pull requests addressing issues labeled [idea approved](https://github.com/NixOS/nix/labels/idea%20approved) are especially welcomed by maintainers and will receive prioritised review.
|
||||||
|
|
||||||
To avoid duplication of effort, it may be a good idea to check out the list of
|
3. Check the [Nix reference manual](https://nixos.org/manual/nix/unstable/contributing/hacking.html) for information on building Nix and running its tests.
|
||||||
[pending pull requests](https://gerrit.lix.systems/q/status:open+-is:wip) (or "change lists", as Gerrit calls them). Once you have
|
|
||||||
an idea of what you might want to do, we recommend dropping a message on our
|
|
||||||
Matrix to ensure your contribution fits with our current schedule and plans
|
|
||||||
|
|
||||||
When you're ready and your changes are ready to go:
|
For contributions to the command line interface, please check the [CLI guidelines](https://nixos.org/manual/nix/unstable/contributing/cli-guideline.html).
|
||||||
|
|
||||||
- Submit your code.
|
4. Make your changes!
|
||||||
- Submitting a GitHub PR [on our mirror](https://github.com/lix-project/lix) is totally ok if that's easier for you and your change is relatively small (300 lines or so).
|
|
||||||
|
|
||||||
We may ask you to resubmit it as a Gerrit CL if it is necessary for the change you're making.
|
5. [Create a pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request) for your changes.
|
||||||
- Our primary code review system is [our Gerrit instance](https://gerrit.lix.systems), where you can open a change list (CL).
|
* Link related issues in your pull request to inform interested parties and future contributors about your change.
|
||||||
If you're new to Gerrit, check out [our wiki page about Gerrit](https://wiki.lix.systems/books/lix-contributors/page/gerrit).
|
* Make sure to have [a clean history of commits on your branch by using rebase](https://www.digitalocean.com/community/tutorials/how-to-rebase-and-update-a-pull-request).
|
||||||
- Make sure to link any related issues.
|
If your pull request closes one or multiple issues, note that in the description using `Closes: #<number>`, as it will then happen automatically when your change is merged.
|
||||||
- If needed, indicate that the change is 'work in progress'.
|
* [Mark the pull request as draft](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request) if you're not done with the changes.
|
||||||
|
|
||||||
You can obtain an account on our platforms by clicking "Sign In with GitHub" on the sign-in page.
|
6. Do not expect your pull request to be reviewed immediately.
|
||||||
|
Nix maintainers follow a [structured process for reviews and design decisions](https://github.com/NixOS/nix/tree/master/maintainers#project-board-protocol), which may or may not prioritise your work.
|
||||||
|
|
||||||
|
Following this checklist will make the process smoother for everyone:
|
||||||
|
|
||||||
|
- [ ] Fixes an [idea approved](https://github.com/NixOS/nix/labels/idea%20approved) issue
|
||||||
|
- [ ] Tests, as appropriate:
|
||||||
|
- Functional tests – [`tests/functional/**.sh`](./tests/functional)
|
||||||
|
- Unit tests – [`src/*/tests`](./src/)
|
||||||
|
- Integration tests – [`tests/nixos/*`](./tests/nixos)
|
||||||
|
- [ ] User documentation in the [manual](..doc/manual/src)
|
||||||
|
- [ ] API documentation in header files
|
||||||
|
- [ ] Code and comments are self-explanatory
|
||||||
|
- [ ] Commit message explains **why** the change was made
|
||||||
|
- [ ] New feature or incompatible change: updated [release notes](./doc/manual/src/release-notes/rl-next.md)
|
||||||
|
|
||||||
|
7. If you need additional feedback or help to getting pull request into shape, ask other contributors using [@mentions](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#mentioning-people-and-teams).
|
||||||
|
|
||||||
|
## Making changes to the Nix manual
|
||||||
|
|
||||||
|
The Nix reference manual is hosted on https://nixos.org/manual/nix.
|
||||||
|
The underlying source files are located in [`doc/manual/src`](./doc/manual/src).
|
||||||
|
For small changes you can [use GitHub to edit these files](https://docs.github.com/en/repositories/working-with-files/managing-files/editing-files)
|
||||||
|
For larger changes see the [Nix reference manual](https://nixos.org/manual/nix/unstable/contributing/hacking.html).
|
||||||
|
|
||||||
|
## Getting help
|
||||||
|
|
||||||
|
Whenever you're stuck or do not know how to proceed, you can always ask for help.
|
||||||
|
The appropriate channels to do so can be found on the [NixOS Community](https://nixos.org/community/) page.
|
||||||
|
|
20
COPYING
20
COPYING
|
@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
|
||||||
that what they have is not the original version, so that the original
|
that what they have is not the original version, so that the original
|
||||||
author's reputation will not be affected by problems that might be
|
author's reputation will not be affected by problems that might be
|
||||||
introduced by others.
|
introduced by others.
|
||||||
|
|
||||||
Finally, software patents pose a constant threat to the existence of
|
Finally, software patents pose a constant threat to the existence of
|
||||||
any free program. We wish to make sure that a company cannot
|
any free program. We wish to make sure that a company cannot
|
||||||
effectively restrict the users of a free program by obtaining a
|
effectively restrict the users of a free program by obtaining a
|
||||||
|
@ -111,7 +111,7 @@ modification follow. Pay close attention to the difference between a
|
||||||
"work based on the library" and a "work that uses the library". The
|
"work based on the library" and a "work that uses the library". The
|
||||||
former contains code derived from the library, whereas the latter must
|
former contains code derived from the library, whereas the latter must
|
||||||
be combined with the library in order to run.
|
be combined with the library in order to run.
|
||||||
|
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ Library.
|
||||||
You may charge a fee for the physical act of transferring a copy,
|
You may charge a fee for the physical act of transferring a copy,
|
||||||
and you may at your option offer warranty protection in exchange for a
|
and you may at your option offer warranty protection in exchange for a
|
||||||
fee.
|
fee.
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Library or any portion
|
2. You may modify your copy or copies of the Library or any portion
|
||||||
of it, thus forming a work based on the Library, and copy and
|
of it, thus forming a work based on the Library, and copy and
|
||||||
distribute such modifications or work under the terms of Section 1
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the
|
||||||
ordinary GNU General Public License has appeared, then you can specify
|
ordinary GNU General Public License has appeared, then you can specify
|
||||||
that version instead if you wish.) Do not make any other change in
|
that version instead if you wish.) Do not make any other change in
|
||||||
these notices.
|
these notices.
|
||||||
|
|
||||||
Once this change is made in a given copy, it is irreversible for
|
Once this change is made in a given copy, it is irreversible for
|
||||||
that copy, so the ordinary GNU General Public License applies to all
|
that copy, so the ordinary GNU General Public License applies to all
|
||||||
subsequent copies and derivative works made from that copy.
|
subsequent copies and derivative works made from that copy.
|
||||||
|
@ -267,7 +267,7 @@ Library will still fall under Section 6.)
|
||||||
distribute the object code for the work under the terms of Section 6.
|
distribute the object code for the work under the terms of Section 6.
|
||||||
Any executables containing that work also fall under Section 6,
|
Any executables containing that work also fall under Section 6,
|
||||||
whether or not they are linked directly with the Library itself.
|
whether or not they are linked directly with the Library itself.
|
||||||
|
|
||||||
6. As an exception to the Sections above, you may also combine or
|
6. As an exception to the Sections above, you may also combine or
|
||||||
link a "work that uses the Library" with the Library to produce a
|
link a "work that uses the Library" with the Library to produce a
|
||||||
work containing portions of the Library, and distribute that work
|
work containing portions of the Library, and distribute that work
|
||||||
|
@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
|
||||||
accompany the operating system. Such a contradiction means you cannot
|
accompany the operating system. Such a contradiction means you cannot
|
||||||
use both them and the Library together in an executable that you
|
use both them and the Library together in an executable that you
|
||||||
distribute.
|
distribute.
|
||||||
|
|
||||||
7. You may place library facilities that are a work based on the
|
7. You may place library facilities that are a work based on the
|
||||||
Library side-by-side in a single library together with other library
|
Library side-by-side in a single library together with other library
|
||||||
facilities not covered by this License, and distribute such a combined
|
facilities not covered by this License, and distribute such a combined
|
||||||
|
@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
You are not responsible for enforcing compliance by third parties with
|
You are not responsible for enforcing compliance by third parties with
|
||||||
this License.
|
this License.
|
||||||
|
|
||||||
11. If, as a consequence of a court judgment or allegation of patent
|
11. If, as a consequence of a court judgment or allegation of patent
|
||||||
infringement or for any other reason (not limited to patent issues),
|
infringement or for any other reason (not limited to patent issues),
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
|
||||||
the Free Software Foundation. If the Library does not specify a
|
the Free Software Foundation. If the Library does not specify a
|
||||||
license version number, you may choose any version ever published by
|
license version number, you may choose any version ever published by
|
||||||
the Free Software Foundation.
|
the Free Software Foundation.
|
||||||
|
|
||||||
14. If you wish to incorporate parts of the Library into other free
|
14. If you wish to incorporate parts of the Library into other free
|
||||||
programs whose distribution conditions are incompatible with these,
|
programs whose distribution conditions are incompatible with these,
|
||||||
write to the author to ask for permission. For software which is
|
write to the author to ask for permission. For software which is
|
||||||
|
@ -456,7 +456,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
DAMAGES.
|
DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Libraries
|
How to Apply These Terms to Your New Libraries
|
||||||
|
|
||||||
If you develop a new library, and you want it to be of the greatest
|
If you develop a new library, and you want it to be of the greatest
|
||||||
|
@ -500,3 +500,5 @@ necessary. Here is a sample; alter the names:
|
||||||
Ty Coon, President of Vice
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
That's all there is to it!
|
That's all there is to it!
|
||||||
|
|
||||||
|
|
||||||
|
|
71
Makefile
Normal file
71
Makefile
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
include mk/build-dir.mk
|
||||||
|
|
||||||
|
-include $(buildprefix)Makefile.config
|
||||||
|
clean-files += $(buildprefix)Makefile.config
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_BUILD), yes)
|
||||||
|
makefiles = \
|
||||||
|
mk/precompiled-headers.mk \
|
||||||
|
local.mk \
|
||||||
|
src/libutil/local.mk \
|
||||||
|
src/libstore/local.mk \
|
||||||
|
src/libfetchers/local.mk \
|
||||||
|
src/libmain/local.mk \
|
||||||
|
src/libexpr/local.mk \
|
||||||
|
src/libcmd/local.mk \
|
||||||
|
src/nix/local.mk \
|
||||||
|
src/resolve-system-dependencies/local.mk \
|
||||||
|
scripts/local.mk \
|
||||||
|
misc/bash/local.mk \
|
||||||
|
misc/fish/local.mk \
|
||||||
|
misc/zsh/local.mk \
|
||||||
|
misc/systemd/local.mk \
|
||||||
|
misc/launchd/local.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_BUILD)_$(ENABLE_TESTS), yes_yes)
|
||||||
|
UNIT_TEST_ENV = _NIX_TEST_UNIT_DATA=unit-test-data
|
||||||
|
makefiles += \
|
||||||
|
tests/unit/libutil/local.mk \
|
||||||
|
tests/unit/libutil-support/local.mk \
|
||||||
|
tests/unit/libstore/local.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_TESTS), yes)
|
||||||
|
makefiles += \
|
||||||
|
tests/unit/libstore-support/local.mk \
|
||||||
|
tests/unit/libexpr/local.mk \
|
||||||
|
tests/unit/libexpr-support/local.mk \
|
||||||
|
tests/functional/local.mk \
|
||||||
|
tests/functional/ca/local.mk \
|
||||||
|
tests/functional/dyn-drv/local.mk \
|
||||||
|
tests/functional/test-libstoreconsumer/local.mk \
|
||||||
|
tests/functional/repl_characterization/local.mk \
|
||||||
|
tests/functional/plugins/local.mk
|
||||||
|
else
|
||||||
|
makefiles += \
|
||||||
|
mk/disable-tests.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Some makefiles require access to built programs and must be included late.
|
||||||
|
makefiles-late =
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_BUILD), yes)
|
||||||
|
makefiles-late += doc/manual/local.mk
|
||||||
|
makefiles-late += doc/internal-api/local.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Miscellaneous global Flags
|
||||||
|
|
||||||
|
OPTIMIZE = 1
|
||||||
|
|
||||||
|
ifeq ($(OPTIMIZE), 1)
|
||||||
|
GLOBAL_CXXFLAGS += -O2 $(CXXLTO)
|
||||||
|
GLOBAL_LDFLAGS += $(CXXLTO)
|
||||||
|
else
|
||||||
|
GLOBAL_CXXFLAGS += -O0 -U_FORTIFY_SOURCE
|
||||||
|
endif
|
||||||
|
|
||||||
|
include mk/lib.mk
|
||||||
|
|
||||||
|
GLOBAL_CXXFLAGS += -g -Wall -Wimplicit-fallthrough -include $(buildprefix)config.h -std=c++2a -I src
|
51
Makefile.config.in
Normal file
51
Makefile.config.in
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
AR = @AR@
|
||||||
|
BDW_GC_LIBS = @BDW_GC_LIBS@
|
||||||
|
BOOST_LDFLAGS = @BOOST_LDFLAGS@
|
||||||
|
BUILD_SHARED_LIBS = @BUILD_SHARED_LIBS@
|
||||||
|
CC = @CC@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CXX = @CXX@
|
||||||
|
CXXFLAGS = @CXXFLAGS@
|
||||||
|
CXXLTO = @CXXLTO@
|
||||||
|
EDITLINE_LIBS = @EDITLINE_LIBS@
|
||||||
|
ENABLE_S3 = @ENABLE_S3@
|
||||||
|
GTEST_LIBS = @GTEST_LIBS@
|
||||||
|
HAVE_LIBCPUID = @HAVE_LIBCPUID@
|
||||||
|
HAVE_SECCOMP = @HAVE_SECCOMP@
|
||||||
|
HOST_OS = @host_os@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBARCHIVE_LIBS = @LIBARCHIVE_LIBS@
|
||||||
|
LIBBROTLI_LIBS = @LIBBROTLI_LIBS@
|
||||||
|
LIBCURL_LIBS = @LIBCURL_LIBS@
|
||||||
|
LIBSECCOMP_LIBS = @LIBSECCOMP_LIBS@
|
||||||
|
LOWDOWN_LIBS = @LOWDOWN_LIBS@
|
||||||
|
OPENSSL_LIBS = @OPENSSL_LIBS@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
RAPIDCHECK_HEADERS = @RAPIDCHECK_HEADERS@
|
||||||
|
SHELL = @bash@
|
||||||
|
SODIUM_LIBS = @SODIUM_LIBS@
|
||||||
|
SQLITE3_LIBS = @SQLITE3_LIBS@
|
||||||
|
bash = @bash@
|
||||||
|
bindir = @bindir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
doc_generate = @doc_generate@
|
||||||
|
docdir = @docdir@
|
||||||
|
embedded_sandbox_shell = @embedded_sandbox_shell@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
includedir = @includedir@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
lsof = @lsof@
|
||||||
|
mandir = @mandir@
|
||||||
|
pkglibdir = $(libdir)/$(PACKAGE_NAME)
|
||||||
|
prefix = @prefix@
|
||||||
|
sandbox_shell = @sandbox_shell@
|
||||||
|
storedir = @storedir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
system = @system@
|
||||||
|
ENABLE_BUILD = @ENABLE_BUILD@
|
||||||
|
ENABLE_TESTS = @ENABLE_TESTS@
|
||||||
|
internal_api_docs = @internal_api_docs@
|
25
README.md
25
README.md
|
@ -1,8 +1,11 @@
|
||||||
# Lix
|
# Nix
|
||||||
|
|
||||||
**Lix** is an implementation of **Nix**, a powerful package management system for Linux and other Unix systems that makes package management reliable and reproducible.
|
[![Open Collective supporters](https://opencollective.com/nixos/tiers/supporter/badge.svg?label=Supporters&color=brightgreen)](https://opencollective.com/nixos)
|
||||||
|
[![Test](https://github.com/NixOS/nix/workflows/Test/badge.svg)](https://github.com/NixOS/nix/actions)
|
||||||
|
|
||||||
Read more about us at https://lix.systems.
|
Nix is a powerful package manager for Linux and other Unix systems that makes package
|
||||||
|
management reliable and reproducible. Please refer to the [Nix manual](https://nixos.org/nix/manual)
|
||||||
|
for more details.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
@ -10,20 +13,24 @@ On Linux and macOS the easiest way to install Nix is to run the following shell
|
||||||
(as a user other than root):
|
(as a user other than root):
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ curl -sSf -L https://install.lix.systems/lix | sh -s -- install
|
$ curl -L https://nixos.org/nix/install | sh
|
||||||
```
|
```
|
||||||
|
|
||||||
For systems that **already have Nix installed**, such as NixOS systems, read our [install page](https://lix.systems/install)
|
Information on additional installation methods is available on the [Nix download page](https://nixos.org/download.html).
|
||||||
|
|
||||||
## Building And Developing
|
## Building And Developing
|
||||||
|
|
||||||
See our [Hacking guide](https://git.lix.systems/lix-project/lix/src/branch/main/doc/manual/src/contributing/hacking.md) in our manual for instruction on how to to set up a development environment and build Lix from source.
|
See our [Hacking guide](https://nixos.org/manual/nix/unstable/contributing/hacking.html) in our manual for instruction on how to
|
||||||
|
to set up a development environment and build Nix from source.
|
||||||
|
|
||||||
## Additional Resources
|
## Additional Resources
|
||||||
|
|
||||||
- [Our wiki](https://wiki.lix.systems)
|
- [Nix manual](https://nixos.org/nix/manual)
|
||||||
- [Matrix - #space:lix.systems](https://matrix.to/#/#space:lix.systems)
|
- [Nix jobsets on hydra.nixos.org](https://hydra.nixos.org/project/nix)
|
||||||
|
- [NixOS Discourse](https://discourse.nixos.org/)
|
||||||
|
- [Matrix - #nix:nixos.org](https://matrix.to/#/#nix:nixos.org)
|
||||||
|
- [IRC - #nixos on libera.chat](irc://irc.libera.chat/#nixos)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Lix is released under the [LGPL v2.1](./COPYING).
|
Nix is released under the [LGPL v2.1](./COPYING).
|
||||||
|
|
3
bench/.gitignore
vendored
3
bench/.gitignore
vendored
|
@ -1,3 +0,0 @@
|
||||||
bench-*.json
|
|
||||||
bench-*.md
|
|
||||||
nixpkgs
|
|
|
@ -1,91 +0,0 @@
|
||||||
# Benchmarking scripts for Lix
|
|
||||||
|
|
||||||
These are very much WIP, and have a few clumsy assumptions that we would
|
|
||||||
somewhat rather be fixed, but we have committed them to let others be able to
|
|
||||||
do benchmarking in the mean time.
|
|
||||||
|
|
||||||
## Benchmarking procedure
|
|
||||||
|
|
||||||
Build some Lixes you want to compare, by whichever means you wish.
|
|
||||||
|
|
||||||
Get a computer that is not busy and *strongly preferably* is bare-metal or at
|
|
||||||
least not a cloud VM (e.g. go make coffee when running benchmarks).
|
|
||||||
|
|
||||||
From the root of a Lix checkout, run `./bench/bench.sh resultlink-one
|
|
||||||
resultlink-two`, where `resultlink-one` and `resultlink-two` are the result
|
|
||||||
links from the builds you want to test (they can be any directory with bin/nix
|
|
||||||
in it, however).
|
|
||||||
|
|
||||||
To get the summary again, run `./bench/summarize.jq bench/bench-*.json`.
|
|
||||||
|
|
||||||
## Example results
|
|
||||||
|
|
||||||
(vim tip: `:r !bench/summarize.jq bench/bench-*.json` to dump it directly into
|
|
||||||
your editor)
|
|
||||||
|
|
||||||
```
|
|
||||||
result-asserts/bin/nix --extra-experimental-features 'nix-command flakes' search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6
|
|
||||||
c6fe19ccb59cac54b5b3f25e160870 hello
|
|
||||||
mean: 15.993s ± 0.081s
|
|
||||||
user: 13.321s | system: 1.865s
|
|
||||||
median: 15.994s
|
|
||||||
range: 15.829s ... 16.096s
|
|
||||||
relative: 1
|
|
||||||
result/bin/nix --extra-experimental-features 'nix-command flakes' search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6c6fe19cc
|
|
||||||
b59cac54b5b3f25e160870 hello
|
|
||||||
mean: 15.897s ± 0.075s
|
|
||||||
user: 13.248s | system: 1.843s
|
|
||||||
median: 15.88s
|
|
||||||
range: 15.807s ... 16.047s
|
|
||||||
relative: 0.994
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
result/bin/nix --extra-experimental-features 'nix-command flakes' eval -f bench/nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix
|
|
||||||
mean: 0.4s ± 0.024s
|
|
||||||
user: 0.335s | system: 0.046s
|
|
||||||
median: 0.386s
|
|
||||||
range: 0.379s ... 0.43s
|
|
||||||
relative: 1
|
|
||||||
|
|
||||||
result-asserts/bin/nix --extra-experimental-features 'nix-command flakes' eval -f bench/nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix
|
|
||||||
mean: 0.404s ± 0.024s
|
|
||||||
user: 0.338s | system: 0.046s
|
|
||||||
median: 0.386s
|
|
||||||
range: 0.384s ... 0.436s
|
|
||||||
relative: 1.008
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
result-asserts/bin/nix --extra-experimental-features 'nix-command flakes' eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'
|
|
||||||
mean: 5.838s ± 0.023s
|
|
||||||
user: 5.083s | system: 0.464s
|
|
||||||
median: 5.845s
|
|
||||||
range: 5.799s ... 5.867s
|
|
||||||
relative: 1
|
|
||||||
|
|
||||||
result/bin/nix --extra-experimental-features 'nix-command flakes' eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'
|
|
||||||
mean: 5.788s ± 0.044s
|
|
||||||
user: 5.056s | system: 0.439s
|
|
||||||
median: 5.79s
|
|
||||||
range: 5.715s ... 5.876s
|
|
||||||
relative: 0.991
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
GC_INITIAL_HEAP_SIZE=10g result-asserts/bin/nix eval --extra-experimental-features 'nix-command flakes' --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'
|
|
||||||
mean: 4.147s ± 0.021s
|
|
||||||
user: 3.457s | system: 0.487s
|
|
||||||
median: 4.147s
|
|
||||||
range: 4.123s ... 4.195s
|
|
||||||
relative: 1
|
|
||||||
|
|
||||||
GC_INITIAL_HEAP_SIZE=10g result/bin/nix eval --extra-experimental-features 'nix-command flakes' --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'
|
|
||||||
mean: 4.149s ± 0.027s
|
|
||||||
user: 3.483s | system: 0.456s
|
|
||||||
median: 4.142s
|
|
||||||
range: 4.126s ... 4.215s
|
|
||||||
relative: 1
|
|
||||||
|
|
||||||
---
|
|
||||||
```
|
|
|
@ -1,62 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
shopt -s inherit_errexit
|
|
||||||
|
|
||||||
scriptdir=$(cd "$(dirname -- "$0")" ; pwd -P)
|
|
||||||
cd "$scriptdir/.."
|
|
||||||
|
|
||||||
if [[ $# -lt 2 ]]; then
|
|
||||||
# FIXME(jade): it is a reasonable use case to want to run a benchmark run
|
|
||||||
# on just one build. However, since we are using hyperfine in comparison
|
|
||||||
# mode, we would have to combine the JSON ourselves to support that, which
|
|
||||||
# would probably be better done by writing a benchmarking script in
|
|
||||||
# not-bash.
|
|
||||||
echo "Fewer than two result dirs given, nothing to compare!" >&2
|
|
||||||
echo "Pass some directories (with names indicating which alternative they are) with bin/nix in them" >&2
|
|
||||||
echo "Usage: ./bench/bench.sh result-1 result-2 [result-3...]" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
_exit=""
|
|
||||||
trap "$_exit" EXIT
|
|
||||||
|
|
||||||
# XXX: yes this is very silly. flakes~!!
|
|
||||||
nix build --impure --expr '(builtins.getFlake "git+file:.").inputs.nixpkgs.outPath' -o bench/nixpkgs
|
|
||||||
|
|
||||||
export NIX_REMOTE="$(mktemp -d)"
|
|
||||||
_exit='rm -rfv "$NIX_REMOTE"; $_exit'
|
|
||||||
export NIX_PATH="nixpkgs=bench/nixpkgs:nixos-config=bench/configuration.nix"
|
|
||||||
|
|
||||||
builds=("$@")
|
|
||||||
|
|
||||||
flake_args="--extra-experimental-features 'nix-command flakes'"
|
|
||||||
|
|
||||||
hyperfineArgs=(
|
|
||||||
--parameter-list BUILD "$(IFS=,; echo "${builds[*]}")"
|
|
||||||
--warmup 2 --runs 10
|
|
||||||
)
|
|
||||||
|
|
||||||
declare -A cases
|
|
||||||
cases=(
|
|
||||||
[search]="{BUILD}/bin/nix $flake_args search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870 hello"
|
|
||||||
[rebuild]="{BUILD}/bin/nix $flake_args eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'"
|
|
||||||
[rebuild-lh]="GC_INITIAL_HEAP_SIZE=10g {BUILD}/bin/nix eval $flake_args --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'"
|
|
||||||
[parse]="{BUILD}/bin/nix $flake_args eval -f bench/nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix"
|
|
||||||
)
|
|
||||||
|
|
||||||
benches=(
|
|
||||||
rebuild
|
|
||||||
rebuild-lh
|
|
||||||
search
|
|
||||||
parse
|
|
||||||
)
|
|
||||||
|
|
||||||
for k in "${benches[@]}"; do
|
|
||||||
taskset -c 2,3 \
|
|
||||||
chrt -f 50 \
|
|
||||||
hyperfine "${hyperfineArgs[@]}" --export-json="bench/bench-${k}.json" --export-markdown="bench/bench-${k}.md" "${cases[$k]}"
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Benchmarks summary (from ./bench/summarize.jq bench/bench-*.json)"
|
|
||||||
bench/summarize.jq bench/*.json
|
|
|
@ -1,325 +0,0 @@
|
||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
boot = {
|
|
||||||
initrd = {
|
|
||||||
availableKernelModules = [
|
|
||||||
"xhci_pci"
|
|
||||||
"ahci"
|
|
||||||
];
|
|
||||||
kernelModules = [ "dm-snapshot" ];
|
|
||||||
luks.devices = {
|
|
||||||
croot = {
|
|
||||||
device = "/dev/sdb";
|
|
||||||
allowDiscards = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
kernelModules = [ "kvm-intel" ];
|
|
||||||
kernelPackages = pkgs.linuxPackages_latest;
|
|
||||||
|
|
||||||
loader = {
|
|
||||||
systemd-boot.enable = true;
|
|
||||||
efi.canTouchEfiVariables = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
hardware = {
|
|
||||||
enableRedistributableFirmware = true;
|
|
||||||
cpu.intel.updateMicrocode = true;
|
|
||||||
opengl.driSupport32Bit = true;
|
|
||||||
opengl.extraPackages = with pkgs; [
|
|
||||||
vaapiIntel
|
|
||||||
intel-media-driver
|
|
||||||
intel-compute-runtime
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems = {
|
|
||||||
"/" = {
|
|
||||||
device = "/dev/sda2";
|
|
||||||
fsType = "xfs";
|
|
||||||
options = [ "noatime" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
"/boot" = {
|
|
||||||
device = "/dev/sda1";
|
|
||||||
fsType = "vfat";
|
|
||||||
};
|
|
||||||
|
|
||||||
"/nas" = {
|
|
||||||
device = "nas:/";
|
|
||||||
fsType = "nfs4";
|
|
||||||
options = [
|
|
||||||
"ro"
|
|
||||||
"x-systemd.automount"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
swapDevices = [ { device = "/dev/swap"; } ];
|
|
||||||
|
|
||||||
networking = {
|
|
||||||
useDHCP = false;
|
|
||||||
hostName = "host";
|
|
||||||
wireless = {
|
|
||||||
enable = true;
|
|
||||||
interfaces = [ "eth1" ];
|
|
||||||
};
|
|
||||||
interfaces = {
|
|
||||||
eth0.useDHCP = true;
|
|
||||||
eth1.useDHCP = true;
|
|
||||||
};
|
|
||||||
wg-quick.interfaces = {
|
|
||||||
wg0 = {
|
|
||||||
address = [ "2001:db8::1" ];
|
|
||||||
privateKeyFile = "/etc/secrets/wg0.key";
|
|
||||||
peers = [
|
|
||||||
{
|
|
||||||
publicKey = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
|
|
||||||
endpoint = "[2001:db8::2]:61021";
|
|
||||||
allowedIPs = [ "2001::db8:1::/64" ];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
firewall.allowedUDPPorts = [ 4567 ];
|
|
||||||
};
|
|
||||||
|
|
||||||
i18n = {
|
|
||||||
defaultLocale = "en_US.UTF-8";
|
|
||||||
inputMethod.enabled = "ibus";
|
|
||||||
};
|
|
||||||
|
|
||||||
services = {
|
|
||||||
xserver = {
|
|
||||||
enable = true;
|
|
||||||
layout = "us";
|
|
||||||
xkbVariant = "altgr-intl";
|
|
||||||
xkbOptions = "ctrl:nocaps";
|
|
||||||
libinput.enable = true;
|
|
||||||
wacom.enable = true;
|
|
||||||
videoDrivers = [ "modesetting" ];
|
|
||||||
modules = [ pkgs.xf86_input_wacom ];
|
|
||||||
|
|
||||||
displayManager.sx.enable = true;
|
|
||||||
windowManager.i3.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
udev.extraHwdb = ''
|
|
||||||
# not like this mattered at all
|
|
||||||
# we're not running udev from here
|
|
||||||
'';
|
|
||||||
|
|
||||||
udev.extraRules = ''
|
|
||||||
# ACTION=="add", SUBSYSTEM=="input", ...
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
sound.enable = true;
|
|
||||||
hardware.pulseaudio = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.pulseaudioFull;
|
|
||||||
daemon.config = {
|
|
||||||
lock-memory = "yes";
|
|
||||||
realtime-scheduling = "yes";
|
|
||||||
rlimit-rtprio = "-1";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
programs = {
|
|
||||||
light.enable = true;
|
|
||||||
wireshark = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.wireshark-qt;
|
|
||||||
};
|
|
||||||
gnupg.agent = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
fonts.packages = with pkgs; [
|
|
||||||
font-awesome
|
|
||||||
noto-fonts
|
|
||||||
noto-fonts-cjk
|
|
||||||
noto-fonts-emoji
|
|
||||||
noto-fonts-extra
|
|
||||||
dejavu_fonts
|
|
||||||
powerline-fonts
|
|
||||||
source-code-pro
|
|
||||||
cantarell-fonts
|
|
||||||
];
|
|
||||||
|
|
||||||
users = {
|
|
||||||
mutableUsers = false;
|
|
||||||
|
|
||||||
users = {
|
|
||||||
user = {
|
|
||||||
isNormalUser = true;
|
|
||||||
group = "user";
|
|
||||||
extraGroups = [
|
|
||||||
"wheel"
|
|
||||||
"video"
|
|
||||||
"audio"
|
|
||||||
"dialout"
|
|
||||||
"users"
|
|
||||||
"kvm"
|
|
||||||
"wireshark"
|
|
||||||
];
|
|
||||||
password = "unimportant";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
groups = {
|
|
||||||
user = { };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
security = {
|
|
||||||
pam.loginLimits = [
|
|
||||||
{
|
|
||||||
domain = "@audio";
|
|
||||||
item = "memlock";
|
|
||||||
type = "-";
|
|
||||||
value = "unlimited";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
domain = "@audio";
|
|
||||||
item = "rtprio";
|
|
||||||
type = "-";
|
|
||||||
value = "99";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
domain = "@audio";
|
|
||||||
item = "nofile";
|
|
||||||
type = "soft";
|
|
||||||
value = "99999";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
domain = "@audio";
|
|
||||||
item = "nofile";
|
|
||||||
type = "hard";
|
|
||||||
value = "99999";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
sudo.extraRules = [
|
|
||||||
{
|
|
||||||
users = [ "user" ];
|
|
||||||
commands = [
|
|
||||||
{
|
|
||||||
command = "${pkgs.linuxPackages.cpupower}/bin/cpupower";
|
|
||||||
options = [ "NOPASSWD" ];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
a2jmidid
|
|
||||||
age
|
|
||||||
ardour
|
|
||||||
bemenu
|
|
||||||
blender
|
|
||||||
breeze-icons
|
|
||||||
breeze-qt5
|
|
||||||
bubblewrap
|
|
||||||
calf
|
|
||||||
claws-mail
|
|
||||||
darktable
|
|
||||||
duperemove
|
|
||||||
emacs
|
|
||||||
feh
|
|
||||||
file
|
|
||||||
firefox
|
|
||||||
fluidsynth
|
|
||||||
gnome3.adwaita-icon-theme
|
|
||||||
gnuplot
|
|
||||||
graphviz
|
|
||||||
helm
|
|
||||||
i3status-rust
|
|
||||||
inkscape
|
|
||||||
jack2
|
|
||||||
jq
|
|
||||||
krita
|
|
||||||
ldns
|
|
||||||
libqalculate
|
|
||||||
libreoffice
|
|
||||||
man-pages
|
|
||||||
nheko
|
|
||||||
nix-diff
|
|
||||||
nix-index
|
|
||||||
nix-output-monitor
|
|
||||||
open-music-kontrollers.patchmatrix
|
|
||||||
pamixer
|
|
||||||
pavucontrol
|
|
||||||
pciutils
|
|
||||||
picom
|
|
||||||
pwgen
|
|
||||||
redshift
|
|
||||||
ripgrep
|
|
||||||
rlwrap
|
|
||||||
silver-searcher
|
|
||||||
soundfont-fluid
|
|
||||||
whois
|
|
||||||
wol
|
|
||||||
xclip
|
|
||||||
xdot
|
|
||||||
xdotool
|
|
||||||
xorg.xkbcomp
|
|
||||||
yt-dlp
|
|
||||||
zathura
|
|
||||||
borgbackup
|
|
||||||
linuxPackages.cpupower
|
|
||||||
mtr
|
|
||||||
kitty
|
|
||||||
xf86_input_wacom
|
|
||||||
];
|
|
||||||
|
|
||||||
environment.pathsToLink = [ "/share/soundfonts" ];
|
|
||||||
|
|
||||||
systemd.user.services.run-python = {
|
|
||||||
after = [ "network-online.target" ];
|
|
||||||
script = ''
|
|
||||||
exec ${pkgs.python3}/bin/python
|
|
||||||
'';
|
|
||||||
serviceConfig = {
|
|
||||||
CapabilityBoundingSet = [ "" ];
|
|
||||||
KeyringMode = "private";
|
|
||||||
LockPersonality = true;
|
|
||||||
MemoryDenyWriteExecute = true;
|
|
||||||
NoNewPrivileges = true;
|
|
||||||
PrivateDevices = true;
|
|
||||||
PrivateTmp = true;
|
|
||||||
PrivateUsers = true;
|
|
||||||
ProcSubset = "pid";
|
|
||||||
ProtectClock = true;
|
|
||||||
ProtectControlGroups = true;
|
|
||||||
ProtectHome = true;
|
|
||||||
ProtectHostname = true;
|
|
||||||
ProtectKernelLogs = true;
|
|
||||||
ProtectKernelModules = true;
|
|
||||||
ProtectKernelTunables = true;
|
|
||||||
ProtectProc = "invisible";
|
|
||||||
ProtectSystem = "strict";
|
|
||||||
RestrictAddressFamilies = "AF_INET AF_INET6";
|
|
||||||
RestrictNamespaces = true;
|
|
||||||
RestrictRealtime = true;
|
|
||||||
RestrictSUIDSGID = true;
|
|
||||||
SystemCallArchitectures = "native";
|
|
||||||
SystemCallFilter = [
|
|
||||||
"@system-service"
|
|
||||||
"~ @resources @privileged"
|
|
||||||
];
|
|
||||||
UMask = "077";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
system.stateVersion = "23.11";
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
#!/usr/bin/env -S jq -Mrf
|
|
||||||
|
|
||||||
def round3:
|
|
||||||
. * 1000 | round | . / 1000
|
|
||||||
;
|
|
||||||
|
|
||||||
def stats($first):
|
|
||||||
[
|
|
||||||
" mean: \(.mean | round3)s ± \(.stddev | round3)s",
|
|
||||||
" user: \(.user | round3)s | system: \(.system | round3)s",
|
|
||||||
" median: \(.median | round3)s",
|
|
||||||
" range: \(.min | round3)s ... \(.max | round3)s",
|
|
||||||
" relative: \(.mean / $first.mean | round3)"
|
|
||||||
]
|
|
||||||
| join("\n")
|
|
||||||
;
|
|
||||||
|
|
||||||
def fmt($first):
|
|
||||||
"\(.command)\n" + (. | stats($first))
|
|
||||||
;
|
|
||||||
|
|
||||||
[.results | .[0] as $first | .[] | fmt($first)] | join("\n\n") | (. + "\n\n---\n")
|
|
|
@ -1,4 +0,0 @@
|
||||||
# LLVM style code is 2-space indented
|
|
||||||
[*.{cc,hh}]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
|
@ -1,81 +0,0 @@
|
||||||
#include "FixIncludes.hh"
|
|
||||||
#include <clang-tidy/ClangTidyCheck.h>
|
|
||||||
#include <clang/Basic/Diagnostic.h>
|
|
||||||
#include <clang/Basic/SourceManager.h>
|
|
||||||
#include <clang/Lex/PPCallbacks.h>
|
|
||||||
#include <clang/Lex/Preprocessor.h>
|
|
||||||
#include <llvm/ADT/StringRef.h>
|
|
||||||
#include <llvm/Support/Debug.h>
|
|
||||||
#include <memory>
|
|
||||||
#include <set>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace nix::clang_tidy {
|
|
||||||
|
|
||||||
using namespace clang;
|
|
||||||
using namespace clang::tidy;
|
|
||||||
|
|
||||||
class FixIncludesCallbacks : public PPCallbacks {
|
|
||||||
public:
|
|
||||||
ClangTidyCheck &Check;
|
|
||||||
Preprocessor &PP;
|
|
||||||
FixIncludesCallbacks(ClangTidyCheck &Check, Preprocessor &PP)
|
|
||||||
: Check(Check), PP(PP) {}
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool Ignore = false;
|
|
||||||
virtual void LexedFileChanged(FileID FID, LexedFileChangeReason Reason,
|
|
||||||
SrcMgr::CharacteristicKind FileType,
|
|
||||||
FileID PrevFID, SourceLocation Loc) override;
|
|
||||||
|
|
||||||
virtual void InclusionDirective(SourceLocation HashLoc,
|
|
||||||
const Token &IncludeTok, StringRef FileName,
|
|
||||||
bool IsAngled, CharSourceRange FilenameRange,
|
|
||||||
OptionalFileEntryRef File,
|
|
||||||
StringRef SearchPath, StringRef RelativePath,
|
|
||||||
const Module *Imported,
|
|
||||||
SrcMgr::CharacteristicKind FileType) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
void FixIncludesCallbacks::LexedFileChanged(FileID, LexedFileChangeReason,
|
|
||||||
SrcMgr::CharacteristicKind FileType,
|
|
||||||
FileID, SourceLocation) {
|
|
||||||
Ignore = FileType != SrcMgr::C_User;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FixIncludesCallbacks::InclusionDirective(
|
|
||||||
SourceLocation, const Token &, StringRef, bool,
|
|
||||||
CharSourceRange FilenameRange, OptionalFileEntryRef File, StringRef,
|
|
||||||
StringRef, const Module *, SrcMgr::CharacteristicKind) {
|
|
||||||
if (Ignore)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// FIXME: this is kinda evil, but this is a one-time fixup
|
|
||||||
const std::string SourceDir = "src/";
|
|
||||||
|
|
||||||
if (File && File->getNameAsRequested().contains(SourceDir)) {
|
|
||||||
StringRef Name = File->getNameAsRequested();
|
|
||||||
auto Idx = Name.find(SourceDir);
|
|
||||||
assert(Idx != std::string::npos);
|
|
||||||
StringRef Suffix = Name.drop_front(Idx + SourceDir.length());
|
|
||||||
|
|
||||||
if (!Suffix.starts_with("lib")) {
|
|
||||||
llvm::dbgs() << "ignored: " << Suffix << "\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto Diag = Check.diag(FilenameRange.getBegin(),
|
|
||||||
"include needs to specify the source subdir");
|
|
||||||
|
|
||||||
Diag << FilenameRange
|
|
||||||
<< FixItHint::CreateReplacement(FilenameRange,
|
|
||||||
("\"" + Suffix + "\"").str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FixIncludesCheck::registerPPCallbacks(const SourceManager &,
|
|
||||||
Preprocessor *PP, Preprocessor *) {
|
|
||||||
PP->addPPCallbacks(std::make_unique<FixIncludesCallbacks>(*this, *PP));
|
|
||||||
}
|
|
||||||
|
|
||||||
}; // namespace nix::clang_tidy
|
|
|
@ -1,21 +0,0 @@
|
||||||
#pragma once
|
|
||||||
///@file
|
|
||||||
|
|
||||||
#include <clang-tidy/ClangTidyCheck.h>
|
|
||||||
#include <clang/ASTMatchers/ASTMatchFinder.h>
|
|
||||||
#include <llvm/ADT/StringRef.h>
|
|
||||||
|
|
||||||
namespace nix::clang_tidy {
|
|
||||||
|
|
||||||
using namespace clang;
|
|
||||||
using namespace clang::tidy;
|
|
||||||
|
|
||||||
class FixIncludesCheck : public ClangTidyCheck {
|
|
||||||
public:
|
|
||||||
FixIncludesCheck(StringRef Name, ClangTidyContext *Context)
|
|
||||||
: ClangTidyCheck(Name, Context) {}
|
|
||||||
|
|
||||||
void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include <clang-tidy/ClangTidyModule.h>
|
#include <clang-tidy/ClangTidyModule.h>
|
||||||
#include <clang-tidy/ClangTidyModuleRegistry.h>
|
#include <clang-tidy/ClangTidyModuleRegistry.h>
|
||||||
#include "FixIncludes.hh"
|
|
||||||
#include "HasPrefixSuffix.hh"
|
#include "HasPrefixSuffix.hh"
|
||||||
|
|
||||||
namespace nix::clang_tidy {
|
namespace nix::clang_tidy {
|
||||||
|
@ -10,10 +9,9 @@ using namespace clang::tidy;
|
||||||
class NixClangTidyChecks : public ClangTidyModule {
|
class NixClangTidyChecks : public ClangTidyModule {
|
||||||
public:
|
public:
|
||||||
void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
|
void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
|
||||||
CheckFactories.registerCheck<HasPrefixSuffixCheck>("lix-hasprefixsuffix");
|
CheckFactories.registerCheck<HasPrefixSuffixCheck>("nix-hasprefixsuffix");
|
||||||
CheckFactories.registerCheck<FixIncludesCheck>("lix-fixincludes");
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static ClangTidyModuleRegistry::Add<NixClangTidyChecks> X("lix-module", "Adds lix specific checks");
|
static ClangTidyModuleRegistry::Add<NixClangTidyChecks> X("nix-module", "Adds nix specific checks");
|
||||||
};
|
};
|
|
@ -1,13 +1,8 @@
|
||||||
project('lix-clang-tidy', ['cpp', 'c'],
|
project('nix-clang-tidy', ['cpp', 'c'],
|
||||||
version : '0.1',
|
version : '0.1',
|
||||||
default_options : ['warning_level=3', 'cpp_std=c++20'])
|
default_options : ['warning_level=3', 'cpp_std=c++20'])
|
||||||
|
|
||||||
llvm = dependency('Clang', version: '>= 14', modules: ['libclang'])
|
llvm = dependency('Clang', version: '>= 14', modules: ['libclang'])
|
||||||
sources = files(
|
sources = ['HasPrefixSuffix.cc', 'NixClangTidyChecks.cc']
|
||||||
'HasPrefixSuffix.cc',
|
shared_module('nix-clang-tidy', sources,
|
||||||
'LixClangTidyChecks.cc',
|
|
||||||
'FixIncludes.cc',
|
|
||||||
)
|
|
||||||
|
|
||||||
shared_module('lix-clang-tidy', sources,
|
|
||||||
dependencies: llvm)
|
dependencies: llvm)
|
||||||
|
|
1700
config/config.guess
vendored
Executable file
1700
config/config.guess
vendored
Executable file
File diff suppressed because it is too large
Load diff
1860
config/config.sub
vendored
Executable file
1860
config/config.sub
vendored
Executable file
File diff suppressed because it is too large
Load diff
527
config/install-sh
Executable file
527
config/install-sh
Executable file
|
@ -0,0 +1,527 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2011-11-20.07; # UTC
|
||||||
|
|
||||||
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
# following copyright and license.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1994 X Consortium
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to
|
||||||
|
# deal in the Software without restriction, including without limitation the
|
||||||
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
# sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||||
|
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Except as contained in this notice, the name of the X Consortium shall not
|
||||||
|
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||||
|
# ings in this Software without prior written authorization from the X Consor-
|
||||||
|
# tium.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# FSF changes to this file are in the public domain.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# 'make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch.
|
||||||
|
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
IFS=" "" $nl"
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
|
doit=${DOITPROG-}
|
||||||
|
if test -z "$doit"; then
|
||||||
|
doit_exec=exec
|
||||||
|
else
|
||||||
|
doit_exec=$doit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Put in absolute file names if you don't have them in your path;
|
||||||
|
# or use environment vars.
|
||||||
|
|
||||||
|
chgrpprog=${CHGRPPROG-chgrp}
|
||||||
|
chmodprog=${CHMODPROG-chmod}
|
||||||
|
chownprog=${CHOWNPROG-chown}
|
||||||
|
cmpprog=${CMPPROG-cmp}
|
||||||
|
cpprog=${CPPROG-cp}
|
||||||
|
mkdirprog=${MKDIRPROG-mkdir}
|
||||||
|
mvprog=${MVPROG-mv}
|
||||||
|
rmprog=${RMPROG-rm}
|
||||||
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
|
posix_glob='?'
|
||||||
|
initialize_posix_glob='
|
||||||
|
test "$posix_glob" != "?" || {
|
||||||
|
if (set -f) 2>/dev/null; then
|
||||||
|
posix_glob=
|
||||||
|
else
|
||||||
|
posix_glob=:
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
'
|
||||||
|
|
||||||
|
posix_mkdir=
|
||||||
|
|
||||||
|
# Desired mode of installed file.
|
||||||
|
mode=0755
|
||||||
|
|
||||||
|
chgrpcmd=
|
||||||
|
chmodcmd=$chmodprog
|
||||||
|
chowncmd=
|
||||||
|
mvcmd=$mvprog
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
stripcmd=
|
||||||
|
|
||||||
|
src=
|
||||||
|
dst=
|
||||||
|
dir_arg=
|
||||||
|
dst_arg=
|
||||||
|
|
||||||
|
copy_on_change=false
|
||||||
|
no_target_directory=
|
||||||
|
|
||||||
|
usage="\
|
||||||
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
|
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||||
|
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||||
|
or: $0 [OPTION]... -d DIRECTORIES...
|
||||||
|
|
||||||
|
In the 1st form, copy SRCFILE to DSTFILE.
|
||||||
|
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||||
|
In the 4th, create DIRECTORIES.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help display this help and exit.
|
||||||
|
--version display version info and exit.
|
||||||
|
|
||||||
|
-c (ignored)
|
||||||
|
-C install only if different (preserve the last data modification time)
|
||||||
|
-d create directories instead of installing files.
|
||||||
|
-g GROUP $chgrpprog installed files to GROUP.
|
||||||
|
-m MODE $chmodprog installed files to MODE.
|
||||||
|
-o USER $chownprog installed files to USER.
|
||||||
|
-s $stripprog installed files.
|
||||||
|
-t DIRECTORY install into DIRECTORY.
|
||||||
|
-T report an error if DSTFILE is a directory.
|
||||||
|
|
||||||
|
Environment variables override the default commands:
|
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||||
|
RMPROG STRIPPROG
|
||||||
|
"
|
||||||
|
|
||||||
|
while test $# -ne 0; do
|
||||||
|
case $1 in
|
||||||
|
-c) ;;
|
||||||
|
|
||||||
|
-C) copy_on_change=true;;
|
||||||
|
|
||||||
|
-d) dir_arg=true;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;;
|
||||||
|
|
||||||
|
-m) mode=$2
|
||||||
|
case $mode in
|
||||||
|
*' '* | *' '* | *'
|
||||||
|
'* | *'*'* | *'?'* | *'['*)
|
||||||
|
echo "$0: invalid mode: $mode" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-t) dst_arg=$2
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-T) no_target_directory=true;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
--) shift
|
||||||
|
break;;
|
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2
|
||||||
|
exit 1;;
|
||||||
|
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
|
# When -t is used, the destination is already specified.
|
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
# $@ is not empty: it contains at least $arg.
|
||||||
|
set fnord "$@" "$dst_arg"
|
||||||
|
shift # fnord
|
||||||
|
fi
|
||||||
|
shift # arg
|
||||||
|
dst_arg=$arg
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
echo "$0: no input file specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# It's OK to call 'install-sh -d' without argument.
|
||||||
|
# This can happen when creating conditional directories.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
do_exit='(exit $ret); exit $ret'
|
||||||
|
trap "ret=129; $do_exit" 1
|
||||||
|
trap "ret=130; $do_exit" 2
|
||||||
|
trap "ret=141; $do_exit" 13
|
||||||
|
trap "ret=143; $do_exit" 15
|
||||||
|
|
||||||
|
# Set umask so as not to create temps with too-generous modes.
|
||||||
|
# However, 'strip' requires both read and write access to temps.
|
||||||
|
case $mode in
|
||||||
|
# Optimize common cases.
|
||||||
|
*644) cp_umask=133;;
|
||||||
|
*755) cp_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw='% 200'
|
||||||
|
fi
|
||||||
|
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||||
|
*)
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw=,u+rw
|
||||||
|
fi
|
||||||
|
cp_umask=$mode$u_plus_rw;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
for src
|
||||||
|
do
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $src in
|
||||||
|
-* | [=\(\)!]) src=./$src;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
dst=$src
|
||||||
|
dstdir=$dst
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
if test ! -f "$src" && test ! -d "$src"; then
|
||||||
|
echo "$0: $src does not exist." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dst_arg"; then
|
||||||
|
echo "$0: no destination specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dst=$dst_arg
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; won't work
|
||||||
|
# if double slashes aren't ignored.
|
||||||
|
if test -d "$dst"; then
|
||||||
|
if test -n "$no_target_directory"; then
|
||||||
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dstdir=$dst
|
||||||
|
dst=$dstdir/`basename "$src"`
|
||||||
|
dstdir_status=0
|
||||||
|
else
|
||||||
|
# Prefer dirname, but fall back on a substitute if dirname fails.
|
||||||
|
dstdir=`
|
||||||
|
(dirname "$dst") 2>/dev/null ||
|
||||||
|
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||||
|
X"$dst" : 'X\(//\)[^/]' \| \
|
||||||
|
X"$dst" : 'X\(//\)$' \| \
|
||||||
|
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
||||||
|
echo X"$dst" |
|
||||||
|
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)[^/].*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\).*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
s/.*/./; q'
|
||||||
|
`
|
||||||
|
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
obsolete_mkdir_used=false
|
||||||
|
|
||||||
|
if test $dstdir_status != 0; then
|
||||||
|
case $posix_mkdir in
|
||||||
|
'')
|
||||||
|
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||||
|
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||||
|
umask=`umask`
|
||||||
|
case $stripcmd.$umask in
|
||||||
|
# Optimize common cases.
|
||||||
|
*[2367][2367]) mkdir_umask=$umask;;
|
||||||
|
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
mkdir_umask=`expr $umask + 22 \
|
||||||
|
- $umask % 100 % 40 + $umask % 20 \
|
||||||
|
- $umask % 10 % 4 + $umask % 2
|
||||||
|
`;;
|
||||||
|
*) mkdir_umask=$umask,go-w;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# With -d, create the new directory with the user-specified mode.
|
||||||
|
# Otherwise, rely on $mkdir_umask.
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
mkdir_mode=-m$mode
|
||||||
|
else
|
||||||
|
mkdir_mode=
|
||||||
|
fi
|
||||||
|
|
||||||
|
posix_mkdir=false
|
||||||
|
case $umask in
|
||||||
|
*[123567][0-7][0-7])
|
||||||
|
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||||
|
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
|
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||||
|
|
||||||
|
if (umask $mkdir_umask &&
|
||||||
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
if test -z "$dir_arg" || {
|
||||||
|
# Check for POSIX incompatibilities with -m.
|
||||||
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
|
# other-writable bit of parent directory when it shouldn't.
|
||||||
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
|
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
||||||
|
case $ls_ld_tmpdir in
|
||||||
|
d????-?r-*) different_mode=700;;
|
||||||
|
d????-?--*) different_mode=755;;
|
||||||
|
*) false;;
|
||||||
|
esac &&
|
||||||
|
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
||||||
|
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
||||||
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
then posix_mkdir=:
|
||||||
|
fi
|
||||||
|
rmdir "$tmpdir/d" "$tmpdir"
|
||||||
|
else
|
||||||
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
|
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
||||||
|
fi
|
||||||
|
trap '' 0;;
|
||||||
|
esac;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if
|
||||||
|
$posix_mkdir && (
|
||||||
|
umask $mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||||
|
)
|
||||||
|
then :
|
||||||
|
else
|
||||||
|
|
||||||
|
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||||
|
# or it failed possibly due to a race condition. Create the
|
||||||
|
# directory the slow way, step by step, checking for races as we go.
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
/*) prefix='/';;
|
||||||
|
[-=\(\)!]*) prefix='./';;
|
||||||
|
*) prefix='';;
|
||||||
|
esac
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob"
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
IFS=/
|
||||||
|
$posix_glob set -f
|
||||||
|
set fnord $dstdir
|
||||||
|
shift
|
||||||
|
$posix_glob set +f
|
||||||
|
IFS=$oIFS
|
||||||
|
|
||||||
|
prefixes=
|
||||||
|
|
||||||
|
for d
|
||||||
|
do
|
||||||
|
test X"$d" = X && continue
|
||||||
|
|
||||||
|
prefix=$prefix$d
|
||||||
|
if test -d "$prefix"; then
|
||||||
|
prefixes=
|
||||||
|
else
|
||||||
|
if $posix_mkdir; then
|
||||||
|
(umask=$mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
test -d "$prefix" || exit 1
|
||||||
|
else
|
||||||
|
case $prefix in
|
||||||
|
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||||
|
*) qprefix=$prefix;;
|
||||||
|
esac
|
||||||
|
prefixes="$prefixes '$qprefix'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
prefix=$prefix/
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$prefixes"; then
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
(umask $mkdir_umask &&
|
||||||
|
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||||
|
test -d "$dstdir" || exit 1
|
||||||
|
obsolete_mkdir_used=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||||
|
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||||
|
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||||
|
else
|
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory.
|
||||||
|
dsttmp=$dstdir/_inst.$$_
|
||||||
|
rmtmp=$dstdir/_rm.$$_
|
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit.
|
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
|
||||||
|
# Copy the file name to the temp name.
|
||||||
|
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits.
|
||||||
|
#
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||||
|
#
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||||
|
|
||||||
|
# If -C, don't bother to copy if it wouldn't change the file.
|
||||||
|
if $copy_on_change &&
|
||||||
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob" &&
|
||||||
|
$posix_glob set -f &&
|
||||||
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
|
$posix_glob set +f &&
|
||||||
|
|
||||||
|
test "$old" = "$new" &&
|
||||||
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
rm -f "$dsttmp"
|
||||||
|
else
|
||||||
|
# Rename the file to the real destination.
|
||||||
|
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||||
|
|
||||||
|
# The rename failed, perhaps because mv can't rename something else
|
||||||
|
# to itself, or perhaps because mv is so ancient that it does not
|
||||||
|
# support -f.
|
||||||
|
{
|
||||||
|
# Now remove or move aside any old file at destination location.
|
||||||
|
# We try this two ways since rm can't unlink itself on some
|
||||||
|
# systems and the destination file might be busy for other
|
||||||
|
# reasons. In this case, the final cleanup might fail but the new
|
||||||
|
# file should still install successfully.
|
||||||
|
{
|
||||||
|
test ! -f "$dst" ||
|
||||||
|
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||||
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||||
|
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||||
|
} ||
|
||||||
|
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||||
|
(exit 1); exit 1
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
$doit $mvcmd "$dsttmp" "$dst"
|
||||||
|
}
|
||||||
|
fi || exit 1
|
||||||
|
|
||||||
|
trap '' 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
396
configure.ac
Normal file
396
configure.ac
Normal file
|
@ -0,0 +1,396 @@
|
||||||
|
AC_INIT([nix],[m4_esyscmd(bash -c "echo -n $(cat ./.version)$VERSION_SUFFIX")])
|
||||||
|
AC_CONFIG_MACRO_DIRS([m4])
|
||||||
|
AC_CONFIG_SRCDIR(README.md)
|
||||||
|
AC_CONFIG_AUX_DIR(config)
|
||||||
|
|
||||||
|
AC_PROG_SED
|
||||||
|
|
||||||
|
# Construct a Nix system name (like "i686-linux"):
|
||||||
|
# https://www.gnu.org/software/autoconf/manual/html_node/Canonicalizing.html#index-AC_005fCANONICAL_005fHOST-1
|
||||||
|
# The inital value is produced by the `config/config.guess` script:
|
||||||
|
# upstream: https://git.savannah.gnu.org/cgit/config.git/tree/config.guess
|
||||||
|
# It has the following form, which is not documented anywhere:
|
||||||
|
# <cpu>-<vendor>-<os>[<version>][-<abi>]
|
||||||
|
# If `./configure` is passed any of the `--host`, `--build`, `--target` options, the value comes from `config/config.sub` instead:
|
||||||
|
# upstream: https://git.savannah.gnu.org/cgit/config.git/tree/config.sub
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
AC_MSG_CHECKING([for the canonical Nix system name])
|
||||||
|
|
||||||
|
AC_ARG_WITH(system, AS_HELP_STRING([--with-system=SYSTEM],[Platform identifier (e.g., `i686-linux').]),
|
||||||
|
[system=$withval],
|
||||||
|
[case "$host_cpu" in
|
||||||
|
i*86)
|
||||||
|
machine_name="i686";;
|
||||||
|
amd64)
|
||||||
|
machine_name="x86_64";;
|
||||||
|
armv6|armv7)
|
||||||
|
machine_name="${host_cpu}l";;
|
||||||
|
*)
|
||||||
|
machine_name="$host_cpu";;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case "$host_os" in
|
||||||
|
linux-gnu*|linux-musl*)
|
||||||
|
# For backward compatibility, strip the `-gnu' part.
|
||||||
|
system="$machine_name-linux";;
|
||||||
|
*)
|
||||||
|
# Strip the version number from names such as `gnu0.3',
|
||||||
|
# `darwin10.2.0', etc.
|
||||||
|
system="$machine_name-`echo $host_os | "$SED" -e's/@<:@0-9.@:>@*$//g'`";;
|
||||||
|
esac])
|
||||||
|
|
||||||
|
AC_MSG_RESULT($system)
|
||||||
|
AC_SUBST(system)
|
||||||
|
AC_DEFINE_UNQUOTED(SYSTEM, ["$system"], [platform identifier ('cpu-os')])
|
||||||
|
|
||||||
|
|
||||||
|
# State should be stored in /nix/var, unless the user overrides it explicitly.
|
||||||
|
test "$localstatedir" = '${prefix}/var' && localstatedir=/nix/var
|
||||||
|
|
||||||
|
# Assign a default value to C{,XX}FLAGS as the default configure script sets them
|
||||||
|
# to -O2 otherwise, which we don't want to have hardcoded
|
||||||
|
CFLAGS=${CFLAGS-""}
|
||||||
|
CXXFLAGS=${CXXFLAGS-""}
|
||||||
|
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_CXX
|
||||||
|
AC_PROG_CPP
|
||||||
|
|
||||||
|
AC_CHECK_TOOL([AR], [ar])
|
||||||
|
|
||||||
|
# Use 64-bit file system calls so that we can support files > 2 GiB.
|
||||||
|
AC_SYS_LARGEFILE
|
||||||
|
|
||||||
|
|
||||||
|
# Solaris-specific stuff.
|
||||||
|
AC_STRUCT_DIRENT_D_TYPE
|
||||||
|
case "$host_os" in
|
||||||
|
solaris*)
|
||||||
|
# Solaris requires -lsocket -lnsl for network functions
|
||||||
|
LDFLAGS="-lsocket -lnsl $LDFLAGS"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
ENSURE_NO_GCC_BUG_80431
|
||||||
|
|
||||||
|
|
||||||
|
# Check for pubsetbuf.
|
||||||
|
AC_MSG_CHECKING([for pubsetbuf])
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
static char buf[1024];]],
|
||||||
|
[[cerr.rdbuf()->pubsetbuf(buf, sizeof(buf));]])],
|
||||||
|
[AC_MSG_RESULT(yes) AC_DEFINE(HAVE_PUBSETBUF, 1, [Whether pubsetbuf is available.])],
|
||||||
|
AC_MSG_RESULT(no))
|
||||||
|
AC_LANG_POP(C++)
|
||||||
|
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS([statvfs pipe2])
|
||||||
|
|
||||||
|
|
||||||
|
# Check for lutimes, optionally used for changing the mtime of
|
||||||
|
# symlinks.
|
||||||
|
AC_CHECK_FUNCS([lutimes])
|
||||||
|
|
||||||
|
|
||||||
|
# Check whether the store optimiser can optimise symlinks.
|
||||||
|
AC_MSG_CHECKING([whether it is possible to create a link to a symlink])
|
||||||
|
ln -s bla tmp_link
|
||||||
|
if ln tmp_link tmp_link2 2> /dev/null; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(CAN_LINK_SYMLINK, 1, [Whether link() works on symlinks.])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
rm -f tmp_link tmp_link2
|
||||||
|
|
||||||
|
|
||||||
|
# Check for <locale>.
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
AC_CHECK_HEADERS([locale])
|
||||||
|
AC_LANG_POP(C++)
|
||||||
|
|
||||||
|
|
||||||
|
AC_DEFUN([NEED_PROG],
|
||||||
|
[
|
||||||
|
AC_PATH_PROG($1, $2)
|
||||||
|
if test -z "$$1"; then
|
||||||
|
AC_MSG_ERROR([$2 is required])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
NEED_PROG(bash, bash)
|
||||||
|
AC_PATH_PROG(flex, flex, false)
|
||||||
|
AC_PATH_PROG(bison, bison, false)
|
||||||
|
AC_PATH_PROG(dot, dot)
|
||||||
|
AC_PATH_PROG(lsof, lsof, lsof)
|
||||||
|
NEED_PROG(jq, jq)
|
||||||
|
|
||||||
|
|
||||||
|
AC_SUBST(coreutils, [$(dirname $(type -p cat))])
|
||||||
|
|
||||||
|
|
||||||
|
AC_ARG_WITH(store-dir, AS_HELP_STRING([--with-store-dir=PATH],[path of the Nix store (defaults to /nix/store)]),
|
||||||
|
storedir=$withval, storedir='/nix/store')
|
||||||
|
AC_SUBST(storedir)
|
||||||
|
|
||||||
|
|
||||||
|
# Look for boost, a required dependency.
|
||||||
|
# Note that AX_BOOST_BASE only exports *CPP* BOOST_CPPFLAGS, no CXX flags,
|
||||||
|
# and CPPFLAGS are not passed to the C++ compiler automatically.
|
||||||
|
# Thus we append the returned CPPFLAGS to the CXXFLAGS here.
|
||||||
|
AX_BOOST_BASE([1.66], [CXXFLAGS="$BOOST_CPPFLAGS $CXXFLAGS"], [AC_MSG_ERROR([Nix requires boost.])])
|
||||||
|
# For unknown reasons, setting this directly in the ACTION-IF-FOUND above
|
||||||
|
# ends up with LDFLAGS being empty, so we set it afterwards.
|
||||||
|
LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"
|
||||||
|
|
||||||
|
# On some platforms, new-style atomics need a helper library
|
||||||
|
AC_MSG_CHECKING(whether -latomic is needed)
|
||||||
|
AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
||||||
|
#include <stdint.h>
|
||||||
|
uint64_t v;
|
||||||
|
int main() {
|
||||||
|
return (int)__atomic_load_n(&v, __ATOMIC_ACQUIRE);
|
||||||
|
}]])], GCC_ATOMIC_BUILTINS_NEED_LIBATOMIC=no, GCC_ATOMIC_BUILTINS_NEED_LIBATOMIC=yes)
|
||||||
|
AC_MSG_RESULT($GCC_ATOMIC_BUILTINS_NEED_LIBATOMIC)
|
||||||
|
if test "x$GCC_ATOMIC_BUILTINS_NEED_LIBATOMIC" = xyes; then
|
||||||
|
LDFLAGS="-latomic $LDFLAGS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Running the functional tests without building Nix is useful for testing
|
||||||
|
# different pre-built versions of Nix against each other.
|
||||||
|
AC_ARG_ENABLE(build, AS_HELP_STRING([--disable-build],[Do not build nix]),
|
||||||
|
ENABLE_BUILD=$enableval, ENABLE_BUILD=yes)
|
||||||
|
AC_SUBST(ENABLE_BUILD)
|
||||||
|
# Building without tests is useful for bootstrapping with a smaller footprint
|
||||||
|
# or running the tests in a separate derivation. Otherwise, we do compile and
|
||||||
|
# run them.
|
||||||
|
AC_ARG_ENABLE(tests, AS_HELP_STRING([--disable-tests],[Do not build the tests]),
|
||||||
|
ENABLE_TESTS=$enableval, ENABLE_TESTS=yes)
|
||||||
|
AC_SUBST(ENABLE_TESTS)
|
||||||
|
|
||||||
|
# Building without API docs is the default as Nix' C++ interfaces are internal and unstable.
|
||||||
|
AC_ARG_ENABLE(internal_api_docs, AS_HELP_STRING([--enable-internal-api-docs],[Build API docs for Nix's internal unstable C++ interfaces]),
|
||||||
|
internal_api_docs=$enableval, internal_api_docs=no)
|
||||||
|
AC_SUBST(internal_api_docs)
|
||||||
|
|
||||||
|
# LTO is currently broken with clang for unknown reasons; ld segfaults in the llvm plugin
|
||||||
|
AC_ARG_ENABLE(lto, AS_HELP_STRING([--enable-lto],[Enable LTO (only supported with GCC) [default=no]]),
|
||||||
|
lto=$enableval, lto=no)
|
||||||
|
if test "$lto" = yes; then
|
||||||
|
if $CXX --version | grep -q GCC; then
|
||||||
|
AC_SUBST(CXXLTO, [-flto=jobserver])
|
||||||
|
else
|
||||||
|
echo "error: LTO is only supported with GCC at the moment" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
AC_SUBST(CXXLTO, [""])
|
||||||
|
fi
|
||||||
|
|
||||||
|
PKG_PROG_PKG_CONFIG
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(shared, AS_HELP_STRING([--enable-shared],[Build shared libraries for Nix [default=yes]]),
|
||||||
|
shared=$enableval, shared=yes)
|
||||||
|
if test "$shared" = yes; then
|
||||||
|
AC_SUBST(BUILD_SHARED_LIBS, 1, [Whether to build shared libraries.])
|
||||||
|
else
|
||||||
|
AC_SUBST(BUILD_SHARED_LIBS, 0, [Whether to build shared libraries.])
|
||||||
|
PKG_CONFIG="$PKG_CONFIG --static"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Look for OpenSSL, a required dependency. FIXME: this is only (maybe)
|
||||||
|
# used by S3BinaryCacheStore.
|
||||||
|
PKG_CHECK_MODULES([OPENSSL], [libcrypto >= 1.1.1], [CXXFLAGS="$OPENSSL_CFLAGS $CXXFLAGS"])
|
||||||
|
|
||||||
|
|
||||||
|
# Look for libarchive.
|
||||||
|
PKG_CHECK_MODULES([LIBARCHIVE], [libarchive >= 3.1.2], [CXXFLAGS="$LIBARCHIVE_CFLAGS $CXXFLAGS"])
|
||||||
|
# Workaround until https://github.com/libarchive/libarchive/issues/1446 is fixed
|
||||||
|
if test "$shared" != yes; then
|
||||||
|
LIBARCHIVE_LIBS+=' -lz'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Look for SQLite, a required dependency.
|
||||||
|
PKG_CHECK_MODULES([SQLITE3], [sqlite3 >= 3.6.19], [CXXFLAGS="$SQLITE3_CFLAGS $CXXFLAGS"])
|
||||||
|
|
||||||
|
# Look for libcurl, a required dependency.
|
||||||
|
PKG_CHECK_MODULES([LIBCURL], [libcurl], [CXXFLAGS="$LIBCURL_CFLAGS $CXXFLAGS"])
|
||||||
|
|
||||||
|
# Look for editline, a required dependency.
|
||||||
|
# The the libeditline.pc file was added only in libeditline >= 1.15.2,
|
||||||
|
# see https://github.com/troglobit/editline/commit/0a8f2ef4203c3a4a4726b9dd1336869cd0da8607,
|
||||||
|
# but e.g. Ubuntu 16.04 has an older version, so we fall back to searching for
|
||||||
|
# editline.h when the pkg-config approach fails.
|
||||||
|
PKG_CHECK_MODULES([EDITLINE], [libeditline], [CXXFLAGS="$EDITLINE_CFLAGS $CXXFLAGS"], [
|
||||||
|
AC_CHECK_HEADERS([editline.h], [true],
|
||||||
|
[AC_MSG_ERROR([Nix requires libeditline; it was found neither via pkg-config nor its normal header.])])
|
||||||
|
AC_SEARCH_LIBS([readline read_history], [editline], [],
|
||||||
|
[AC_MSG_ERROR([Nix requires libeditline; it was not found via pkg-config, but via its header, but required functions do not work. Maybe it is too old? >= 1.14 is required.])])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Look for libsodium.
|
||||||
|
PKG_CHECK_MODULES([SODIUM], [libsodium], [CXXFLAGS="$SODIUM_CFLAGS $CXXFLAGS"])
|
||||||
|
|
||||||
|
# Look for libbrotli{enc,dec}.
|
||||||
|
PKG_CHECK_MODULES([LIBBROTLI], [libbrotlienc libbrotlidec], [CXXFLAGS="$LIBBROTLI_CFLAGS $CXXFLAGS"])
|
||||||
|
|
||||||
|
# Look for libcpuid.
|
||||||
|
have_libcpuid=
|
||||||
|
if test "$machine_name" = "x86_64"; then
|
||||||
|
AC_ARG_ENABLE([cpuid],
|
||||||
|
AS_HELP_STRING([--disable-cpuid], [Do not determine microarchitecture levels with libcpuid (relevant to x86_64 only)]))
|
||||||
|
if test "x$enable_cpuid" != "xno"; then
|
||||||
|
PKG_CHECK_MODULES([LIBCPUID], [libcpuid],
|
||||||
|
[CXXFLAGS="$LIBCPUID_CFLAGS $CXXFLAGS"
|
||||||
|
have_libcpuid=1
|
||||||
|
AC_DEFINE([HAVE_LIBCPUID], [1], [Use libcpuid])]
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_SUBST(HAVE_LIBCPUID, [$have_libcpuid])
|
||||||
|
|
||||||
|
|
||||||
|
# Look for libseccomp, required for Linux sandboxing.
|
||||||
|
case "$host_os" in
|
||||||
|
linux*)
|
||||||
|
AC_ARG_ENABLE([seccomp-sandboxing],
|
||||||
|
AS_HELP_STRING([--disable-seccomp-sandboxing],[Don't build support for seccomp sandboxing (only recommended if your arch doesn't support libseccomp yet!)
|
||||||
|
]))
|
||||||
|
if test "x$enable_seccomp_sandboxing" != "xno"; then
|
||||||
|
PKG_CHECK_MODULES([LIBSECCOMP], [libseccomp],
|
||||||
|
[CXXFLAGS="$LIBSECCOMP_CFLAGS $CXXFLAGS"])
|
||||||
|
have_seccomp=1
|
||||||
|
AC_DEFINE([HAVE_SECCOMP], [1], [Whether seccomp is available and should be used for sandboxing.])
|
||||||
|
else
|
||||||
|
have_seccomp=
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
have_seccomp=
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
AC_SUBST(HAVE_SECCOMP, [$have_seccomp])
|
||||||
|
|
||||||
|
|
||||||
|
# Look for aws-cpp-sdk-s3.
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
AC_CHECK_HEADERS([aws/s3/S3Client.h],
|
||||||
|
[AC_DEFINE([ENABLE_S3], [1], [Whether to enable S3 support via aws-sdk-cpp.]) enable_s3=1],
|
||||||
|
[AC_DEFINE([ENABLE_S3], [0], [Whether to enable S3 support via aws-sdk-cpp.]) enable_s3=])
|
||||||
|
AC_SUBST(ENABLE_S3, [$enable_s3])
|
||||||
|
AC_LANG_POP(C++)
|
||||||
|
|
||||||
|
if test -n "$enable_s3"; then
|
||||||
|
declare -a aws_version_tokens=($(printf '#include <aws/core/VersionConfig.h>\nAWS_SDK_VERSION_STRING' | $CPP $CPPFLAGS - | grep -v '^#.*' | sed 's/"//g' | tr '.' ' '))
|
||||||
|
AC_DEFINE_UNQUOTED([AWS_VERSION_MAJOR], ${aws_version_tokens@<:@0@:>@}, [Major version of aws-sdk-cpp.])
|
||||||
|
AC_DEFINE_UNQUOTED([AWS_VERSION_MINOR], ${aws_version_tokens@<:@1@:>@}, [Minor version of aws-sdk-cpp.])
|
||||||
|
AC_DEFINE_UNQUOTED([AWS_VERSION_PATCH], ${aws_version_tokens@<:@2@:>@}, [Patch version of aws-sdk-cpp.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Whether to use the Boehm garbage collector.
|
||||||
|
AC_ARG_ENABLE(gc, AS_HELP_STRING([--enable-gc],[enable garbage collection in the Nix expression evaluator (requires Boehm GC) [default=yes]]),
|
||||||
|
gc=$enableval, gc=yes)
|
||||||
|
if test "$gc" = yes; then
|
||||||
|
PKG_CHECK_MODULES([BDW_GC], [bdw-gc])
|
||||||
|
CXXFLAGS="$BDW_GC_CFLAGS $CXXFLAGS"
|
||||||
|
AC_DEFINE(HAVE_BOEHMGC, 1, [Whether to use the Boehm garbage collector.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test "$ENABLE_TESTS" = yes; then
|
||||||
|
|
||||||
|
# Look for gtest.
|
||||||
|
PKG_CHECK_MODULES([GTEST], [gtest_main gmock_main])
|
||||||
|
|
||||||
|
|
||||||
|
# Look for rapidcheck.
|
||||||
|
AC_ARG_VAR([RAPIDCHECK_HEADERS], [include path of gtest headers shipped by RAPIDCHECK])
|
||||||
|
# No pkg-config yet, https://github.com/emil-e/rapidcheck/issues/302
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
AC_SUBST(RAPIDCHECK_HEADERS)
|
||||||
|
[CXXFLAGS="-I $RAPIDCHECK_HEADERS $CXXFLAGS"]
|
||||||
|
[LIBS="-lrapidcheck -lgtest $LIBS"]
|
||||||
|
AC_CHECK_HEADERS([rapidcheck/gtest.h], [], [], [#include <gtest/gtest.h>])
|
||||||
|
dnl AC_CHECK_LIB doesn't work for C++ libs with mangled symbols
|
||||||
|
AC_LINK_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([[
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <rapidcheck/gtest.h>
|
||||||
|
]], [[
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
]])
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[AC_MSG_ERROR([librapidcheck is not found.])])
|
||||||
|
AC_LANG_POP(C++)
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Look for nlohmann/json.
|
||||||
|
PKG_CHECK_MODULES([NLOHMANN_JSON], [nlohmann_json >= 3.9])
|
||||||
|
|
||||||
|
|
||||||
|
# documentation generation switch
|
||||||
|
AC_ARG_ENABLE(doc-gen, AS_HELP_STRING([--disable-doc-gen],[disable documentation generation]),
|
||||||
|
doc_generate=$enableval, doc_generate=yes)
|
||||||
|
AC_SUBST(doc_generate)
|
||||||
|
|
||||||
|
# Look for lowdown library.
|
||||||
|
PKG_CHECK_MODULES([LOWDOWN], [lowdown >= 0.9.0], [CXXFLAGS="$LOWDOWN_CFLAGS $CXXFLAGS"])
|
||||||
|
|
||||||
|
# Look for toml11, a required dependency.
|
||||||
|
AC_ARG_VAR([TOML11_HEADERS], [include path of toml11 headers])
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
[CXXFLAGS="-I $TOML11_HEADERS $CXXFLAGS"]
|
||||||
|
AC_CHECK_HEADER([toml.hpp], [], [AC_MSG_ERROR([toml11 is not found.])])
|
||||||
|
AC_LANG_POP(C++)
|
||||||
|
|
||||||
|
# Setuid installations.
|
||||||
|
AC_CHECK_FUNCS([setresuid setreuid lchown])
|
||||||
|
|
||||||
|
|
||||||
|
# Nice to have, but not essential.
|
||||||
|
AC_CHECK_FUNCS([strsignal posix_fallocate sysconf])
|
||||||
|
|
||||||
|
|
||||||
|
AC_ARG_WITH(sandbox-shell, AS_HELP_STRING([--with-sandbox-shell=PATH],[path of a statically-linked shell to use as /bin/sh in sandboxes]),
|
||||||
|
sandbox_shell=$withval)
|
||||||
|
AC_SUBST(sandbox_shell)
|
||||||
|
if test ${cross_compiling:-no} = no && ! test -z ${sandbox_shell+x}; then
|
||||||
|
AC_MSG_CHECKING([whether sandbox-shell has the standalone feature])
|
||||||
|
# busybox shell sometimes allows executing other busybox applets,
|
||||||
|
# even if they are not in the path, breaking our sandbox
|
||||||
|
if PATH= $sandbox_shell -c "busybox" 2>&1 | grep -qv "not found"; then
|
||||||
|
AC_MSG_RESULT(enabled)
|
||||||
|
AC_MSG_ERROR([Please disable busybox FEATURE_SH_STANDALONE])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(disabled)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(embedded-sandbox-shell, AS_HELP_STRING([--enable-embedded-sandbox-shell],[include the sandbox shell in the Nix binary [default=no]]),
|
||||||
|
embedded_sandbox_shell=$enableval, embedded_sandbox_shell=no)
|
||||||
|
AC_SUBST(embedded_sandbox_shell)
|
||||||
|
if test "$embedded_sandbox_shell" = yes; then
|
||||||
|
AC_DEFINE(HAVE_EMBEDDED_SANDBOX_SHELL, 1, [Include the sandbox shell in the Nix binary.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Expand all variables in config.status.
|
||||||
|
test "$prefix" = NONE && prefix=$ac_default_prefix
|
||||||
|
test "$exec_prefix" = NONE && exec_prefix='${prefix}'
|
||||||
|
for name in $ac_subst_vars; do
|
||||||
|
declare $name="$(eval echo "${!name}")"
|
||||||
|
declare $name="$(eval echo "${!name}")"
|
||||||
|
declare $name="$(eval echo "${!name}")"
|
||||||
|
done
|
||||||
|
|
||||||
|
rm -f Makefile.config
|
||||||
|
|
||||||
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
AC_CONFIG_FILES([])
|
||||||
|
AC_OUTPUT
|
19
default.nix
19
default.nix
|
@ -1,9 +1,10 @@
|
||||||
(import (
|
(import
|
||||||
let
|
(
|
||||||
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
|
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in
|
||||||
in
|
fetchTarball {
|
||||||
fetchTarball {
|
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
|
||||||
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
|
sha256 = lock.nodes.flake-compat.locked.narHash;
|
||||||
sha256 = lock.nodes.flake-compat.locked.narHash;
|
}
|
||||||
}
|
)
|
||||||
) { src = ./.; }).defaultNix
|
{ src = ./.; }
|
||||||
|
).defaultNix
|
||||||
|
|
|
@ -14,8 +14,6 @@ PROJECT_NAME = "Nix"
|
||||||
|
|
||||||
PROJECT_NUMBER = @PACKAGE_VERSION@
|
PROJECT_NUMBER = @PACKAGE_VERSION@
|
||||||
|
|
||||||
OUTPUT_DIRECTORY = @docdir@
|
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
# quick idea about the purpose of the project. Keep the description short.
|
# quick idea about the purpose of the project. Keep the description short.
|
||||||
|
|
19
doc/internal-api/local.mk
Normal file
19
doc/internal-api/local.mk
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
.PHONY: internal-api-html
|
||||||
|
|
||||||
|
ifeq ($(internal_api_docs), yes)
|
||||||
|
|
||||||
|
$(docdir)/internal-api/html/index.html $(docdir)/internal-api/latex: $(d)/doxygen.cfg
|
||||||
|
mkdir -p $(docdir)/internal-api
|
||||||
|
{ cat $< ; echo "OUTPUT_DIRECTORY=$(docdir)/internal-api" ; } | doxygen -
|
||||||
|
|
||||||
|
# Generate the HTML API docs for Nix's unstable internal interfaces.
|
||||||
|
internal-api-html: $(docdir)/internal-api/html/index.html
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
# Make a nicer error message
|
||||||
|
internal-api-html:
|
||||||
|
@echo "Internal API docs are disabled. Configure with '--enable-internal-api-docs', or avoid calling 'make internal-api-html'."
|
||||||
|
@exit 1
|
||||||
|
|
||||||
|
endif
|
|
@ -1,33 +0,0 @@
|
||||||
doxygen_cfg = configure_file(
|
|
||||||
input : 'doxygen.cfg.in',
|
|
||||||
output : 'doxygen.cfg',
|
|
||||||
configuration : {
|
|
||||||
'PACKAGE_VERSION': meson.project_version(),
|
|
||||||
'RAPIDCHECK_HEADERS': rapidcheck_meson.get_variable('includedir'),
|
|
||||||
'docdir' : meson.current_build_dir(),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
internal_api_docs = custom_target(
|
|
||||||
'internal-api-docs',
|
|
||||||
command : [
|
|
||||||
bash,
|
|
||||||
# Meson can you please just give us a `workdir` argument to custom targets...
|
|
||||||
'-c',
|
|
||||||
# We have to prefix the doxygen_cfg path with the project build root
|
|
||||||
# because of the cd in front.
|
|
||||||
'cd @0@ && @1@ @2@/@INPUT0@'.format(
|
|
||||||
meson.project_source_root(),
|
|
||||||
doxygen.full_path(),
|
|
||||||
meson.project_build_root(),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
input : [
|
|
||||||
doxygen_cfg,
|
|
||||||
],
|
|
||||||
output : 'html',
|
|
||||||
install : true,
|
|
||||||
install_dir : datadir / 'doc/nix/internal-api',
|
|
||||||
)
|
|
||||||
|
|
||||||
alias_target('internal-api-html', internal_api_docs)
|
|
0
doc/manual/anchors.jq
Normal file → Executable file
0
doc/manual/anchors.jq
Normal file → Executable file
|
@ -1,33 +1,16 @@
|
||||||
[book]
|
[book]
|
||||||
title = "Lix Reference Manual"
|
title = "Nix Reference Manual"
|
||||||
|
|
||||||
[build]
|
|
||||||
create-missing = false
|
|
||||||
|
|
||||||
[output.html]
|
[output.html]
|
||||||
additional-css = ["custom.css"]
|
additional-css = ["custom.css"]
|
||||||
additional-js = ["redirects.js"]
|
additional-js = ["redirects.js"]
|
||||||
# Using our GitHub mirror enables easier typo fixes since there is no easy way
|
edit-url-template = "https://github.com/NixOS/nix/tree/master/doc/manual/{path}"
|
||||||
# to just submit a Gerrit CL by the web for trivial stuff.
|
git-repository-url = "https://github.com/NixOS/nix"
|
||||||
edit-url-template = "https://github.com/lix-project/lix/tree/main/doc/manual/{path}"
|
|
||||||
git-repository-url = "https://git.lix.systems/lix-project/lix"
|
|
||||||
|
|
||||||
# Handles replacing @docroot@ with a path to ./src relative to that markdown file,
|
|
||||||
# {{#include handlebars}}, and the @generated@ syntax used within these. it mostly
|
|
||||||
# but not entirely replaces the links preprocessor (which we cannot simply use due
|
|
||||||
# to @generated@ files living in a different directory to make meson happy). we do
|
|
||||||
# not want to disable the links preprocessor entirely though because that requires
|
|
||||||
# disabling *all* built-in preprocessors and selectively reenabling those we want.
|
|
||||||
[preprocessor.substitute]
|
|
||||||
command = "python3 doc/manual/substitute.py"
|
|
||||||
before = ["anchors", "links"]
|
|
||||||
|
|
||||||
[preprocessor.anchors]
|
[preprocessor.anchors]
|
||||||
renderers = ["html"]
|
renderers = ["html"]
|
||||||
command = "jq --from-file doc/manual/anchors.jq"
|
command = "jq --from-file doc/manual/anchors.jq"
|
||||||
|
|
||||||
[output.markdown]
|
|
||||||
|
|
||||||
[output.linkcheck]
|
[output.linkcheck]
|
||||||
# no Internet during the build (in the sandbox)
|
# no Internet during the build (in the sandbox)
|
||||||
follow-web-links = false
|
follow-web-links = false
|
||||||
|
|
|
@ -5,13 +5,7 @@ in
|
||||||
|
|
||||||
builtinsInfo:
|
builtinsInfo:
|
||||||
let
|
let
|
||||||
showBuiltin =
|
showBuiltin = name: { doc, type, impure-only }:
|
||||||
name:
|
|
||||||
{
|
|
||||||
doc,
|
|
||||||
type,
|
|
||||||
impure-only,
|
|
||||||
}:
|
|
||||||
let
|
let
|
||||||
type' = optionalString (type != null) " (${type})";
|
type' = optionalString (type != null) " (${type})";
|
||||||
|
|
||||||
|
|
|
@ -5,14 +5,7 @@ in
|
||||||
|
|
||||||
builtinsInfo:
|
builtinsInfo:
|
||||||
let
|
let
|
||||||
showBuiltin =
|
showBuiltin = name: { doc, args, arity, experimental-feature }:
|
||||||
name:
|
|
||||||
{
|
|
||||||
doc,
|
|
||||||
args,
|
|
||||||
arity,
|
|
||||||
experimental-feature,
|
|
||||||
}:
|
|
||||||
let
|
let
|
||||||
experimentalNotice = optionalString (experimental-feature != null) ''
|
experimentalNotice = optionalString (experimental-feature != null) ''
|
||||||
This function is only available if the [${experimental-feature}](@docroot@/contributing/experimental-features.md#xp-feature-${experimental-feature}) experimental feature is enabled.
|
This function is only available if the [${experimental-feature}](@docroot@/contributing/experimental-features.md#xp-feature-${experimental-feature}) experimental feature is enabled.
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import glob
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# meson expects makefile-style dependency declarations, i.e.
|
|
||||||
#
|
|
||||||
# target: dependency...
|
|
||||||
#
|
|
||||||
# meson seems to pass depfiles straight on to ninja even though
|
|
||||||
# it also parses the file itself (or at least has code to do so
|
|
||||||
# in its tree), so we must live by ninja's rules: only slashes,
|
|
||||||
# spaces and octothorpes can be escaped, anything else is taken
|
|
||||||
# literally. since the rules for these aren't even the same for
|
|
||||||
# all three we will just fail when we encounter any of them (if
|
|
||||||
# asserts are off for some reason the depfile will likely point
|
|
||||||
# to nonexistant paths, making everything phony and thus fine.)
|
|
||||||
for path in glob.glob(sys.argv[1] + '/**', recursive=True):
|
|
||||||
assert '\\' not in path
|
|
||||||
assert ' ' not in path
|
|
||||||
assert '#' not in path
|
|
||||||
print("ignored:", path)
|
|
|
@ -1,26 +1,8 @@
|
||||||
let
|
let
|
||||||
inherit (builtins)
|
inherit (builtins)
|
||||||
attrNames
|
attrNames attrValues fromJSON listToAttrs mapAttrs
|
||||||
attrValues
|
concatStringsSep concatMap length lessThan replaceStrings sort;
|
||||||
fromJSON
|
inherit (import ./utils.nix) concatStrings optionalString filterAttrs trim squash unique showSettings;
|
||||||
listToAttrs
|
|
||||||
mapAttrs
|
|
||||||
concatStringsSep
|
|
||||||
concatMap
|
|
||||||
length
|
|
||||||
lessThan
|
|
||||||
replaceStrings
|
|
||||||
sort
|
|
||||||
;
|
|
||||||
inherit (import ./utils.nix)
|
|
||||||
concatStrings
|
|
||||||
optionalString
|
|
||||||
filterAttrs
|
|
||||||
trim
|
|
||||||
squash
|
|
||||||
unique
|
|
||||||
showSettings
|
|
||||||
;
|
|
||||||
in
|
in
|
||||||
|
|
||||||
inlineHTML: commandDump:
|
inlineHTML: commandDump:
|
||||||
|
@ -29,13 +11,7 @@ let
|
||||||
|
|
||||||
commandInfo = fromJSON commandDump;
|
commandInfo = fromJSON commandDump;
|
||||||
|
|
||||||
showCommand =
|
showCommand = { command, details, filename, toplevel }:
|
||||||
{
|
|
||||||
command,
|
|
||||||
details,
|
|
||||||
filename,
|
|
||||||
toplevel,
|
|
||||||
}:
|
|
||||||
let
|
let
|
||||||
|
|
||||||
result = ''
|
result = ''
|
||||||
|
@ -59,27 +35,26 @@ let
|
||||||
${maybeOptions}
|
${maybeOptions}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
showSynopsis =
|
showSynopsis = command: args:
|
||||||
command: args:
|
|
||||||
let
|
let
|
||||||
showArgument = arg: "*${arg.label}*" + optionalString (!arg ? arity) "...";
|
showArgument = arg: "*${arg.label}*" + optionalString (! arg ? arity) "...";
|
||||||
arguments = concatStringsSep " " (map showArgument args);
|
arguments = concatStringsSep " " (map showArgument args);
|
||||||
in
|
in ''
|
||||||
''
|
`${command}` [*option*...] ${arguments}
|
||||||
`${command}` [*option*...] ${arguments}
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
maybeSubcommands = optionalString (details ? commands && details.commands != { }) ''
|
maybeSubcommands = optionalString (details ? commands && details.commands != {})
|
||||||
where *subcommand* is one of the following:
|
''
|
||||||
|
where *subcommand* is one of the following:
|
||||||
|
|
||||||
${subcommands}
|
${subcommands}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
subcommands = if length categories > 1 then listCategories else listSubcommands details.commands;
|
subcommands = if length categories > 1
|
||||||
|
then listCategories
|
||||||
|
else listSubcommands details.commands;
|
||||||
|
|
||||||
categories = sort (x: y: x.id < y.id) (
|
categories = sort (x: y: x.id < y.id) (unique (map (cmd: cmd.category) (attrValues details.commands)));
|
||||||
unique (map (cmd: cmd.category) (attrValues details.commands))
|
|
||||||
);
|
|
||||||
|
|
||||||
listCategories = concatStrings (map showCategory categories);
|
listCategories = concatStrings (map showCategory categories);
|
||||||
|
|
||||||
|
@ -96,11 +71,11 @@ let
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# TODO: move this confusing special case out of here when implementing #8496
|
# TODO: move this confusing special case out of here when implementing #8496
|
||||||
maybeStoreDocs = optionalString (details ? doc) (
|
maybeStoreDocs = optionalString
|
||||||
replaceStrings [ "@stores@" ] [ storeDocs ] details.doc
|
(details ? doc)
|
||||||
);
|
(replaceStrings ["@stores@"] [storeDocs] details.doc);
|
||||||
|
|
||||||
maybeOptions = optionalString (details.flags != { }) ''
|
maybeOptions = optionalString (details.flags != {}) ''
|
||||||
# Options
|
# Options
|
||||||
|
|
||||||
${showOptions details.flags toplevel.flags}
|
${showOptions details.flags toplevel.flags}
|
||||||
|
@ -110,70 +85,51 @@ let
|
||||||
> See [`man nix.conf`](@docroot@/command-ref/conf-file.md#command-line-flags) for overriding configuration settings with command line flags.
|
> See [`man nix.conf`](@docroot@/command-ref/conf-file.md#command-line-flags) for overriding configuration settings with command line flags.
|
||||||
'';
|
'';
|
||||||
|
|
||||||
showOptions =
|
showOptions = options: commonOptions:
|
||||||
options: commonOptions:
|
|
||||||
let
|
let
|
||||||
allOptions = options // commonOptions;
|
allOptions = options // commonOptions;
|
||||||
showCategory = cat: ''
|
showCategory = cat: ''
|
||||||
${optionalString (cat != "") "**${cat}:**"}
|
${optionalString (cat != "") "**${cat}:**"}
|
||||||
|
|
||||||
${listOptions (filterAttrs (n: v: v.category == cat) allOptions)}
|
${listOptions (filterAttrs (n: v: v.category == cat) allOptions)}
|
||||||
'';
|
'';
|
||||||
listOptions = opts: concatStringsSep "\n" (attrValues (mapAttrs showOption opts));
|
listOptions = opts: concatStringsSep "\n" (attrValues (mapAttrs showOption opts));
|
||||||
showOption =
|
showOption = name: option:
|
||||||
name: option:
|
|
||||||
let
|
let
|
||||||
result = trim ''
|
result = trim ''
|
||||||
- ${item}
|
- ${item}
|
||||||
${option.description}
|
${option.description}
|
||||||
'';
|
'';
|
||||||
item =
|
item = if inlineHTML
|
||||||
if inlineHTML then
|
then ''<span id="opt-${name}">[`--${name}`](#opt-${name})</span> ${shortName} ${labels}''
|
||||||
''<span id="opt-${name}">[`--${name}`](#opt-${name})</span> ${shortName} ${labels}''
|
else "`--${name}` ${shortName} ${labels}";
|
||||||
else
|
shortName = optionalString
|
||||||
"`--${name}` ${shortName} ${labels}";
|
(option ? shortName)
|
||||||
shortName = optionalString (option ? shortName) ("/ `-${option.shortName}`");
|
("/ `-${option.shortName}`");
|
||||||
labels = optionalString (option ? labels) (concatStringsSep " " (map (s: "*${s}*") option.labels));
|
labels = optionalString
|
||||||
in
|
(option ? labels)
|
||||||
result;
|
(concatStringsSep " " (map (s: "*${s}*") option.labels));
|
||||||
|
in result;
|
||||||
categories = sort lessThan (unique (map (cmd: cmd.category) (attrValues allOptions)));
|
categories = sort lessThan (unique (map (cmd: cmd.category) (attrValues allOptions)));
|
||||||
in
|
in concatStrings (map showCategory categories);
|
||||||
concatStrings (map showCategory categories);
|
in squash result;
|
||||||
in
|
|
||||||
squash result;
|
|
||||||
|
|
||||||
appendName = filename: name: (if filename == "nix" then "nix3" else filename) + "-" + name;
|
appendName = filename: name: (if filename == "nix" then "nix3" else filename) + "-" + name;
|
||||||
|
|
||||||
processCommand =
|
processCommand = { command, details, filename, toplevel }:
|
||||||
{
|
|
||||||
command,
|
|
||||||
details,
|
|
||||||
filename,
|
|
||||||
toplevel,
|
|
||||||
}:
|
|
||||||
let
|
let
|
||||||
cmd = {
|
cmd = {
|
||||||
inherit command;
|
inherit command;
|
||||||
name = filename + ".md";
|
name = filename + ".md";
|
||||||
value = showCommand {
|
value = showCommand { inherit command details filename toplevel; };
|
||||||
inherit
|
|
||||||
command
|
|
||||||
details
|
|
||||||
filename
|
|
||||||
toplevel
|
|
||||||
;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
subcommand =
|
subcommand = subCmd: processCommand {
|
||||||
subCmd:
|
command = command + " " + subCmd;
|
||||||
processCommand {
|
details = details.commands.${subCmd};
|
||||||
command = command + " " + subCmd;
|
filename = appendName filename subCmd;
|
||||||
details = details.commands.${subCmd};
|
inherit toplevel;
|
||||||
filename = appendName filename subCmd;
|
};
|
||||||
inherit toplevel;
|
in [ cmd ] ++ concatMap subcommand (attrNames details.commands or {});
|
||||||
};
|
|
||||||
in
|
|
||||||
[ cmd ] ++ concatMap subcommand (attrNames details.commands or { });
|
|
||||||
|
|
||||||
manpages = processCommand {
|
manpages = processCommand {
|
||||||
command = "nix";
|
command = "nix";
|
||||||
|
@ -182,15 +138,14 @@ let
|
||||||
toplevel = commandInfo.args;
|
toplevel = commandInfo.args;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
tableOfContents = let
|
||||||
|
showEntry = page:
|
||||||
|
" - [${page.command}](command-ref/new-cli/${page.name})";
|
||||||
|
in concatStringsSep "\n" (map showEntry manpages) + "\n";
|
||||||
|
|
||||||
storeDocs =
|
storeDocs =
|
||||||
let
|
let
|
||||||
showStore =
|
showStore = name: { settings, doc, experimentalFeature }:
|
||||||
name:
|
|
||||||
{
|
|
||||||
settings,
|
|
||||||
doc,
|
|
||||||
experimentalFeature,
|
|
||||||
}:
|
|
||||||
let
|
let
|
||||||
experimentalFeatureNote = optionalString (experimentalFeature != null) ''
|
experimentalFeatureNote = optionalString (experimentalFeature != null) ''
|
||||||
> **Warning**
|
> **Warning**
|
||||||
|
@ -206,8 +161,7 @@ let
|
||||||
extra-experimental-features = ${experimentalFeature}
|
extra-experimental-features = ${experimentalFeature}
|
||||||
```
|
```
|
||||||
'';
|
'';
|
||||||
in
|
in ''
|
||||||
''
|
|
||||||
## ${name}
|
## ${name}
|
||||||
|
|
||||||
${doc}
|
${doc}
|
||||||
|
@ -218,7 +172,6 @@ let
|
||||||
|
|
||||||
${showSettings { inherit inlineHTML; } settings}
|
${showSettings { inherit inlineHTML; } settings}
|
||||||
'';
|
'';
|
||||||
in
|
in concatStrings (attrValues (mapAttrs showStore commandInfo.stores));
|
||||||
concatStrings (attrValues (mapAttrs showStore commandInfo.stores));
|
|
||||||
in
|
in (listToAttrs manpages) // { "SUMMARY.md" = tableOfContents; }
|
||||||
listToAttrs manpages
|
|
||||||
|
|
|
@ -2,8 +2,8 @@ with builtins;
|
||||||
with import ./utils.nix;
|
with import ./utils.nix;
|
||||||
|
|
||||||
let
|
let
|
||||||
showExperimentalFeature = name: doc: ''
|
showExperimentalFeature = name: doc:
|
||||||
- [`${name}`](@docroot@/contributing/experimental-features.md#xp-feature-${name})
|
''
|
||||||
'';
|
- [`${name}`](@docroot@/contributing/experimental-features.md#xp-feature-${name})
|
||||||
in
|
'';
|
||||||
xps: indent " " (concatStrings (attrValues (mapAttrs showExperimentalFeature xps)))
|
in xps: indent " " (concatStrings (attrValues (mapAttrs showExperimentalFeature xps)))
|
||||||
|
|
|
@ -2,12 +2,10 @@ with builtins;
|
||||||
with import ./utils.nix;
|
with import ./utils.nix;
|
||||||
|
|
||||||
let
|
let
|
||||||
showExperimentalFeature =
|
showExperimentalFeature = name: doc:
|
||||||
name: doc:
|
|
||||||
squash ''
|
squash ''
|
||||||
## [`${name}`]{#xp-feature-${name}}
|
## [`${name}`]{#xp-feature-${name}}
|
||||||
|
|
||||||
${doc}
|
${doc}
|
||||||
'';
|
'';
|
||||||
in
|
in xps: (concatStringsSep "\n" (attrValues (mapAttrs showExperimentalFeature xps)))
|
||||||
xps: (concatStringsSep "\n" (attrValues (mapAttrs showExperimentalFeature xps)))
|
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
"""
|
|
||||||
This script is a helper for this project's Meson buildsystem, to replace its
|
|
||||||
usage of `nix eval --write-to`. Writing a JSON object as a nested directory
|
|
||||||
tree is more generic, easier to maintain, and far, far less cursed. Nix
|
|
||||||
has 'good' support for JSON output. Let's just use it.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
from pathlib import Path
|
|
||||||
import json
|
|
||||||
import sys
|
|
||||||
|
|
||||||
name = 'json-to-tree.py'
|
|
||||||
|
|
||||||
def log(*args, **kwargs):
|
|
||||||
kwargs['file'] = sys.stderr
|
|
||||||
return print(f'{name}:', *args, **kwargs)
|
|
||||||
|
|
||||||
def write_dict_to_directory(current_directory: Path, data: dict, files_written=0):
|
|
||||||
current_directory.mkdir(parents=True, exist_ok=True)
|
|
||||||
for key, value in data.items():
|
|
||||||
nested_path = current_directory / key
|
|
||||||
match value:
|
|
||||||
case dict(nested_data):
|
|
||||||
files_written += write_dict_to_directory(nested_path, nested_data)
|
|
||||||
|
|
||||||
case str(content):
|
|
||||||
nested_path.write_text(content)
|
|
||||||
files_written += 1
|
|
||||||
|
|
||||||
case rest:
|
|
||||||
assert False, \
|
|
||||||
f'should have been called on a dict or string, not {type(rest)=}\n\t{rest=}'
|
|
||||||
|
|
||||||
return files_written
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser(name)
|
|
||||||
parser.add_argument('-i', '--input', type=argparse.FileType('r'), default='-',
|
|
||||||
help='The JSON input to operate on and output as a directory tree',
|
|
||||||
)
|
|
||||||
parser.add_argument('-o', '--output', type=Path, required=True,
|
|
||||||
help='The place to put the directory tree',
|
|
||||||
)
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
json_string = args.input.read()
|
|
||||||
|
|
||||||
try:
|
|
||||||
data = json.loads(json_string)
|
|
||||||
except json.JSONDecodeError:
|
|
||||||
log(f'could not decode JSON from input: {json_string}')
|
|
||||||
raise
|
|
||||||
|
|
||||||
|
|
||||||
files_written = write_dict_to_directory(args.output, data)
|
|
||||||
log(f'wrote {files_written} files')
|
|
||||||
|
|
||||||
sys.exit(main())
|
|
218
doc/manual/local.mk
Normal file
218
doc/manual/local.mk
Normal file
|
@ -0,0 +1,218 @@
|
||||||
|
ifeq ($(doc_generate),yes)
|
||||||
|
|
||||||
|
# The version of Nix used to generate the doc. Can also be
|
||||||
|
# `$(nix_INSTALL_PATH)` or just `nix` (to grap ambient from the `PATH`),
|
||||||
|
# if one prefers.
|
||||||
|
doc_nix = $(nix_PATH)
|
||||||
|
|
||||||
|
MANUAL_SRCS := \
|
||||||
|
$(call rwildcard, $(d)/src, *.md) \
|
||||||
|
$(call rwildcard, $(d)/src, */*.md)
|
||||||
|
|
||||||
|
man-pages := $(foreach n, \
|
||||||
|
nix-env.1 nix-store.1 \
|
||||||
|
nix-build.1 nix-shell.1 nix-instantiate.1 \
|
||||||
|
nix-collect-garbage.1 \
|
||||||
|
nix-prefetch-url.1 nix-channel.1 \
|
||||||
|
nix-hash.1 nix-copy-closure.1 \
|
||||||
|
nix.conf.5 nix-daemon.8 \
|
||||||
|
nix-profiles.5 \
|
||||||
|
, $(d)/$(n))
|
||||||
|
|
||||||
|
# man pages for subcommands
|
||||||
|
# convert from `$(d)/src/command-ref/nix-{1}/{2}.md` to `$(d)/nix-{1}-{2}.1`
|
||||||
|
# FIXME: unify with how nix3-cli man pages are generated
|
||||||
|
man-pages += $(foreach subcommand, \
|
||||||
|
$(filter-out %opt-common.md %env-common.md, $(wildcard $(d)/src/command-ref/nix-*/*.md)), \
|
||||||
|
$(d)/$(subst /,-,$(subst $(d)/src/command-ref/,,$(subst .md,.1,$(subcommand)))))
|
||||||
|
|
||||||
|
clean-files += $(d)/*.1 $(d)/*.5 $(d)/*.8
|
||||||
|
|
||||||
|
# Provide a dummy environment for nix, so that it will not access files outside the macOS sandbox.
|
||||||
|
# Set cores to 0 because otherwise nix show-config resolves the cores based on the current machine
|
||||||
|
dummy-env = env -i \
|
||||||
|
HOME=/dummy \
|
||||||
|
NIX_CONF_DIR=/dummy \
|
||||||
|
NIX_SSL_CERT_FILE=/dummy/no-ca-bundle.crt \
|
||||||
|
NIX_STATE_DIR=/dummy \
|
||||||
|
NIX_CONFIG='cores = 0'
|
||||||
|
|
||||||
|
nix-eval = $(dummy-env) $(doc_nix) eval --experimental-features nix-command -I nix/corepkgs=corepkgs --store dummy:// --impure --raw
|
||||||
|
|
||||||
|
# re-implement mdBook's include directive to make it usable for terminal output and for proper @docroot@ substitution
|
||||||
|
define process-includes
|
||||||
|
while read -r line; do \
|
||||||
|
set -euo pipefail; \
|
||||||
|
filename="$$(dirname $(1))/$$(sed 's/{{#include \(.*\)}}/\1/'<<< $$line)"; \
|
||||||
|
test -f "$$filename" || ( echo "#include-d file '$$filename' does not exist." >&2; exit 1; ); \
|
||||||
|
matchline="$$(sed 's|/|\\/|g' <<< $$line)"; \
|
||||||
|
sed -i "/$$matchline/r $$filename" $(2); \
|
||||||
|
sed -i "s/$$matchline//" $(2); \
|
||||||
|
done < <(grep '{{#include' $(1))
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(d)/nix-env-%.1: $(d)/src/command-ref/nix-env/%.md
|
||||||
|
@printf "Title: %s\n\n" "$(subst nix-env-,nix-env --,$$(basename "$@" .1))" > $^.tmp
|
||||||
|
$(render-subcommand)
|
||||||
|
|
||||||
|
$(d)/nix-store-%.1: $(d)/src/command-ref/nix-store/%.md
|
||||||
|
@printf -- 'Title: %s\n\n' "$(subst nix-store-,nix-store --,$$(basename "$@" .1))" > $^.tmp
|
||||||
|
$(render-subcommand)
|
||||||
|
|
||||||
|
# FIXME: there surely is some more deduplication to be achieved here with even darker Make magic
|
||||||
|
define render-subcommand
|
||||||
|
@cat $^ >> $^.tmp
|
||||||
|
@$(call process-includes,$^,$^.tmp)
|
||||||
|
$(trace-gen) lowdown -sT man --nroff-nolinks -M section=1 $^.tmp -o $@
|
||||||
|
@# fix up `lowdown`'s automatic escaping of `--`
|
||||||
|
@# https://github.com/kristapsdz/lowdown/blob/edca6ce6d5336efb147321a43c47a698de41bb7c/entity.c#L202
|
||||||
|
@sed -i 's/\e\[u2013\]/--/' $@
|
||||||
|
@rm $^.tmp
|
||||||
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
$(d)/%.1: $(d)/src/command-ref/%.md
|
||||||
|
@printf "Title: %s\n\n" "$$(basename $@ .1)" > $^.tmp
|
||||||
|
@cat $^ >> $^.tmp
|
||||||
|
@$(call process-includes,$^,$^.tmp)
|
||||||
|
$(trace-gen) lowdown -sT man --nroff-nolinks -M section=1 $^.tmp -o $@
|
||||||
|
@rm $^.tmp
|
||||||
|
|
||||||
|
$(d)/%.8: $(d)/src/command-ref/%.md
|
||||||
|
@printf "Title: %s\n\n" "$$(basename $@ .8)" > $^.tmp
|
||||||
|
@cat $^ >> $^.tmp
|
||||||
|
$(trace-gen) lowdown -sT man --nroff-nolinks -M section=8 $^.tmp -o $@
|
||||||
|
@rm $^.tmp
|
||||||
|
|
||||||
|
$(d)/nix.conf.5: $(d)/src/command-ref/conf-file.md
|
||||||
|
@printf "Title: %s\n\n" "$$(basename $@ .5)" > $^.tmp
|
||||||
|
@cat $^ >> $^.tmp
|
||||||
|
@$(call process-includes,$^,$^.tmp)
|
||||||
|
$(trace-gen) lowdown -sT man --nroff-nolinks -M section=5 $^.tmp -o $@
|
||||||
|
@rm $^.tmp
|
||||||
|
|
||||||
|
$(d)/nix-profiles.5: $(d)/src/command-ref/files/profiles.md
|
||||||
|
@printf "Title: %s\n\n" "$$(basename $@ .5)" > $^.tmp
|
||||||
|
@cat $^ >> $^.tmp
|
||||||
|
$(trace-gen) lowdown -sT man --nroff-nolinks -M section=5 $^.tmp -o $@
|
||||||
|
@rm $^.tmp
|
||||||
|
|
||||||
|
$(d)/src/SUMMARY.md: $(d)/src/SUMMARY.md.in $(d)/src/SUMMARY-rl-next.md $(d)/src/command-ref/new-cli $(d)/src/contributing/experimental-feature-descriptions.md
|
||||||
|
@cp $< $@
|
||||||
|
@$(call process-includes,$@,$@)
|
||||||
|
|
||||||
|
$(d)/src/command-ref/new-cli: $(d)/nix.json $(d)/utils.nix $(d)/generate-manpage.nix $(doc_nix)
|
||||||
|
@rm -rf $@ $@.tmp
|
||||||
|
$(trace-gen) $(nix-eval) --write-to $@.tmp --expr 'import doc/manual/generate-manpage.nix true (builtins.readFile $<)'
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
$(d)/src/command-ref/conf-file.md: $(d)/conf-file.json $(d)/utils.nix $(d)/src/command-ref/conf-file-prefix.md $(d)/src/command-ref/experimental-features-shortlist.md $(doc_nix)
|
||||||
|
@cat doc/manual/src/command-ref/conf-file-prefix.md > $@.tmp
|
||||||
|
$(trace-gen) $(nix-eval) --expr '(import doc/manual/utils.nix).showSettings { inlineHTML = true; } (builtins.fromJSON (builtins.readFile $<))' >> $@.tmp;
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
$(d)/nix.json: $(doc_nix)
|
||||||
|
$(trace-gen) $(dummy-env) $(doc_nix) __dump-cli > $@.tmp
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
$(d)/conf-file.json: $(doc_nix)
|
||||||
|
$(trace-gen) $(dummy-env) $(doc_nix) show-config --json --experimental-features nix-command > $@.tmp
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
$(d)/src/contributing/experimental-feature-descriptions.md: $(d)/xp-features.json $(d)/utils.nix $(d)/generate-xp-features.nix $(doc_nix)
|
||||||
|
@rm -rf $@ $@.tmp
|
||||||
|
$(trace-gen) $(nix-eval) --write-to $@.tmp --expr 'import doc/manual/generate-xp-features.nix (builtins.fromJSON (builtins.readFile $<))'
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
$(d)/src/command-ref/experimental-features-shortlist.md: $(d)/xp-features.json $(d)/utils.nix $(d)/generate-xp-features-shortlist.nix $(doc_nix)
|
||||||
|
@rm -rf $@ $@.tmp
|
||||||
|
$(trace-gen) $(nix-eval) --write-to $@.tmp --expr 'import doc/manual/generate-xp-features-shortlist.nix (builtins.fromJSON (builtins.readFile $<))'
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
$(d)/xp-features.json: $(doc_nix)
|
||||||
|
$(trace-gen) $(dummy-env) NIX_PATH=nix/corepkgs=corepkgs $(doc_nix) __dump-xp-features > $@.tmp
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
$(d)/src/language/builtins.md: $(d)/language.json $(d)/generate-builtins.nix $(d)/src/language/builtins-prefix.md $(doc_nix)
|
||||||
|
@cat doc/manual/src/language/builtins-prefix.md > $@.tmp
|
||||||
|
$(trace-gen) $(nix-eval) --expr 'import doc/manual/generate-builtins.nix (builtins.fromJSON (builtins.readFile $<)).builtins' >> $@.tmp;
|
||||||
|
@cat doc/manual/src/language/builtins-suffix.md >> $@.tmp
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
$(d)/src/language/builtin-constants.md: $(d)/language.json $(d)/generate-builtin-constants.nix $(d)/src/language/builtin-constants-prefix.md $(doc_nix)
|
||||||
|
@cat doc/manual/src/language/builtin-constants-prefix.md > $@.tmp
|
||||||
|
$(trace-gen) $(nix-eval) --expr 'import doc/manual/generate-builtin-constants.nix (builtins.fromJSON (builtins.readFile $<)).constants' >> $@.tmp;
|
||||||
|
@cat doc/manual/src/language/builtin-constants-suffix.md >> $@.tmp
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
$(d)/language.json: $(doc_nix)
|
||||||
|
$(trace-gen) $(dummy-env) NIX_PATH=nix/corepkgs=corepkgs $(doc_nix) __dump-language > $@.tmp
|
||||||
|
@mv $@.tmp $@
|
||||||
|
|
||||||
|
# Generate "Upcoming release" notes (or clear it and remove from menu)
|
||||||
|
$(d)/src/release-notes/rl-next.md: $(d)/rl-next $(d)/rl-next/*
|
||||||
|
@if type -p build-release-notes > /dev/null; then \
|
||||||
|
echo " GEN " $@; \
|
||||||
|
build-release-notes doc/manual/rl-next > $@; \
|
||||||
|
else \
|
||||||
|
echo " NULL " $@; \
|
||||||
|
true > $@; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
$(d)/src/SUMMARY-rl-next.md: $(d)/src/release-notes/rl-next.md
|
||||||
|
$(trace-gen) true
|
||||||
|
@if [ -s $< ]; then \
|
||||||
|
echo ' - [Upcoming release](release-notes/rl-next.md)' > $@; \
|
||||||
|
else \
|
||||||
|
true > $@; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Generate the HTML manual.
|
||||||
|
.PHONY: manual-html
|
||||||
|
manual-html: $(docdir)/manual/index.html
|
||||||
|
install: $(docdir)/manual/index.html
|
||||||
|
|
||||||
|
# Generate 'nix' manpages.
|
||||||
|
install: $(mandir)/man1/nix3-manpages
|
||||||
|
man: doc/manual/generated/man1/nix3-manpages
|
||||||
|
all: doc/manual/generated/man1/nix3-manpages
|
||||||
|
|
||||||
|
# FIXME: unify with how the other man pages are generated.
|
||||||
|
# this one works differently and does not use any of the amenities provided by `/mk/lib.mk`.
|
||||||
|
$(mandir)/man1/nix3-manpages: doc/manual/generated/man1/nix3-manpages
|
||||||
|
@mkdir -p $(DESTDIR)$$(dirname $@)
|
||||||
|
$(trace-install) install -m 0644 $$(dirname $<)/* $(DESTDIR)$$(dirname $@)
|
||||||
|
|
||||||
|
doc/manual/generated/man1/nix3-manpages: $(d)/src/command-ref/new-cli
|
||||||
|
@mkdir -p $(DESTDIR)$$(dirname $@)
|
||||||
|
$(trace-gen) for i in doc/manual/src/command-ref/new-cli/*.md; do \
|
||||||
|
name=$$(basename $$i .md); \
|
||||||
|
tmpFile=$$(mktemp); \
|
||||||
|
if [[ $$name = SUMMARY ]]; then continue; fi; \
|
||||||
|
printf "Title: %s\n\n" "$$name" > $$tmpFile; \
|
||||||
|
cat $$i >> $$tmpFile; \
|
||||||
|
lowdown -sT man --nroff-nolinks -M section=1 $$tmpFile -o $(DESTDIR)$$(dirname $@)/$$name.1; \
|
||||||
|
rm $$tmpFile; \
|
||||||
|
done
|
||||||
|
@touch $@
|
||||||
|
|
||||||
|
$(docdir)/manual/index.html: $(MANUAL_SRCS) $(d)/book.toml $(d)/anchors.jq $(d)/custom.css $(d)/src/SUMMARY.md $(d)/src/command-ref/new-cli $(d)/src/contributing/experimental-feature-descriptions.md $(d)/src/command-ref/conf-file.md $(d)/src/language/builtins.md $(d)/src/language/builtin-constants.md $(d)/src/release-notes/rl-next.md
|
||||||
|
$(trace-gen) \
|
||||||
|
tmp="$$(mktemp -d)"; \
|
||||||
|
cp -r doc/manual "$$tmp"; \
|
||||||
|
find "$$tmp" -name '*.md' | while read -r file; do \
|
||||||
|
$(call process-includes,$$file,$$file); \
|
||||||
|
done; \
|
||||||
|
find "$$tmp" -name '*.md' | while read -r file; do \
|
||||||
|
docroot="$$(realpath --relative-to="$$(dirname "$$file")" $$tmp/manual/src)"; \
|
||||||
|
sed -i "s,@docroot@,$$docroot,g" "$$file"; \
|
||||||
|
done; \
|
||||||
|
set -euo pipefail; \
|
||||||
|
RUST_LOG=warn mdbook build "$$tmp/manual" -d $(DESTDIR)$(docdir)/manual.tmp 2>&1 \
|
||||||
|
| { grep -Fv "because fragment resolution isn't implemented" || :; }; \
|
||||||
|
rm -rf "$$tmp/manual"
|
||||||
|
@rm -rf $(DESTDIR)$(docdir)/manual
|
||||||
|
@mv $(DESTDIR)$(docdir)/manual.tmp/html $(DESTDIR)$(docdir)/manual
|
||||||
|
@rm -rf $(DESTDIR)$(docdir)/manual.tmp
|
||||||
|
|
||||||
|
endif
|
|
@ -1,349 +0,0 @@
|
||||||
nix_env_for_docs = {
|
|
||||||
'HOME': '/dummy',
|
|
||||||
'NIX_CONF_DIR': '/dummy',
|
|
||||||
'NIX_SSL_CERT_FILE': '/dummy/no-ca-bundle.crt',
|
|
||||||
'NIX_STATE_DIR': '/dummy',
|
|
||||||
'NIX_CONFIG': 'cores = 0',
|
|
||||||
}
|
|
||||||
|
|
||||||
nix_for_docs = [ nix, '--experimental-features', 'nix-command' ]
|
|
||||||
nix_eval_for_docs_common = nix_for_docs + [
|
|
||||||
'eval',
|
|
||||||
'-I', 'nix/corepkgs=corepkgs',
|
|
||||||
'--store', 'dummy://',
|
|
||||||
'--impure',
|
|
||||||
]
|
|
||||||
nix_eval_for_docs = nix_eval_for_docs_common + '--raw'
|
|
||||||
|
|
||||||
conf_file_json = custom_target(
|
|
||||||
command : nix_for_docs + [ 'show-config', '--json' ],
|
|
||||||
capture : true,
|
|
||||||
output : 'conf-file.json',
|
|
||||||
env : nix_env_for_docs,
|
|
||||||
)
|
|
||||||
|
|
||||||
nix_conf_file_md_body = custom_target(
|
|
||||||
command : nix_eval_for_docs + [
|
|
||||||
'--expr',
|
|
||||||
'(import @INPUT0@).showSettings { inlineHTML = true; } (builtins.fromJSON (builtins.readFile @INPUT1@))',
|
|
||||||
],
|
|
||||||
capture : true,
|
|
||||||
input : [
|
|
||||||
'utils.nix',
|
|
||||||
conf_file_json,
|
|
||||||
],
|
|
||||||
output : 'conf-file.md.body',
|
|
||||||
env : nix_env_for_docs,
|
|
||||||
)
|
|
||||||
|
|
||||||
nix_conf_file_md = custom_target(
|
|
||||||
command : [ 'cat', '@INPUT@' ],
|
|
||||||
capture : true,
|
|
||||||
input : [
|
|
||||||
'src/command-ref/conf-file.md',
|
|
||||||
nix_conf_file_md_body,
|
|
||||||
],
|
|
||||||
output : 'conf-file.md',
|
|
||||||
)
|
|
||||||
|
|
||||||
nix_exp_features_json = custom_target(
|
|
||||||
command : [ nix, '__dump-xp-features' ],
|
|
||||||
capture : true,
|
|
||||||
output : 'xp-features.json',
|
|
||||||
)
|
|
||||||
|
|
||||||
language_json = custom_target(
|
|
||||||
command: [nix, '__dump-language'],
|
|
||||||
output : 'language.json',
|
|
||||||
capture : true,
|
|
||||||
env : nix_env_for_docs,
|
|
||||||
)
|
|
||||||
|
|
||||||
nix3_cli_json = custom_target(
|
|
||||||
command : [ nix, '__dump-cli' ],
|
|
||||||
capture : true,
|
|
||||||
output : 'nix.json',
|
|
||||||
env : nix_env_for_docs,
|
|
||||||
)
|
|
||||||
|
|
||||||
generate_manual_deps = files(
|
|
||||||
'generate-deps.py',
|
|
||||||
)
|
|
||||||
|
|
||||||
# Generates builtins.md and builtin-constants.md.
|
|
||||||
subdir('src/language')
|
|
||||||
# Generates new-cli pages, experimental-features-shortlist.md, and conf-file.md.
|
|
||||||
subdir('src/command-ref')
|
|
||||||
# Generates experimental-feature-descriptions.md.
|
|
||||||
subdir('src/contributing')
|
|
||||||
# Generates rl-next-generated.md.
|
|
||||||
subdir('src/release-notes')
|
|
||||||
|
|
||||||
manual = custom_target(
|
|
||||||
'manual',
|
|
||||||
command : [
|
|
||||||
bash,
|
|
||||||
'-euo', 'pipefail',
|
|
||||||
'-c',
|
|
||||||
'''
|
|
||||||
@0@ @INPUT0@ @CURRENT_SOURCE_DIR@ > @DEPFILE@
|
|
||||||
cd @SOURCE_ROOT@
|
|
||||||
@1@ build doc/manual -d @2@ | { grep -Fv "because fragment resolution isn't implemented" || :; }
|
|
||||||
rm -rf @2@/manual
|
|
||||||
mv @2@/html @2@/manual
|
|
||||||
find @2@/manual -iname meson.build -delete
|
|
||||||
'''.format(
|
|
||||||
python.full_path(),
|
|
||||||
mdbook.full_path(),
|
|
||||||
meson.current_build_dir(),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
input : [
|
|
||||||
generate_manual_deps,
|
|
||||||
'book.toml',
|
|
||||||
'anchors.jq',
|
|
||||||
'custom.css',
|
|
||||||
nix3_cli_files,
|
|
||||||
experimental_features_shortlist_md,
|
|
||||||
experimental_feature_descriptions_md,
|
|
||||||
conf_file_md,
|
|
||||||
builtins_md,
|
|
||||||
builtin_constants_md,
|
|
||||||
rl_next_generated,
|
|
||||||
],
|
|
||||||
output : [
|
|
||||||
'manual',
|
|
||||||
'markdown',
|
|
||||||
],
|
|
||||||
depfile : 'manual.d',
|
|
||||||
env : {
|
|
||||||
'RUST_LOG': 'info',
|
|
||||||
'MDBOOK_SUBSTITUTE_SEARCH': meson.current_build_dir() / 'src',
|
|
||||||
},
|
|
||||||
)
|
|
||||||
manual_html = manual[0]
|
|
||||||
manual_md = manual[1]
|
|
||||||
|
|
||||||
install_subdir(
|
|
||||||
manual_html.full_path(),
|
|
||||||
install_dir : datadir / 'doc/nix',
|
|
||||||
)
|
|
||||||
|
|
||||||
nix_nested_manpages = [
|
|
||||||
[ 'nix-env',
|
|
||||||
[
|
|
||||||
'delete-generations',
|
|
||||||
'install',
|
|
||||||
'list-generations',
|
|
||||||
'query',
|
|
||||||
'rollback',
|
|
||||||
'set-flag',
|
|
||||||
'set',
|
|
||||||
'switch-generation',
|
|
||||||
'switch-profile',
|
|
||||||
'uninstall',
|
|
||||||
'upgrade',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
[ 'nix-store',
|
|
||||||
[
|
|
||||||
'add-fixed',
|
|
||||||
'add',
|
|
||||||
'delete',
|
|
||||||
'dump-db',
|
|
||||||
'dump',
|
|
||||||
'export',
|
|
||||||
'gc',
|
|
||||||
'generate-binary-cache-key',
|
|
||||||
'import',
|
|
||||||
'load-db',
|
|
||||||
'optimise',
|
|
||||||
'print-env',
|
|
||||||
'query',
|
|
||||||
'read-log',
|
|
||||||
'realise',
|
|
||||||
'repair-path',
|
|
||||||
'restore',
|
|
||||||
'serve',
|
|
||||||
'verify',
|
|
||||||
'verify-path',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
]
|
|
||||||
|
|
||||||
foreach command : nix_nested_manpages
|
|
||||||
foreach page : command[1]
|
|
||||||
title = command[0] + ' --' + page
|
|
||||||
section = '1'
|
|
||||||
custom_target(
|
|
||||||
command : [
|
|
||||||
'./render-manpage.sh',
|
|
||||||
'--out-no-smarty',
|
|
||||||
title,
|
|
||||||
section,
|
|
||||||
'@INPUT0@/command-ref' / command[0] / (page + '.md'),
|
|
||||||
'@OUTPUT0@',
|
|
||||||
],
|
|
||||||
input : [
|
|
||||||
manual_md,
|
|
||||||
],
|
|
||||||
output : command[0] + '-' + page + '.1',
|
|
||||||
install : true,
|
|
||||||
install_dir : mandir / 'man1',
|
|
||||||
)
|
|
||||||
endforeach
|
|
||||||
endforeach
|
|
||||||
|
|
||||||
nix3_manpages = [
|
|
||||||
'nix3-build',
|
|
||||||
'nix3-bundle',
|
|
||||||
'nix3-config',
|
|
||||||
'nix3-config-show',
|
|
||||||
'nix3-copy',
|
|
||||||
'nix3-daemon',
|
|
||||||
'nix3-derivation-add',
|
|
||||||
'nix3-derivation',
|
|
||||||
'nix3-derivation-show',
|
|
||||||
'nix3-develop',
|
|
||||||
'nix3-doctor',
|
|
||||||
'nix3-edit',
|
|
||||||
'nix3-eval',
|
|
||||||
'nix3-flake-archive',
|
|
||||||
'nix3-flake-check',
|
|
||||||
'nix3-flake-clone',
|
|
||||||
'nix3-flake-info',
|
|
||||||
'nix3-flake-init',
|
|
||||||
'nix3-flake-lock',
|
|
||||||
'nix3-flake',
|
|
||||||
'nix3-flake-metadata',
|
|
||||||
'nix3-flake-new',
|
|
||||||
'nix3-flake-prefetch',
|
|
||||||
'nix3-flake-show',
|
|
||||||
'nix3-flake-update',
|
|
||||||
'nix3-fmt',
|
|
||||||
'nix3-hash-file',
|
|
||||||
'nix3-hash',
|
|
||||||
'nix3-hash-path',
|
|
||||||
'nix3-hash-to-base16',
|
|
||||||
'nix3-hash-to-base32',
|
|
||||||
'nix3-hash-to-base64',
|
|
||||||
'nix3-hash-to-sri',
|
|
||||||
'nix3-help',
|
|
||||||
'nix3-help-stores',
|
|
||||||
'nix3-key-convert-secret-to-public',
|
|
||||||
'nix3-key-generate-secret',
|
|
||||||
'nix3-key',
|
|
||||||
'nix3-log',
|
|
||||||
'nix3-nar-cat',
|
|
||||||
'nix3-nar-dump-path',
|
|
||||||
'nix3-nar-ls',
|
|
||||||
'nix3-nar',
|
|
||||||
'nix3-path-info',
|
|
||||||
'nix3-print-dev-env',
|
|
||||||
'nix3-profile-diff-closures',
|
|
||||||
'nix3-profile-history',
|
|
||||||
'nix3-profile-install',
|
|
||||||
'nix3-profile-list',
|
|
||||||
'nix3-profile',
|
|
||||||
'nix3-profile-remove',
|
|
||||||
'nix3-profile-rollback',
|
|
||||||
'nix3-profile-upgrade',
|
|
||||||
'nix3-profile-wipe-history',
|
|
||||||
'nix3-realisation-info',
|
|
||||||
'nix3-realisation',
|
|
||||||
'nix3-registry-add',
|
|
||||||
'nix3-registry-list',
|
|
||||||
'nix3-registry',
|
|
||||||
'nix3-registry-pin',
|
|
||||||
'nix3-registry-remove',
|
|
||||||
'nix3-repl',
|
|
||||||
'nix3-run',
|
|
||||||
'nix3-search',
|
|
||||||
'nix3-shell',
|
|
||||||
'nix3-store-add-file',
|
|
||||||
'nix3-store-add-path',
|
|
||||||
'nix3-store-cat',
|
|
||||||
'nix3-store-copy-log',
|
|
||||||
'nix3-store-copy-sigs',
|
|
||||||
'nix3-store-delete',
|
|
||||||
'nix3-store-diff-closures',
|
|
||||||
'nix3-store-dump-path',
|
|
||||||
'nix3-store-gc',
|
|
||||||
'nix3-store-ls',
|
|
||||||
'nix3-store-make-content-addressed',
|
|
||||||
'nix3-store',
|
|
||||||
'nix3-store-optimise',
|
|
||||||
'nix3-store-path-from-hash-part',
|
|
||||||
'nix3-store-ping',
|
|
||||||
'nix3-store-prefetch-file',
|
|
||||||
'nix3-store-repair',
|
|
||||||
'nix3-store-sign',
|
|
||||||
'nix3-store-verify',
|
|
||||||
'nix3-upgrade-nix',
|
|
||||||
'nix3-why-depends',
|
|
||||||
'nix',
|
|
||||||
]
|
|
||||||
|
|
||||||
foreach page : nix3_manpages
|
|
||||||
section = '1'
|
|
||||||
custom_target(
|
|
||||||
command : [
|
|
||||||
bash,
|
|
||||||
'@INPUT0@',
|
|
||||||
page,
|
|
||||||
section,
|
|
||||||
'@INPUT1@/command-ref/new-cli/@0@.md'.format(page),
|
|
||||||
'@OUTPUT@',
|
|
||||||
],
|
|
||||||
input : [
|
|
||||||
'render-manpage.sh',
|
|
||||||
manual_md,
|
|
||||||
],
|
|
||||||
output : page + '.1',
|
|
||||||
install : true,
|
|
||||||
install_dir : mandir / 'man1',
|
|
||||||
)
|
|
||||||
endforeach
|
|
||||||
|
|
||||||
nix_manpages = [
|
|
||||||
[ 'nix-env', 1 ],
|
|
||||||
[ 'nix-store', 1 ],
|
|
||||||
[ 'nix-build', 1 ],
|
|
||||||
[ 'nix-shell', 1 ],
|
|
||||||
[ 'nix-instantiate', 1 ],
|
|
||||||
[ 'nix-collect-garbage', 1 ],
|
|
||||||
[ 'nix-prefetch-url', 1 ],
|
|
||||||
[ 'nix-channel', 1 ],
|
|
||||||
[ 'nix-hash', 1 ],
|
|
||||||
[ 'nix-copy-closure', 1 ],
|
|
||||||
[ 'nix.conf', 5, 'conf-file.md' ],
|
|
||||||
[ 'nix-daemon', 8 ],
|
|
||||||
[ 'nix-profiles', 5, 'files/profiles.md' ],
|
|
||||||
]
|
|
||||||
|
|
||||||
foreach entry : nix_manpages
|
|
||||||
title = entry[0]
|
|
||||||
# nix.conf.5 and nix-profiles.5 are based off of conf-file.md and files/profiles.md,
|
|
||||||
# rather than a stem identical to its mdbook source.
|
|
||||||
# Therefore we use an optional third element of this array to override the name pattern
|
|
||||||
md_file = entry.get(2, title + '.md')
|
|
||||||
section = entry[1].to_string()
|
|
||||||
custom_target(
|
|
||||||
command : [
|
|
||||||
bash,
|
|
||||||
'@INPUT0@',
|
|
||||||
title,
|
|
||||||
section,
|
|
||||||
'@INPUT1@/command-ref/@0@'.format(md_file),
|
|
||||||
'@OUTPUT@',
|
|
||||||
],
|
|
||||||
input : [
|
|
||||||
'render-manpage.sh',
|
|
||||||
manual_md,
|
|
||||||
entry.get(3, []),
|
|
||||||
],
|
|
||||||
output : '@0@.@1@'.format(entry[0], entry[1]),
|
|
||||||
install : true,
|
|
||||||
install_dir : mandir / 'man@0@'.format(entry[1]),
|
|
||||||
)
|
|
||||||
endforeach
|
|
|
@ -1,32 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
infile="$1"
|
|
||||||
outfile="$2"
|
|
||||||
shift 2
|
|
||||||
|
|
||||||
# set a search path for includes. the old makefile-based system splorked
|
|
||||||
# everything into the source tree and was thus able to not have a search
|
|
||||||
# path, but the meson system generates intermediate files into dedicated
|
|
||||||
# directories separate from the source. we still retain the implicit old
|
|
||||||
# behavior for now as the base search path, once meson is the default we
|
|
||||||
# can revisit this and remove the implicit search path entry. it's fine.
|
|
||||||
set -- "$(dirname "$infile")" "$@"
|
|
||||||
|
|
||||||
# re-implement mdBook's include directive to make it usable for terminal output and for proper @docroot@ substitution
|
|
||||||
(grep '{{#include' "$infile" || true) | while read -r line; do
|
|
||||||
found=false
|
|
||||||
include="$(printf "$line" | sed 's/{{#include \(.*\)}}/\1/')"
|
|
||||||
for path in "$@"; do
|
|
||||||
filename="$path/$include"
|
|
||||||
if [ -e "$filename" ]; then
|
|
||||||
found=true
|
|
||||||
matchline="$(printf "$line" | sed 's|/|\\/|g')"
|
|
||||||
sed -i "/$matchline/r $filename" "$outfile"
|
|
||||||
sed -i "s/$matchline//" "$outfile"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
$found || ( echo "#include-d file '$filename' does not exist." >&2; exit 1; )
|
|
||||||
done
|
|
|
@ -1,25 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
lowdown_args=
|
|
||||||
|
|
||||||
if [ "$1" = --out-no-smarty ]; then
|
|
||||||
lowdown_args=--out-no-smarty
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
[ "$#" = 4 ] || {
|
|
||||||
echo "wrong number of args passed" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
title="$1"
|
|
||||||
section="$2"
|
|
||||||
infile="$3"
|
|
||||||
outfile="$4"
|
|
||||||
|
|
||||||
(
|
|
||||||
printf "Title: %s\n\n" "$title"
|
|
||||||
cat "$infile"
|
|
||||||
) | lowdown -sT man --nroff-nolinks $lowdown_args -M section="$section" -o "$outfile"
|
|
|
@ -1,7 +1,6 @@
|
||||||
---
|
---
|
||||||
synopsis: Concise error printing in `nix repl`
|
synopsis: Concise error printing in `nix repl`
|
||||||
prs: 9928
|
prs: 9928
|
||||||
cls: 811
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Previously, if an element of a list or attribute set threw an error while
|
Previously, if an element of a list or attribute set threw an error while
|
||||||
|
@ -38,3 +37,4 @@ error:
|
||||||
|
|
||||||
error: uh oh!
|
error: uh oh!
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,8 @@ in
|
||||||
b
|
b
|
||||||
```
|
```
|
||||||
|
|
||||||
Lix would correctly enter the debugger at `builtins.break a`, but if you asked
|
Nix would correctly enter the debugger at `builtins.break a`, but if you asked
|
||||||
it to `:continue`, it would skip over the `builtins.break "hello"` expression
|
it to `:continue`, it would skip over the `builtins.break "hello"` expression
|
||||||
entirely.
|
entirely.
|
||||||
|
|
||||||
Now, Lix will correctly enter the debugger at both breakpoints.
|
Now, Nix will correctly enter the debugger at both breakpoints.
|
||||||
|
|
|
@ -6,7 +6,7 @@ prs: 4093
|
||||||
Add a new `eval-system` option.
|
Add a new `eval-system` option.
|
||||||
Unlike `system`, it just overrides the value of `builtins.currentSystem`.
|
Unlike `system`, it just overrides the value of `builtins.currentSystem`.
|
||||||
This is more useful than overriding `system`, because you can build these derivations on remote builders which can work on the given system.
|
This is more useful than overriding `system`, because you can build these derivations on remote builders which can work on the given system.
|
||||||
In contrast, `system` also effects scheduling which will cause Lix to build those derivations locally even if that doesn't make sense.
|
In contrast, `system` also effects scheduling which will cause Nix to build those derivations locally even if that doesn't make sense.
|
||||||
|
|
||||||
`eval-system` only takes effect if it is non-empty.
|
`eval-system` only takes effect if it is non-empty.
|
||||||
If empty (the default) `system` is used as before, so there is no breakage.
|
If empty (the default) `system` is used as before, so there is no breakage.
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: Creating setuid/setgid binaries with fchmodat2 is now prohibited by the build sandbox
|
|
||||||
prs: 10501
|
|
||||||
---
|
|
||||||
|
|
||||||
The build sandbox blocks any attempt to create setuid/setgid binaries, but didn't check
|
|
||||||
for the use of the `fchmodat2` syscall which was introduced in Linux 6.6 and is used by
|
|
||||||
glibc >=2.39. This is fixed now.
|
|
|
@ -1,21 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: Fix nested flake input `follows`
|
|
||||||
prs: 6621
|
|
||||||
cls: 994
|
|
||||||
---
|
|
||||||
|
|
||||||
Previously nested-input overrides were ignored; that is, the following did not
|
|
||||||
override anything, in spite of the `nix3-flake` manual documenting it working:
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
inputs = {
|
|
||||||
foo.url = "github:bar/foo";
|
|
||||||
foo.inputs.bar.inputs.nixpkgs = "nixpkgs";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
This is useful to avoid the 1000 instances of nixpkgs problem without having
|
|
||||||
each flake in the dependency tree to expose all of its transitive dependencies
|
|
||||||
for modification.
|
|
|
@ -1,32 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: Nested debuggers are no longer supported
|
|
||||||
prs: 9920
|
|
||||||
---
|
|
||||||
|
|
||||||
Previously, evaluating an expression that throws an error in the debugger would
|
|
||||||
enter a second, nested debugger:
|
|
||||||
|
|
||||||
```
|
|
||||||
nix-repl> builtins.throw "what"
|
|
||||||
error: what
|
|
||||||
|
|
||||||
|
|
||||||
Starting REPL to allow you to inspect the current state of the evaluator.
|
|
||||||
|
|
||||||
Welcome to Nix 2.18.1. Type :? for help.
|
|
||||||
|
|
||||||
nix-repl>
|
|
||||||
```
|
|
||||||
|
|
||||||
Now, it just prints the error message like `nix repl`:
|
|
||||||
|
|
||||||
```
|
|
||||||
nix-repl> builtins.throw "what"
|
|
||||||
error:
|
|
||||||
… while calling the 'throw' builtin
|
|
||||||
at «string»:1:1:
|
|
||||||
1| builtins.throw "what"
|
|
||||||
| ^
|
|
||||||
|
|
||||||
error: what
|
|
||||||
```
|
|
|
@ -1,10 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: Store paths are allowed to start with `.`
|
|
||||||
issues: 912
|
|
||||||
prs: [9867, 9091, 9095, 9120, 9121, 9122, 9130, 9219, 9224]
|
|
||||||
---
|
|
||||||
|
|
||||||
Leading periods were allowed by accident in Nix 2.4. The Nix team has considered this to be a bug, but this behavior has since been relied on by users, leading to unnecessary difficulties.
|
|
||||||
From now on, leading periods are officially, definitively supported. The names `.` and `..` are disallowed, as well as those starting with `.-` or `..-`.
|
|
||||||
|
|
||||||
Nix versions that denied leading periods are documented [in the issue](https://github.com/NixOS/nix/issues/912#issuecomment-1919583286).
|
|
|
@ -1,23 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: Lix turns more internal bugs into crashes
|
|
||||||
cls: [797, 626]
|
|
||||||
---
|
|
||||||
|
|
||||||
Lix now enables build options such as trapping on signed overflow and enabling
|
|
||||||
libstdc++ assertions by default. These may find new bugs in Lix, which will
|
|
||||||
present themselves as Lix processes aborting, potentially without an error
|
|
||||||
message.
|
|
||||||
|
|
||||||
If Lix processes abort on your machine, this is a bug. Please file a bug,
|
|
||||||
ideally with the core dump (or information from it).
|
|
||||||
|
|
||||||
On Linux, run `coredumpctl list`, find the crashed process's PID at
|
|
||||||
the bottom of the list, then run `coredumpctl info THE-PID`. You can then paste
|
|
||||||
the output into a bug report.
|
|
||||||
|
|
||||||
On macOS, open the Console app from Applications/Utilities, select Crash
|
|
||||||
Reports, select the crash report in question. Right click on it, select Open In
|
|
||||||
Finder, then include that file in your bug report. [See the Apple
|
|
||||||
documentation][apple-crashreport] for more details.
|
|
||||||
|
|
||||||
[apple-crashreport]: https://developer.apple.com/documentation/xcode/acquiring-crash-reports-and-diagnostic-logs#Locate-crash-reports-and-memory-logs-on-the-device
|
|
|
@ -1,7 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: rename 'nix show-config' to 'nix config show'
|
|
||||||
issues: 7672
|
|
||||||
prs: 9477
|
|
||||||
---
|
|
||||||
|
|
||||||
`nix show-config` was renamed to `nix config show` to be more consistent with the rest of the command-line interface.
|
|
|
@ -1,9 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: "`nix profile` now allows referring to elements by human-readable name, and no longer accepts indices"
|
|
||||||
prs: 8678
|
|
||||||
cls: [978, 980]
|
|
||||||
---
|
|
||||||
|
|
||||||
[`nix profile`](@docroot@/command-ref/new-cli/nix3-profile.md) now uses names to refer to installed packages when running [`list`](@docroot@/command-ref/new-cli/nix3-profile-list.md), [`remove`](@docroot@/command-ref/new-cli/nix3-profile-remove.md) or [`upgrade`](@docroot@/command-ref/new-cli/nix3-profile-upgrade.md) as opposed to indices. Indices have been removed. Profile element names are generated when a package is installed and remain the same until the package is removed.
|
|
||||||
|
|
||||||
**Warning**: The `manifest.nix` file used to record the contents of profiles has changed. Lix will automatically upgrade profiles to the new version when you modify the profile. After that, the profile can no longer be used by older versions of Lix.
|
|
|
@ -1,8 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: re-evaluate cached evaluation errors
|
|
||||||
cls: 771
|
|
||||||
---
|
|
||||||
|
|
||||||
"cached failure of [expr]" errors have been removed: expressions already in the
|
|
||||||
eval cache as a failure will now simply be re-evaluated, removing the need to
|
|
||||||
set `--no-eval-cache` or similar to see the error.
|
|
|
@ -1,13 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: Experimental REPL support for documentation comments using `:doc`
|
|
||||||
cls: 564
|
|
||||||
---
|
|
||||||
|
|
||||||
Using `:doc` in the REPL now supports showing documentation comments when defined on a function.
|
|
||||||
|
|
||||||
Previously this was only able to document builtins, however it now will show comments defined on a lambda as well.
|
|
||||||
|
|
||||||
This support is experimental and relies on an embedded version of [nix-doc](https://github.com/lf-/nix-doc).
|
|
||||||
|
|
||||||
The logic also supports limited Markdown formatting of doccomments and should easily support any [RFC 145](https://github.com/NixOS/rfcs/blob/master/rfcs/0145-doc-strings.md)
|
|
||||||
compatible documentation comments in addition to simple commented documentation.
|
|
|
@ -1,7 +1,6 @@
|
||||||
---
|
---
|
||||||
synopsis: Add `repl-overlays` option
|
synopsis: Add `repl-overlays` option
|
||||||
prs: 10203
|
prs: 10203
|
||||||
cls: 504
|
|
||||||
---
|
---
|
||||||
|
|
||||||
A `repl-overlays` option has been added, which specifies files that can overlay
|
A `repl-overlays` option has been added, which specifies files that can overlay
|
||||||
|
@ -25,7 +24,7 @@ We can run `nix repl` and use `pkgs` to refer to `legacyPackages.${currentSystem
|
||||||
|
|
||||||
```ShellSession
|
```ShellSession
|
||||||
$ nix repl --repl-overlays ~/.config/nix/repl.nix nixpkgs
|
$ nix repl --repl-overlays ~/.config/nix/repl.nix nixpkgs
|
||||||
Lix 2.90.0
|
Nix 2.21.0pre20240309_4111bb6
|
||||||
Type :? for help.
|
Type :? for help.
|
||||||
Loading installable 'flake:nixpkgs#'...
|
Loading installable 'flake:nixpkgs#'...
|
||||||
Added 5 variables.
|
Added 5 variables.
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: add --store-path argument to `nix upgrade-nix`, to manually specify the Nix to upgrade to
|
|
||||||
cls: 953
|
|
||||||
---
|
|
||||||
|
|
||||||
`nix upgrade-nix` by default downloads a manifest to find the new Nix version to upgrade to, but now you can specify `--store-path` to upgrade Nix to an arbitrary version from the Nix store.
|
|
|
@ -1,8 +0,0 @@
|
||||||
---
|
|
||||||
synopsis: using `nix profile` on `/nix/var/nix/profiles/default` no longer breaks `nix upgrade-nix`
|
|
||||||
cls: 952
|
|
||||||
---
|
|
||||||
|
|
||||||
On non-NixOS, Nix is conventionally installed into a `nix-env` style profile at /nix/var/nix/profiles/default.
|
|
||||||
Like any `nix-env` profile, using `nix profile` on it automatically migrates it to a `nix profile` style profile, which is incompatible with `nix-env`.
|
|
||||||
`nix upgrade-nix` previously relied solely on `nix-env` to do the upgrade, but now will work fine with either kind of profile.
|
|
|
@ -5,17 +5,17 @@
|
||||||
- [Installation](installation/installation.md)
|
- [Installation](installation/installation.md)
|
||||||
- [Supported Platforms](installation/supported-platforms.md)
|
- [Supported Platforms](installation/supported-platforms.md)
|
||||||
- [Installing a Binary Distribution](installation/installing-binary.md)
|
- [Installing a Binary Distribution](installation/installing-binary.md)
|
||||||
- [Installing Lix from Source](installation/installing-source.md)
|
- [Installing Nix from Source](installation/installing-source.md)
|
||||||
- [Prerequisites](installation/prerequisites-source.md)
|
- [Prerequisites](installation/prerequisites-source.md)
|
||||||
- [Obtaining a Source Distribution](installation/obtaining-source.md)
|
- [Obtaining a Source Distribution](installation/obtaining-source.md)
|
||||||
- [Building Lix from Source](installation/building-source.md)
|
- [Building Nix from Source](installation/building-source.md)
|
||||||
- [Using Lix within Docker](installation/installing-docker.md)
|
- [Using Nix within Docker](installation/installing-docker.md)
|
||||||
- [Security](installation/nix-security.md)
|
- [Security](installation/nix-security.md)
|
||||||
- [Single-User Mode](installation/single-user.md)
|
- [Single-User Mode](installation/single-user.md)
|
||||||
- [Multi-User Mode](installation/multi-user.md)
|
- [Multi-User Mode](installation/multi-user.md)
|
||||||
- [Environment Variables](installation/env-variables.md)
|
- [Environment Variables](installation/env-variables.md)
|
||||||
- [Upgrading Lix](installation/upgrading.md)
|
- [Upgrading Nix](installation/upgrading.md)
|
||||||
- [Uninstalling Lix](installation/uninstall.md)
|
- [Uninstalling Nix](installation/uninstall.md)
|
||||||
- [Package Management](package-management/package-management.md)
|
- [Package Management](package-management/package-management.md)
|
||||||
- [Basic Package Management](package-management/basic-package-mgmt.md)
|
- [Basic Package Management](package-management/basic-package-mgmt.md)
|
||||||
- [Profiles](package-management/profiles.md)
|
- [Profiles](package-management/profiles.md)
|
||||||
|
@ -88,93 +88,7 @@
|
||||||
- [nix-instantiate](command-ref/nix-instantiate.md)
|
- [nix-instantiate](command-ref/nix-instantiate.md)
|
||||||
- [nix-prefetch-url](command-ref/nix-prefetch-url.md)
|
- [nix-prefetch-url](command-ref/nix-prefetch-url.md)
|
||||||
- [Experimental Commands](command-ref/experimental-commands.md)
|
- [Experimental Commands](command-ref/experimental-commands.md)
|
||||||
- [nix](command-ref/new-cli/nix.md)
|
{{#include ./command-ref/new-cli/SUMMARY.md}}
|
||||||
- [nix build](command-ref/new-cli/nix3-build.md)
|
|
||||||
- [nix bundle](command-ref/new-cli/nix3-bundle.md)
|
|
||||||
- [nix config](command-ref/new-cli/nix3-config.md)
|
|
||||||
- [nix config show](command-ref/new-cli/nix3-config-show.md)
|
|
||||||
- [nix copy](command-ref/new-cli/nix3-copy.md)
|
|
||||||
- [nix daemon](command-ref/new-cli/nix3-daemon.md)
|
|
||||||
- [nix derivation](command-ref/new-cli/nix3-derivation.md)
|
|
||||||
- [nix derivation add](command-ref/new-cli/nix3-derivation-add.md)
|
|
||||||
- [nix derivation show](command-ref/new-cli/nix3-derivation-show.md)
|
|
||||||
- [nix develop](command-ref/new-cli/nix3-develop.md)
|
|
||||||
- [nix doctor](command-ref/new-cli/nix3-doctor.md)
|
|
||||||
- [nix edit](command-ref/new-cli/nix3-edit.md)
|
|
||||||
- [nix eval](command-ref/new-cli/nix3-eval.md)
|
|
||||||
- [nix flake](command-ref/new-cli/nix3-flake.md)
|
|
||||||
- [nix flake archive](command-ref/new-cli/nix3-flake-archive.md)
|
|
||||||
- [nix flake check](command-ref/new-cli/nix3-flake-check.md)
|
|
||||||
- [nix flake clone](command-ref/new-cli/nix3-flake-clone.md)
|
|
||||||
- [nix flake info](command-ref/new-cli/nix3-flake-info.md)
|
|
||||||
- [nix flake init](command-ref/new-cli/nix3-flake-init.md)
|
|
||||||
- [nix flake lock](command-ref/new-cli/nix3-flake-lock.md)
|
|
||||||
- [nix flake metadata](command-ref/new-cli/nix3-flake-metadata.md)
|
|
||||||
- [nix flake new](command-ref/new-cli/nix3-flake-new.md)
|
|
||||||
- [nix flake prefetch](command-ref/new-cli/nix3-flake-prefetch.md)
|
|
||||||
- [nix flake show](command-ref/new-cli/nix3-flake-show.md)
|
|
||||||
- [nix flake update](command-ref/new-cli/nix3-flake-update.md)
|
|
||||||
- [nix fmt](command-ref/new-cli/nix3-fmt.md)
|
|
||||||
- [nix hash](command-ref/new-cli/nix3-hash.md)
|
|
||||||
- [nix hash file](command-ref/new-cli/nix3-hash-file.md)
|
|
||||||
- [nix hash path](command-ref/new-cli/nix3-hash-path.md)
|
|
||||||
- [nix hash to-base16](command-ref/new-cli/nix3-hash-to-base16.md)
|
|
||||||
- [nix hash to-base32](command-ref/new-cli/nix3-hash-to-base32.md)
|
|
||||||
- [nix hash to-base64](command-ref/new-cli/nix3-hash-to-base64.md)
|
|
||||||
- [nix hash to-sri](command-ref/new-cli/nix3-hash-to-sri.md)
|
|
||||||
- [nix help](command-ref/new-cli/nix3-help.md)
|
|
||||||
- [nix help-stores](command-ref/new-cli/nix3-help-stores.md)
|
|
||||||
- [nix key](command-ref/new-cli/nix3-key.md)
|
|
||||||
- [nix key convert-secret-to-public](command-ref/new-cli/nix3-key-convert-secret-to-public.md)
|
|
||||||
- [nix key generate-secret](command-ref/new-cli/nix3-key-generate-secret.md)
|
|
||||||
- [nix log](command-ref/new-cli/nix3-log.md)
|
|
||||||
- [nix nar](command-ref/new-cli/nix3-nar.md)
|
|
||||||
- [nix nar cat](command-ref/new-cli/nix3-nar-cat.md)
|
|
||||||
- [nix nar dump-path](command-ref/new-cli/nix3-nar-dump-path.md)
|
|
||||||
- [nix nar ls](command-ref/new-cli/nix3-nar-ls.md)
|
|
||||||
- [nix path-info](command-ref/new-cli/nix3-path-info.md)
|
|
||||||
- [nix print-dev-env](command-ref/new-cli/nix3-print-dev-env.md)
|
|
||||||
- [nix profile](command-ref/new-cli/nix3-profile.md)
|
|
||||||
- [nix profile diff-closures](command-ref/new-cli/nix3-profile-diff-closures.md)
|
|
||||||
- [nix profile history](command-ref/new-cli/nix3-profile-history.md)
|
|
||||||
- [nix profile install](command-ref/new-cli/nix3-profile-install.md)
|
|
||||||
- [nix profile list](command-ref/new-cli/nix3-profile-list.md)
|
|
||||||
- [nix profile remove](command-ref/new-cli/nix3-profile-remove.md)
|
|
||||||
- [nix profile rollback](command-ref/new-cli/nix3-profile-rollback.md)
|
|
||||||
- [nix profile upgrade](command-ref/new-cli/nix3-profile-upgrade.md)
|
|
||||||
- [nix profile wipe-history](command-ref/new-cli/nix3-profile-wipe-history.md)
|
|
||||||
- [nix realisation](command-ref/new-cli/nix3-realisation.md)
|
|
||||||
- [nix realisation info](command-ref/new-cli/nix3-realisation-info.md)
|
|
||||||
- [nix registry](command-ref/new-cli/nix3-registry.md)
|
|
||||||
- [nix registry add](command-ref/new-cli/nix3-registry-add.md)
|
|
||||||
- [nix registry list](command-ref/new-cli/nix3-registry-list.md)
|
|
||||||
- [nix registry pin](command-ref/new-cli/nix3-registry-pin.md)
|
|
||||||
- [nix registry remove](command-ref/new-cli/nix3-registry-remove.md)
|
|
||||||
- [nix repl](command-ref/new-cli/nix3-repl.md)
|
|
||||||
- [nix run](command-ref/new-cli/nix3-run.md)
|
|
||||||
- [nix search](command-ref/new-cli/nix3-search.md)
|
|
||||||
- [nix shell](command-ref/new-cli/nix3-shell.md)
|
|
||||||
- [nix store](command-ref/new-cli/nix3-store.md)
|
|
||||||
- [nix store add-file](command-ref/new-cli/nix3-store-add-file.md)
|
|
||||||
- [nix store add-path](command-ref/new-cli/nix3-store-add-path.md)
|
|
||||||
- [nix store cat](command-ref/new-cli/nix3-store-cat.md)
|
|
||||||
- [nix store copy-log](command-ref/new-cli/nix3-store-copy-log.md)
|
|
||||||
- [nix store copy-sigs](command-ref/new-cli/nix3-store-copy-sigs.md)
|
|
||||||
- [nix store delete](command-ref/new-cli/nix3-store-delete.md)
|
|
||||||
- [nix store diff-closures](command-ref/new-cli/nix3-store-diff-closures.md)
|
|
||||||
- [nix store dump-path](command-ref/new-cli/nix3-store-dump-path.md)
|
|
||||||
- [nix store gc](command-ref/new-cli/nix3-store-gc.md)
|
|
||||||
- [nix store ls](command-ref/new-cli/nix3-store-ls.md)
|
|
||||||
- [nix store make-content-addressed](command-ref/new-cli/nix3-store-make-content-addressed.md)
|
|
||||||
- [nix store optimise](command-ref/new-cli/nix3-store-optimise.md)
|
|
||||||
- [nix store path-from-hash-part](command-ref/new-cli/nix3-store-path-from-hash-part.md)
|
|
||||||
- [nix store ping](command-ref/new-cli/nix3-store-ping.md)
|
|
||||||
- [nix store prefetch-file](command-ref/new-cli/nix3-store-prefetch-file.md)
|
|
||||||
- [nix store repair](command-ref/new-cli/nix3-store-repair.md)
|
|
||||||
- [nix store sign](command-ref/new-cli/nix3-store-sign.md)
|
|
||||||
- [nix store verify](command-ref/new-cli/nix3-store-verify.md)
|
|
||||||
- [nix upgrade-nix](command-ref/new-cli/nix3-upgrade-nix.md)
|
|
||||||
- [nix why-depends](command-ref/new-cli/nix3-why-depends.md)
|
|
||||||
- [Files](command-ref/files.md)
|
- [Files](command-ref/files.md)
|
||||||
- [nix.conf](command-ref/conf-file.md)
|
- [nix.conf](command-ref/conf-file.md)
|
||||||
- [Profiles](command-ref/files/profiles.md)
|
- [Profiles](command-ref/files/profiles.md)
|
||||||
|
@ -195,7 +109,7 @@
|
||||||
- [CLI guideline](contributing/cli-guideline.md)
|
- [CLI guideline](contributing/cli-guideline.md)
|
||||||
- [C++ style guide](contributing/cxx.md)
|
- [C++ style guide](contributing/cxx.md)
|
||||||
- [Release Notes](release-notes/release-notes.md)
|
- [Release Notes](release-notes/release-notes.md)
|
||||||
- [Upcoming release](release-notes/rl-next.md)
|
{{#include ./SUMMARY-rl-next.md}}
|
||||||
- [Release 2.18 (2023-09-20)](release-notes/rl-2.18.md)
|
- [Release 2.18 (2023-09-20)](release-notes/rl-2.18.md)
|
||||||
- [Release 2.17 (2023-07-24)](release-notes/rl-2.17.md)
|
- [Release 2.17 (2023-07-24)](release-notes/rl-2.17.md)
|
||||||
- [Release 2.16 (2023-05-31)](release-notes/rl-2.16.md)
|
- [Release 2.16 (2023-05-31)](release-notes/rl-2.16.md)
|
|
@ -27,3 +27,4 @@
|
||||||
/package-management/channels* /command-ref/nix-channel 301!
|
/package-management/channels* /command-ref/nix-channel 301!
|
||||||
|
|
||||||
/package-management/s3-substituter* /command-ref/new-cli/nix3-help-stores#s3-binary-cache-store 301!
|
/package-management/s3-substituter* /command-ref/new-cli/nix3-help-stores#s3-binary-cache-store 301!
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
# Tuning Cores and Jobs
|
# Tuning Cores and Jobs
|
||||||
|
|
||||||
Lix has two relevant settings with regards to how your CPU cores will
|
Nix has two relevant settings with regards to how your CPU cores will
|
||||||
be utilized: `cores` and `max-jobs`. This chapter will talk about what
|
be utilized: `cores` and `max-jobs`. This chapter will talk about what
|
||||||
they are, how they interact, and their configuration trade-offs.
|
they are, how they interact, and their configuration trade-offs.
|
||||||
|
|
||||||
- `max-jobs`\
|
- `max-jobs`\
|
||||||
Dictates how many separate derivations will be built at the same
|
Dictates how many separate derivations will be built at the same
|
||||||
time. If you set this to zero, the local machine will do no
|
time. If you set this to zero, the local machine will do no
|
||||||
builds. Lix will still substitute from binary caches, and build
|
builds. Nix will still substitute from binary caches, and build
|
||||||
remotely if remote builders are configured.
|
remotely if remote builders are configured.
|
||||||
|
|
||||||
- `cores`\
|
- `cores`\
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Verifying Build Reproducibility
|
# Verifying Build Reproducibility
|
||||||
|
|
||||||
You can use Lix's `diff-hook` setting to compare build results. Note
|
You can use Nix's `diff-hook` setting to compare build results. Note
|
||||||
that this hook is only executed if the results differ; it is not used
|
that this hook is only executed if the results differ; it is not used
|
||||||
for determining if the results are the same.
|
for determining if the results are the same.
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ built.
|
||||||
Verify a path which already exists in the Nix store by passing `--check`
|
Verify a path which already exists in the Nix store by passing `--check`
|
||||||
to the build command.
|
to the build command.
|
||||||
|
|
||||||
If the build passes and is deterministic, Lix will exit with a status
|
If the build passes and is deterministic, Nix will exit with a status
|
||||||
code of 0:
|
code of 0:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
|
@ -59,7 +59,7 @@ checking outputs of '/nix/store/z98fasz2jqy9gs0xbvdj939p27jwda38-stable.drv'...
|
||||||
/nix/store/yyxlzw3vqaas7wfp04g0b1xg51f2czgq-stable
|
/nix/store/yyxlzw3vqaas7wfp04g0b1xg51f2czgq-stable
|
||||||
```
|
```
|
||||||
|
|
||||||
If the build is not deterministic, Lix will exit with a status code of
|
If the build is not deterministic, Nix will exit with a status code of
|
||||||
1:
|
1:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
|
@ -75,7 +75,7 @@ error: derivation '/nix/store/cgl13lbj1w368r5z8gywipl1ifli7dhk-unstable.drv' may
|
||||||
not be deterministic: output '/nix/store/krpqk0l9ib0ibi1d2w52z293zw455cap-unstable' differs
|
not be deterministic: output '/nix/store/krpqk0l9ib0ibi1d2w52z293zw455cap-unstable' differs
|
||||||
```
|
```
|
||||||
|
|
||||||
In the Lix daemon's log, we will now see:
|
In the Nix daemon's log, we will now see:
|
||||||
|
|
||||||
```
|
```
|
||||||
For derivation /nix/store/cgl13lbj1w368r5z8gywipl1ifli7dhk-unstable.drv:
|
For derivation /nix/store/cgl13lbj1w368r5z8gywipl1ifli7dhk-unstable.drv:
|
||||||
|
@ -85,7 +85,7 @@ For derivation /nix/store/cgl13lbj1w368r5z8gywipl1ifli7dhk-unstable.drv:
|
||||||
> 30204
|
> 30204
|
||||||
```
|
```
|
||||||
|
|
||||||
Using `--check` with `--keep-failed` will cause Lix to keep the second
|
Using `--check` with `--keep-failed` will cause Nix to keep the second
|
||||||
build's output in a special, `.check` path:
|
build's output in a special, `.check` path:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
|
@ -98,7 +98,7 @@ from '/nix/store/krpqk0l9ib0ibi1d2w52z293zw455cap-unstable.check'
|
||||||
```
|
```
|
||||||
|
|
||||||
In particular, notice the
|
In particular, notice the
|
||||||
`/nix/store/krpqk0l9ib0ibi1d2w52z293zw455cap-unstable.check` output. Lix
|
`/nix/store/krpqk0l9ib0ibi1d2w52z293zw455cap-unstable.check` output. Nix
|
||||||
has copied the build results to that directory where you can examine it.
|
has copied the build results to that directory where you can examine it.
|
||||||
|
|
||||||
> []{#check-dirs-are-unregistered} **Note**
|
> []{#check-dirs-are-unregistered} **Note**
|
||||||
|
@ -114,7 +114,7 @@ has copied the build results to that directory where you can examine it.
|
||||||
> build was not deterministic and also a check path does not exist.
|
> build was not deterministic and also a check path does not exist.
|
||||||
|
|
||||||
`--check` is only usable if the derivation has been built on the system
|
`--check` is only usable if the derivation has been built on the system
|
||||||
already. If the derivation has not been built Lix will fail with the
|
already. If the derivation has not been built Nix will fail with the
|
||||||
error:
|
error:
|
||||||
|
|
||||||
error: some outputs of '/nix/store/hzi1h60z2qf0nb85iwnpvrai3j2w7rr6-unstable.drv'
|
error: some outputs of '/nix/store/hzi1h60z2qf0nb85iwnpvrai3j2w7rr6-unstable.drv'
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
# Remote Builds
|
# Remote Builds
|
||||||
|
|
||||||
Lix supports remote builds, where a local Lix installation can forward
|
Nix supports remote builds, where a local Nix installation can forward
|
||||||
Nix builds to other machines. This allows multiple builds to be
|
Nix builds to other machines. This allows multiple builds to be
|
||||||
performed in parallel and allows Lix to perform multi-platform builds in
|
performed in parallel and allows Nix to perform multi-platform builds in
|
||||||
a semi-transparent way. For instance, if you perform a build for a
|
a semi-transparent way. For instance, if you perform a build for a
|
||||||
`x86_64-darwin` on an `i686-linux` machine, Lix can automatically
|
`x86_64-darwin` on an `i686-linux` machine, Nix can automatically
|
||||||
forward the build to a `x86_64-darwin` machine, if available.
|
forward the build to a `x86_64-darwin` machine, if available.
|
||||||
|
|
||||||
To forward a build to a remote machine, it’s required that the remote
|
To forward a build to a remote machine, it’s required that the remote
|
||||||
|
@ -38,15 +38,12 @@ contains Nix.
|
||||||
|
|
||||||
> **Warning**
|
> **Warning**
|
||||||
>
|
>
|
||||||
> If you are building via the Lix daemon (default on Linux and macOS), it is the Lix daemon user account (that is, `root`) that should have SSH access to a user (not necessarily `root`) on the remote machine.
|
> If you are building via the Nix daemon, it is the Nix daemon user account (that is, `root`) that should have SSH access to a user (not necessarily `root`) on the remote machine.
|
||||||
>
|
|
||||||
> Furthermore, `root` needs to have the public host keys for the remote system in its `.ssh/known_hosts`.
|
|
||||||
> To add them to `known_hosts` for root, do `ssh-keyscan USER@HOST | sudo tee -a ~root/.ssh/known_hosts`.
|
|
||||||
>
|
>
|
||||||
> If you can’t or don’t want to configure `root` to be able to access the remote machine, you can use a private Nix store instead by passing e.g. `--store ~/my-nix` when running a Nix command from the local machine.
|
> If you can’t or don’t want to configure `root` to be able to access the remote machine, you can use a private Nix store instead by passing e.g. `--store ~/my-nix` when running a Nix command from the local machine.
|
||||||
|
|
||||||
The list of remote machines can be specified on the command line or in
|
The list of remote machines can be specified on the command line or in
|
||||||
the Lix configuration file. The former is convenient for testing. For
|
the Nix configuration file. The former is convenient for testing. For
|
||||||
example, the following command allows you to build a derivation for
|
example, the following command allows you to build a derivation for
|
||||||
`x86_64-darwin` on a Linux machine:
|
`x86_64-darwin` on a Linux machine:
|
||||||
|
|
||||||
|
@ -87,17 +84,17 @@ default, set it to `-`.
|
||||||
3. The SSH identity file to be used to log in to the remote machine. If
|
3. The SSH identity file to be used to log in to the remote machine. If
|
||||||
omitted, SSH will use its regular identities.
|
omitted, SSH will use its regular identities.
|
||||||
|
|
||||||
4. The maximum number of builds that Lix will execute in parallel on
|
4. The maximum number of builds that Nix will execute in parallel on
|
||||||
the machine. Typically this should be equal to the number of CPU
|
the machine. Typically this should be equal to the number of CPU
|
||||||
cores. For instance, the machine `itchy` in the example will execute
|
cores. For instance, the machine `itchy` in the example will execute
|
||||||
up to 8 builds in parallel.
|
up to 8 builds in parallel.
|
||||||
|
|
||||||
5. The “speed factor”, indicating the relative speed of the machine. If
|
5. The “speed factor”, indicating the relative speed of the machine. If
|
||||||
there are multiple machines of the right type, Lix will prefer the
|
there are multiple machines of the right type, Nix will prefer the
|
||||||
fastest, taking load into account.
|
fastest, taking load into account.
|
||||||
|
|
||||||
6. A comma-separated list of *supported features*. If a derivation has
|
6. A comma-separated list of *supported features*. If a derivation has
|
||||||
the `requiredSystemFeatures` attribute, then Lix will only perform
|
the `requiredSystemFeatures` attribute, then Nix will only perform
|
||||||
the derivation on a machine that has the specified features. For
|
the derivation on a machine that has the specified features. For
|
||||||
instance, the attribute
|
instance, the attribute
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ simple and working example, but it is not suitable for all use cases.
|
||||||
The post build hook program runs after each executed build, and blocks
|
The post build hook program runs after each executed build, and blocks
|
||||||
the build loop. The build loop exits if the hook program fails.
|
the build loop. The build loop exits if the hook program fails.
|
||||||
|
|
||||||
Concretely, this implementation will make Lix slow or unusable when the
|
Concretely, this implementation will make Nix slow or unusable when the
|
||||||
internet is slow or unreliable.
|
internet is slow or unreliable.
|
||||||
|
|
||||||
A more advanced implementation might pass the store paths to a
|
A more advanced implementation might pass the store paths to a
|
||||||
|
@ -76,7 +76,7 @@ Then make sure the hook program is executable by the `root` user:
|
||||||
# chmod +x /etc/nix/upload-to-cache.sh
|
# chmod +x /etc/nix/upload-to-cache.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
# Updating Lix Configuration
|
# Updating Nix Configuration
|
||||||
|
|
||||||
Edit `/etc/nix/nix.conf` to run our hook, by adding the following
|
Edit `/etc/nix/nix.conf` to run our hook, by adding the following
|
||||||
configuration snippet at the end:
|
configuration snippet at the end:
|
||||||
|
@ -119,7 +119,7 @@ warning: you did not specify '--add-root'; the result might be removed by the ga
|
||||||
|
|
||||||
# Conclusion
|
# Conclusion
|
||||||
|
|
||||||
We now have a Lix installation configured to automatically sign and
|
We now have a Nix installation configured to automatically sign and
|
||||||
upload every local build to a remote binary cache.
|
upload every local build to a remote binary cache.
|
||||||
|
|
||||||
Before deploying this to production, be sure to consider the
|
Before deploying this to production, be sure to consider the
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Architecture
|
# Architecture
|
||||||
|
|
||||||
This chapter describes how Nix works.
|
This chapter describes how Nix works.
|
||||||
It should help users understand why Lix behaves as it does, and it should help developers understand how to modify Lix and how to write similar tools.
|
It should help users understand why Nix behaves as it does, and it should help developers understand how to modify Nix and how to write similar tools.
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
|
@ -21,8 +21,8 @@ The following [concept map] shows its main components (rectangles), the objects
|
||||||
| passed to
|
| passed to
|
||||||
| |
|
| |
|
||||||
+----------|-------------------|--------------------------------+
|
+----------|-------------------|--------------------------------+
|
||||||
| Nix impl.| V |
|
| Nix | V |
|
||||||
| (Lix) | +-------------------------+ |
|
| | +-------------------------+ |
|
||||||
| | | commmand line interface |------. |
|
| | | commmand line interface |------. |
|
||||||
| | +-------------------------+ | |
|
| | +-------------------------+ | |
|
||||||
| | | | |
|
| | | | |
|
||||||
|
@ -112,3 +112,4 @@ Build inputs used as instructions to a build task are marked accordingly:
|
||||||
| |
|
| |
|
||||||
+--------------------------------------------------------------------+
|
+--------------------------------------------------------------------+
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# File System Object
|
# File System Object
|
||||||
|
|
||||||
Nix implementations use a simplified model of the file system, which consists of file system objects.
|
Nix uses a simplified model of the file system, which consists of file system objects.
|
||||||
Every file system object is one of the following:
|
Every file system object is one of the following:
|
||||||
|
|
||||||
- File
|
- File
|
||||||
|
@ -15,7 +15,7 @@ Every file system object is one of the following:
|
||||||
- [Symbolic link](https://en.m.wikipedia.org/wiki/Symbolic_link)
|
- [Symbolic link](https://en.m.wikipedia.org/wiki/Symbolic_link)
|
||||||
|
|
||||||
An arbitrary string.
|
An arbitrary string.
|
||||||
Nix implementations do not assign any semantics to symbolic links.
|
Nix does not assign any semantics to symbolic links.
|
||||||
|
|
||||||
File system objects and their children form a tree.
|
File system objects and their children form a tree.
|
||||||
A bare file or symlink can be a root file system object.
|
A bare file or symlink can be a root file system object.
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
This section lists commands and options that you can use when you work
|
This section lists commands and options that you can use when you work
|
||||||
with Lix.
|
with Nix.
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
# Name
|
# Name
|
||||||
|
|
||||||
`nix.conf` - Lix configuration file
|
`nix.conf` - Nix configuration file
|
||||||
|
|
||||||
# Description
|
# Description
|
||||||
|
|
||||||
Lix supports a variety of configuration settings, which are read from configuration files or taken as command line flags.
|
Nix supports a variety of configuration settings, which are read from configuration files or taken as command line flags.
|
||||||
|
|
||||||
## Configuration file
|
## Configuration file
|
||||||
|
|
||||||
By default Lix reads settings from the following places, in that order:
|
By default Nix reads settings from the following places, in that order:
|
||||||
|
|
||||||
1. The system-wide configuration file `sysconfdir/nix/nix.conf` (i.e. `/etc/nix/nix.conf` on most systems), or `$NIX_CONF_DIR/nix.conf` if [`NIX_CONF_DIR`](./env-common.md#env-NIX_CONF_DIR) is set.
|
1. The system-wide configuration file `sysconfdir/nix/nix.conf` (i.e. `/etc/nix/nix.conf` on most systems), or `$NIX_CONF_DIR/nix.conf` if [`NIX_CONF_DIR`](./env-common.md#env-NIX_CONF_DIR) is set.
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ By default Lix reads settings from the following places, in that order:
|
||||||
|
|
||||||
1. If [`NIX_USER_CONF_FILES`](./env-common.md#env-NIX_USER_CONF_FILES) is set, then each path separated by `:` will be loaded in reverse order.
|
1. If [`NIX_USER_CONF_FILES`](./env-common.md#env-NIX_USER_CONF_FILES) is set, then each path separated by `:` will be loaded in reverse order.
|
||||||
|
|
||||||
Otherwise it will look for `nix/nix.conf` files in `XDG_CONFIG_DIRS` and `XDG_CONFIG_HOME`.
|
Otherwise it will look for `nix/nix.conf` files in `XDG_CONFIG_DIRS` and [`XDG_CONFIG_HOME`](./env-common.md#env-XDG_CONFIG_HOME).
|
||||||
If unset, `XDG_CONFIG_DIRS` defaults to `/etc/xdg`, and `XDG_CONFIG_HOME` defaults to `$HOME/.config` as per [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html).
|
If unset, `XDG_CONFIG_DIRS` defaults to `/etc/xdg`, and `XDG_CONFIG_HOME` defaults to `$HOME/.config` as per [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html).
|
||||||
|
|
||||||
1. If [`NIX_CONFIG`](./env-common.md#env-NIX_CONFIG) is set, its contents are treated as the contents of a configuration file.
|
1. If [`NIX_CONFIG`](./env-common.md#env-NIX_CONFIG) is set, its contents are treated as the contents of a configuration file.
|
||||||
|
@ -68,4 +68,3 @@ The `extra-` prefix is supported for settings that take a list of items (e.g. `-
|
||||||
|
|
||||||
# Available settings
|
# Available settings
|
||||||
|
|
||||||
{{#include @generated@/command-ref/conf-file.md}}
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Common Environment Variables
|
# Common Environment Variables
|
||||||
|
|
||||||
Most commands in Lix interpret the following environment variables:
|
Most Nix commands interpret the following environment variables:
|
||||||
|
|
||||||
- <span id="env-IN_NIX_SHELL">[`IN_NIX_SHELL`](#env-IN_NIX_SHELL)</span>\
|
- <span id="env-IN_NIX_SHELL">[`IN_NIX_SHELL`](#env-IN_NIX_SHELL)</span>\
|
||||||
Indicator that tells if the current environment was set up by
|
Indicator that tells if the current environment was set up by
|
||||||
|
@ -13,7 +13,7 @@ Most commands in Lix interpret the following environment variables:
|
||||||
e.g. `/home/eelco/Dev:/etc/nixos`. It can be extended using the
|
e.g. `/home/eelco/Dev:/etc/nixos`. It can be extended using the
|
||||||
[`-I` option](@docroot@/command-ref/opt-common.md#opt-I).
|
[`-I` option](@docroot@/command-ref/opt-common.md#opt-I).
|
||||||
|
|
||||||
If `NIX_PATH` is not set at all, Lix will fall back to the following list in [impure](@docroot@/command-ref/conf-file.md#conf-pure-eval) and [unrestricted](@docroot@/command-ref/conf-file.md#conf-restrict-eval) evaluation mode:
|
If `NIX_PATH` is not set at all, Nix will fall back to the following list in [impure](@docroot@/command-ref/conf-file.md#conf-pure-eval) and [unrestricted](@docroot@/command-ref/conf-file.md#conf-restrict-eval) evaluation mode:
|
||||||
|
|
||||||
1. `$HOME/.nix-defexpr/channels`
|
1. `$HOME/.nix-defexpr/channels`
|
||||||
2. `nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixpkgs`
|
2. `nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixpkgs`
|
||||||
|
@ -50,28 +50,28 @@ Most commands in Lix interpret the following environment variables:
|
||||||
Overrides the location of the Nix store (default `prefix/store`).
|
Overrides the location of the Nix store (default `prefix/store`).
|
||||||
|
|
||||||
- <span id="env-NIX_DATA_DIR">[`NIX_DATA_DIR`](#env-NIX_DATA_DIR)</span>\
|
- <span id="env-NIX_DATA_DIR">[`NIX_DATA_DIR`](#env-NIX_DATA_DIR)</span>\
|
||||||
Overrides the location of the Lix static data directory (default
|
Overrides the location of the Nix static data directory (default
|
||||||
`prefix/share`).
|
`prefix/share`).
|
||||||
|
|
||||||
- <span id="env-NIX_LOG_DIR">[`NIX_LOG_DIR`](#env-NIX_LOG_DIR)</span>\
|
- <span id="env-NIX_LOG_DIR">[`NIX_LOG_DIR`](#env-NIX_LOG_DIR)</span>\
|
||||||
Overrides the location of the Lix log directory (default
|
Overrides the location of the Nix log directory (default
|
||||||
`prefix/var/log/nix`).
|
`prefix/var/log/nix`).
|
||||||
|
|
||||||
- <span id="env-NIX_STATE_DIR">[`NIX_STATE_DIR`](#env-NIX_STATE_DIR)</span>\
|
- <span id="env-NIX_STATE_DIR">[`NIX_STATE_DIR`](#env-NIX_STATE_DIR)</span>\
|
||||||
Overrides the location of the Lix state directory (default
|
Overrides the location of the Nix state directory (default
|
||||||
`prefix/var/nix`).
|
`prefix/var/nix`).
|
||||||
|
|
||||||
- <span id="env-NIX_CONF_DIR">[`NIX_CONF_DIR`](#env-NIX_CONF_DIR)</span>\
|
- <span id="env-NIX_CONF_DIR">[`NIX_CONF_DIR`](#env-NIX_CONF_DIR)</span>\
|
||||||
Overrides the location of the system Lix configuration directory
|
Overrides the location of the system Nix configuration directory
|
||||||
(default `prefix/etc/nix`).
|
(default `prefix/etc/nix`).
|
||||||
|
|
||||||
- <span id="env-NIX_CONFIG">[`NIX_CONFIG`](#env-NIX_CONFIG)</span>\
|
- <span id="env-NIX_CONFIG">[`NIX_CONFIG`](#env-NIX_CONFIG)</span>\
|
||||||
Applies settings from Lix configuration from the environment.
|
Applies settings from Nix configuration from the environment.
|
||||||
The content is treated as if it was read from a Lix configuration file.
|
The content is treated as if it was read from a Nix configuration file.
|
||||||
Settings are separated by the newline character.
|
Settings are separated by the newline character.
|
||||||
|
|
||||||
- <span id="env-NIX_USER_CONF_FILES">[`NIX_USER_CONF_FILES`](#env-NIX_USER_CONF_FILES)</span>\
|
- <span id="env-NIX_USER_CONF_FILES">[`NIX_USER_CONF_FILES`](#env-NIX_USER_CONF_FILES)</span>\
|
||||||
Overrides the location of the Lix user configuration files to load from.
|
Overrides the location of the Nix user configuration files to load from.
|
||||||
|
|
||||||
The default are the locations according to the [XDG Base Directory Specification].
|
The default are the locations according to the [XDG Base Directory Specification].
|
||||||
See the [XDG Base Directories](#xdg-base-directories) sub-section for details.
|
See the [XDG Base Directories](#xdg-base-directories) sub-section for details.
|
||||||
|
@ -84,19 +84,19 @@ Most commands in Lix interpret the following environment variables:
|
||||||
substantial amounts of disk space. The default is `/tmp`.
|
substantial amounts of disk space. The default is `/tmp`.
|
||||||
|
|
||||||
- <span id="env-NIX_REMOTE">[`NIX_REMOTE`](#env-NIX_REMOTE)</span>\
|
- <span id="env-NIX_REMOTE">[`NIX_REMOTE`](#env-NIX_REMOTE)</span>\
|
||||||
This variable should be set to `daemon` if you want to use the Lix
|
This variable should be set to `daemon` if you want to use the Nix
|
||||||
daemon to execute Nix operations. This is necessary in [multi-user
|
daemon to execute Nix operations. This is necessary in [multi-user
|
||||||
Nix installations](@docroot@/installation/multi-user.md). If the Lix
|
Nix installations](@docroot@/installation/multi-user.md). If the Nix
|
||||||
daemon's Unix socket is at some non-standard path, this variable
|
daemon's Unix socket is at some non-standard path, this variable
|
||||||
should be set to `unix://path/to/socket`. Otherwise, it should be
|
should be set to `unix://path/to/socket`. Otherwise, it should be
|
||||||
left unset.
|
left unset.
|
||||||
|
|
||||||
- <span id="env-NIX_SHOW_STATS">[`NIX_SHOW_STATS`](#env-NIX_SHOW_STATS)</span>\
|
- <span id="env-NIX_SHOW_STATS">[`NIX_SHOW_STATS`](#env-NIX_SHOW_STATS)</span>\
|
||||||
If set to `1`, Lix will print some evaluation statistics, such as
|
If set to `1`, Nix will print some evaluation statistics, such as
|
||||||
the number of values allocated.
|
the number of values allocated.
|
||||||
|
|
||||||
- <span id="env-NIX_COUNT_CALLS">[`NIX_COUNT_CALLS`](#env-NIX_COUNT_CALLS)</span>\
|
- <span id="env-NIX_COUNT_CALLS">[`NIX_COUNT_CALLS`](#env-NIX_COUNT_CALLS)</span>\
|
||||||
If set to `1`, Lix will print how often functions were called during
|
If set to `1`, Nix will print how often functions were called during
|
||||||
Nix expression evaluation. This is useful for profiling your Nix
|
Nix expression evaluation. This is useful for profiling your Nix
|
||||||
expressions.
|
expressions.
|
||||||
|
|
||||||
|
@ -108,16 +108,16 @@ Most commands in Lix interpret the following environment variables:
|
||||||
|
|
||||||
## XDG Base Directories
|
## XDG Base Directories
|
||||||
|
|
||||||
Lix follows the [XDG Base Directory Specification].
|
Nix follows the [XDG Base Directory Specification].
|
||||||
|
|
||||||
For backwards compatibility, commands in Lix will follow the standard only when [`use-xdg-base-directories`] is enabled.
|
For backwards compatibility, Nix commands will follow the standard only when [`use-xdg-base-directories`] is enabled.
|
||||||
[New Nix commands](@docroot@/command-ref/new-cli/nix.md) (experimental) conform to the standard by default.
|
[New Nix commands](@docroot@/command-ref/new-cli/nix.md) (experimental) conform to the standard by default.
|
||||||
|
|
||||||
The following environment variables are used to determine locations of various state and configuration files:
|
The following environment variables are used to determine locations of various state and configuration files:
|
||||||
|
|
||||||
- `XDG_CONFIG_HOME` (default `~/.config`)
|
- [`XDG_CONFIG_HOME`]{#env-XDG_CONFIG_HOME} (default `~/.config`)
|
||||||
- `XDG_STATE_HOME` (default `~/.local/state`)
|
- [`XDG_STATE_HOME`]{#env-XDG_STATE_HOME} (default `~/.local/state`)
|
||||||
- `XDG_CACHE_HOME` (default `~/.cache`)
|
- [`XDG_CACHE_HOME`]{#env-XDG_CACHE_HOME} (default `~/.cache`)
|
||||||
|
|
||||||
|
|
||||||
[XDG Base Directory Specification]: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
[XDG Base Directory Specification]: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Files
|
# Files
|
||||||
|
|
||||||
This section lists configuration files that you can use when you work
|
This section lists configuration files that you can use when you work
|
||||||
with Lix.
|
with Nix.
|
||||||
|
|
|
@ -21,7 +21,7 @@ lrwxrwxrwx 1 alice users 51 Oct 29 13:20 /home/alice/.local/state/nix/profiles/p
|
||||||
lrwxrwxrwx 1 alice users 51 Nov 25 14:35 /home/alice/.local/state/nix/profiles/profile-7-link -> /nix/store/mp0x6xnsg0b8qhswy6riqvimai4gm677-profile
|
lrwxrwxrwx 1 alice users 51 Nov 25 14:35 /home/alice/.local/state/nix/profiles/profile-7-link -> /nix/store/mp0x6xnsg0b8qhswy6riqvimai4gm677-profile
|
||||||
```
|
```
|
||||||
|
|
||||||
Each of these symlinks is a root for the Lix garbage collector.
|
Each of these symlinks is a root for the Nix garbage collector.
|
||||||
|
|
||||||
The contents of the store path corresponding to each version of the
|
The contents of the store path corresponding to each version of the
|
||||||
profile is a tree of symlinks to the files of the installed packages,
|
profile is a tree of symlinks to the files of the installed packages,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Main Commands
|
# Main Commands
|
||||||
|
|
||||||
This section lists commands and options that you can use when you work
|
This section lists commands and options that you can use when you work
|
||||||
with Lix.
|
with Nix.
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
xp_features_json = custom_target(
|
|
||||||
command : [nix, '__dump-xp-features'],
|
|
||||||
capture : true,
|
|
||||||
output : 'xp-features.json',
|
|
||||||
)
|
|
||||||
|
|
||||||
experimental_features_shortlist_md = custom_target(
|
|
||||||
command : nix_eval_for_docs + [
|
|
||||||
'--expr',
|
|
||||||
'import @INPUT0@ (builtins.fromJSON (builtins.readFile @INPUT1@))',
|
|
||||||
],
|
|
||||||
input : [
|
|
||||||
'../../generate-xp-features-shortlist.nix',
|
|
||||||
xp_features_json,
|
|
||||||
],
|
|
||||||
capture : true,
|
|
||||||
output : 'experimental-features-shortlist.md',
|
|
||||||
env : nix_env_for_docs,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Intermediate step for manpage generation.
|
|
||||||
# This splorks the output of generate-manpage.nix as JSON,
|
|
||||||
# which gets written as a directory tree below.
|
|
||||||
nix3_cli_files_json = custom_target(
|
|
||||||
command : nix_eval_for_docs_common + [
|
|
||||||
'--json',
|
|
||||||
'--expr',
|
|
||||||
'import @INPUT0@ true (builtins.readFile @INPUT1@)',
|
|
||||||
],
|
|
||||||
input : [
|
|
||||||
'../../generate-manpage.nix',
|
|
||||||
nix3_cli_json,
|
|
||||||
],
|
|
||||||
capture : true,
|
|
||||||
output : 'new-cli.json',
|
|
||||||
env : nix_env_for_docs,
|
|
||||||
)
|
|
||||||
nix3_cli_files = custom_target(
|
|
||||||
command : [
|
|
||||||
python,
|
|
||||||
'@INPUT0@',
|
|
||||||
'-i', '@INPUT1@',
|
|
||||||
'-o', '@OUTPUT@',
|
|
||||||
],
|
|
||||||
input : [
|
|
||||||
'../../json-to-tree.py',
|
|
||||||
nix3_cli_files_json,
|
|
||||||
],
|
|
||||||
output : 'new-cli',
|
|
||||||
)
|
|
||||||
|
|
||||||
conf_file_md = custom_target(
|
|
||||||
command : [
|
|
||||||
nix_eval_for_docs,
|
|
||||||
'--expr',
|
|
||||||
'(import @INPUT0@).showSettings { inlineHTML = true; } (builtins.fromJSON (builtins.readFile @INPUT1@))',
|
|
||||||
],
|
|
||||||
capture : true,
|
|
||||||
input : [
|
|
||||||
'../../utils.nix',
|
|
||||||
conf_file_json,
|
|
||||||
experimental_features_shortlist_md,
|
|
||||||
],
|
|
||||||
output : 'conf-file.md',
|
|
||||||
env : nix_env_for_docs,
|
|
||||||
)
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-build.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-bundle.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-config-show.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-config.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-copy.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-daemon.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-derivation-add.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-derivation-show.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-derivation.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-develop.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-doctor.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-edit.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-eval.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-archive.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-check.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-clone.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-info.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-init.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-lock.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-metadata.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-new.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-prefetch.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-show.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake-update.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-flake.md}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{#include @generated@/command-ref/new-cli/nix3-fmt.md}}
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue