forked from lix-project/lix
Merge remote-tracking branch 'origin/master' into flakes
This commit is contained in:
commit
941f95284a
27
.github/ISSUE_TEMPLATE.md
vendored
27
.github/ISSUE_TEMPLATE.md
vendored
|
@ -1,27 +0,0 @@
|
||||||
<!--
|
|
||||||
|
|
||||||
# Filing a Nix issue
|
|
||||||
|
|
||||||
*WAIT* Are you sure you're filing your issue in the right repository?
|
|
||||||
|
|
||||||
We appreciate you taking the time to tell us about issues you encounter, but routing the issue to the right place will get you help sooner and save everyone time.
|
|
||||||
|
|
||||||
This is the Nix repository, and issues here should be about Nix the build and package management *_tool_*.
|
|
||||||
|
|
||||||
If you have a problem with a specific package on NixOS or when using Nix, you probably want to file an issue with _nixpkgs_, whose issue tracker is over at https://github.com/NixOS/nixpkgs/issues.
|
|
||||||
|
|
||||||
Examples of _Nix_ issues:
|
|
||||||
|
|
||||||
- Nix segfaults when I run `nix-build -A blahblah`
|
|
||||||
- The Nix language needs a new builtin: `builtins.foobar`
|
|
||||||
- Regression in the behavior of `nix-env` in Nix 2.0
|
|
||||||
|
|
||||||
Examples of _nixpkgs_ issues:
|
|
||||||
|
|
||||||
- glibc is b0rked on aarch64
|
|
||||||
- chromium in NixOS doesn't support U2F but google-chrome does!
|
|
||||||
- The OpenJDK package on macOS is missing a key component
|
|
||||||
|
|
||||||
Chances are if you're a newcomer to the Nix world, you'll probably want the [nixpkgs tracker](https://github.com/NixOS/nixpkgs/issues). It also gets a lot more eyeball traffic so you'll probably get a response a lot more quickly.
|
|
||||||
|
|
||||||
-->
|
|
32
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
32
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
If you have a problem with a specific package or NixOS,
|
||||||
|
you probably want to file an issue at https://github.com/NixOS/nixpkgs/issues.
|
||||||
|
|
||||||
|
**Steps To Reproduce**
|
||||||
|
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**`nix-env --version` output**
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
|
||||||
|
Add any other context about the problem here.
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: improvement
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
56
README.md
56
README.md
|
@ -1,22 +1,54 @@
|
||||||
|
# Nix
|
||||||
|
|
||||||
[![Open Collective supporters](https://opencollective.com/nixos/tiers/supporter/badge.svg?label=Supporters&color=brightgreen)](https://opencollective.com/nixos)
|
[![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)
|
[![Test](https://github.com/NixOS/nix/workflows/Test/badge.svg)](https://github.com/NixOS/nix/actions)
|
||||||
|
|
||||||
Nix, the purely functional package manager
|
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.
|
||||||
|
|
||||||
Nix is a new take on package management that is fairly unique. Because of its
|
## Installation
|
||||||
purity aspects, a lot of issues found in traditional package managers don't
|
|
||||||
appear with Nix.
|
|
||||||
|
|
||||||
To find out more about the tool, usage and installation instructions, please
|
On Linux and macOS the easiest way to Install Nix is to run the following shell command
|
||||||
read the manual, which is available on the Nix website at
|
(as a user other than root):
|
||||||
<https://nixos.org/nix/manual>.
|
|
||||||
|
|
||||||
## Contributing
|
```
|
||||||
|
$ curl -L https://nixos.org/nix/install | sh
|
||||||
|
```
|
||||||
|
|
||||||
Take a look at the [Hacking Section](https://nixos.org/nix/manual/#chap-hacking)
|
Information on additional installation methods is available on the [Nix download page](https://nixos.org/download.html).
|
||||||
of the manual. It helps you to get started with building Nix from source.
|
|
||||||
|
## Building And Developing
|
||||||
|
|
||||||
|
### Building Nix
|
||||||
|
|
||||||
|
You can build Nix using one of the targets provided by [release.nix](./release.nix):
|
||||||
|
|
||||||
|
```
|
||||||
|
$ nix-build ./release.nix -A build.aarch64-linux
|
||||||
|
$ nix-build ./release.nix -A build.x86_64-darwin
|
||||||
|
$ nix-build ./release.nix -A build.i686-linux
|
||||||
|
$ nix-build ./release.nix -A build.x86_64-linux
|
||||||
|
```
|
||||||
|
|
||||||
|
### Development Environment
|
||||||
|
|
||||||
|
You can use the provided `shell.nix` to get a working development environment:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ nix-shell
|
||||||
|
$ ./bootstrap.sh
|
||||||
|
$ ./configure
|
||||||
|
$ make
|
||||||
|
```
|
||||||
|
|
||||||
|
## Additional Resources
|
||||||
|
|
||||||
|
- [Nix manual](https://nixos.org/nix/manual)
|
||||||
|
- [Nix jobsets on hydra.nixos.org](https://hydra.nixos.org/project/nix)
|
||||||
|
- [NixOS Discourse](https://discourse.nixos.org/)
|
||||||
|
- [IRC - #nixos on freenode.net](irc://irc.freenode.net/#nixos)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Nix is released under the LGPL v2.1
|
Nix is released under the [LGPL v2.1](./COPYING).
|
||||||
|
|
|
@ -116,7 +116,7 @@ static void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
|
||||||
name = state.forceStringNoCtx(*attr.value, *attr.pos);
|
name = state.forceStringNoCtx(*attr.value, *attr.pos);
|
||||||
else
|
else
|
||||||
throw EvalError("unsupported argument '%s' to '%s', at %s",
|
throw EvalError("unsupported argument '%s' to '%s', at %s",
|
||||||
attr.name, who, attr.pos);
|
attr.name, who, *attr.pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!url)
|
if (!url)
|
||||||
|
|
|
@ -2250,10 +2250,13 @@ void DerivationGoal::startBuilder()
|
||||||
|
|
||||||
if (chown(slaveName.c_str(), buildUser->getUID(), 0))
|
if (chown(slaveName.c_str(), buildUser->getUID(), 0))
|
||||||
throw SysError("changing owner of pseudoterminal slave");
|
throw SysError("changing owner of pseudoterminal slave");
|
||||||
} else {
|
}
|
||||||
|
#if __APPLE__
|
||||||
|
else {
|
||||||
if (grantpt(builderOut.readSide.get()))
|
if (grantpt(builderOut.readSide.get()))
|
||||||
throw SysError("granting access to pseudoterminal slave");
|
throw SysError("granting access to pseudoterminal slave");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// Mount the pt in the sandbox so that the "tty" command works.
|
// Mount the pt in the sandbox so that the "tty" command works.
|
||||||
|
|
|
@ -13,7 +13,8 @@ using namespace nix;
|
||||||
|
|
||||||
struct Var
|
struct Var
|
||||||
{
|
{
|
||||||
bool exported;
|
bool exported = true;
|
||||||
|
bool associative = false;
|
||||||
std::string value; // quoted string or array
|
std::string value; // quoted string or array
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,11 +49,17 @@ BuildEnvironment readEnvironment(const Path & path)
|
||||||
static std::string quotedStringRegex =
|
static std::string quotedStringRegex =
|
||||||
R"re((?:\$?'(?:[^'\\]|\\[abeEfnrtv\\'"?])*'))re";
|
R"re((?:\$?'(?:[^'\\]|\\[abeEfnrtv\\'"?])*'))re";
|
||||||
|
|
||||||
static std::string arrayRegex =
|
static std::string indexedArrayRegex =
|
||||||
R"re((?:\(( *\[[^\]]+\]="(?:[^"\\]|\\.)*")*\)))re";
|
R"re((?:\(( *\[[0-9]+]="(?:[^"\\]|\\.)*")**\)))re";
|
||||||
|
|
||||||
static std::regex varRegex(
|
static std::regex varRegex(
|
||||||
"^(" + varNameRegex + ")=(" + simpleStringRegex + "|" + quotedStringRegex + "|" + arrayRegex + ")\n");
|
"^(" + varNameRegex + ")=(" + simpleStringRegex + "|" + quotedStringRegex + "|" + indexedArrayRegex + ")\n");
|
||||||
|
|
||||||
|
/* Note: we distinguish between an indexed and associative array
|
||||||
|
using the space before the closing parenthesis. Will
|
||||||
|
undoubtedly regret this some day. */
|
||||||
|
static std::regex assocArrayRegex(
|
||||||
|
"^(" + varNameRegex + ")=" + R"re((?:\(( *\[[^\]]+\]="(?:[^"\\]|\\.)*")* *\)))re" + "\n");
|
||||||
|
|
||||||
static std::regex functionRegex(
|
static std::regex functionRegex(
|
||||||
"^" + varNameRegex + " \\(\\) *\n");
|
"^" + varNameRegex + " \\(\\) *\n");
|
||||||
|
@ -68,7 +75,12 @@ BuildEnvironment readEnvironment(const Path & path)
|
||||||
|
|
||||||
else if (std::regex_search(pos, file.cend(), match, varRegex)) {
|
else if (std::regex_search(pos, file.cend(), match, varRegex)) {
|
||||||
pos = match[0].second;
|
pos = match[0].second;
|
||||||
res.env.insert({match[1], Var { (bool) exported.count(match[1]), match[2] }});
|
res.env.insert({match[1], Var { .exported = exported.count(match[1]) > 0, .value = match[2] }});
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (std::regex_search(pos, file.cend(), match, assocArrayRegex)) {
|
||||||
|
pos = match[0].second;
|
||||||
|
res.env.insert({match[1], Var { .associative = true, .value = match[2] }});
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (std::regex_search(pos, file.cend(), match, functionRegex)) {
|
else if (std::regex_search(pos, file.cend(), match, functionRegex)) {
|
||||||
|
@ -83,27 +95,26 @@ BuildEnvironment readEnvironment(const Path & path)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const static std::string getEnvSh =
|
||||||
|
#include "get-env.sh.gen.hh"
|
||||||
|
;
|
||||||
|
|
||||||
/* Given an existing derivation, return the shell environment as
|
/* Given an existing derivation, return the shell environment as
|
||||||
initialised by stdenv's setup script. We do this by building a
|
initialised by stdenv's setup script. We do this by building a
|
||||||
modified derivation with the same dependencies and nearly the same
|
modified derivation with the same dependencies and nearly the same
|
||||||
initial environment variables, that just writes the resulting
|
initial environment variables, that just writes the resulting
|
||||||
environment to a file and exits. */
|
environment to a file and exits. */
|
||||||
StorePath getDerivationEnvironment(ref<Store> store, Derivation drv)
|
StorePath getDerivationEnvironment(ref<Store> store, const StorePath & drvPath)
|
||||||
{
|
{
|
||||||
|
auto drv = store->derivationFromPath(drvPath);
|
||||||
|
|
||||||
auto builder = baseNameOf(drv.builder);
|
auto builder = baseNameOf(drv.builder);
|
||||||
if (builder != "bash")
|
if (builder != "bash")
|
||||||
throw Error("'nix dev-shell' only works on derivations that use 'bash' as their builder");
|
throw Error("'nix dev-shell' only works on derivations that use 'bash' as their builder");
|
||||||
|
|
||||||
drv.args = {
|
auto getEnvShPath = store->addTextToStore("get-env.sh", getEnvSh, {});
|
||||||
"-c",
|
|
||||||
"set -e; "
|
drv.args = {store->printStorePath(getEnvShPath)};
|
||||||
"export IN_NIX_SHELL=impure; "
|
|
||||||
"export dontAddDisableDepTrack=1; "
|
|
||||||
"if [[ -n $stdenv ]]; then "
|
|
||||||
" source $stdenv/setup; "
|
|
||||||
"fi; "
|
|
||||||
"export > $out; "
|
|
||||||
"set >> $out "};
|
|
||||||
|
|
||||||
/* Remove derivation checks. */
|
/* Remove derivation checks. */
|
||||||
drv.env.erase("allowedReferences");
|
drv.env.erase("allowedReferences");
|
||||||
|
@ -111,15 +122,17 @@ StorePath getDerivationEnvironment(ref<Store> store, Derivation drv)
|
||||||
drv.env.erase("disallowedReferences");
|
drv.env.erase("disallowedReferences");
|
||||||
drv.env.erase("disallowedRequisites");
|
drv.env.erase("disallowedRequisites");
|
||||||
|
|
||||||
// FIXME: handle structured attrs
|
|
||||||
|
|
||||||
/* Rehash and write the derivation. FIXME: would be nice to use
|
/* Rehash and write the derivation. FIXME: would be nice to use
|
||||||
'buildDerivation', but that's privileged. */
|
'buildDerivation', but that's privileged. */
|
||||||
auto drvName = drv.env["name"] + "-env";
|
auto drvName = std::string(drvPath.name());
|
||||||
|
assert(hasSuffix(drvName, ".drv"));
|
||||||
|
drvName.resize(drvName.size() - 4);
|
||||||
|
drvName += "-env";
|
||||||
for (auto & output : drv.outputs)
|
for (auto & output : drv.outputs)
|
||||||
drv.env.erase(output.first);
|
drv.env.erase(output.first);
|
||||||
drv.env["out"] = "";
|
drv.env["out"] = "";
|
||||||
drv.env["outputs"] = "out";
|
drv.env["outputs"] = "out";
|
||||||
|
drv.inputSrcs.insert(std::move(getEnvShPath));
|
||||||
Hash h = hashDerivationModulo(*store, drv, true);
|
Hash h = hashDerivationModulo(*store, drv, true);
|
||||||
auto shellOutPath = store->makeOutputPath("out", h, drvName);
|
auto shellOutPath = store->makeOutputPath("out", h, drvName);
|
||||||
drv.outputs.insert_or_assign("out", DerivationOutput(shellOutPath.clone(), "", ""));
|
drv.outputs.insert_or_assign("out", DerivationOutput(shellOutPath.clone(), "", ""));
|
||||||
|
@ -159,15 +172,21 @@ struct Common : InstallableCommand, MixProfile
|
||||||
|
|
||||||
void makeRcScript(const BuildEnvironment & buildEnvironment, std::ostream & out)
|
void makeRcScript(const BuildEnvironment & buildEnvironment, std::ostream & out)
|
||||||
{
|
{
|
||||||
|
out << "unset shellHook\n";
|
||||||
|
|
||||||
out << "nix_saved_PATH=\"$PATH\"\n";
|
out << "nix_saved_PATH=\"$PATH\"\n";
|
||||||
|
|
||||||
for (auto & i : buildEnvironment.env) {
|
for (auto & i : buildEnvironment.env) {
|
||||||
if (!ignoreVars.count(i.first) && !hasPrefix(i.first, "BASH_")) {
|
if (!ignoreVars.count(i.first) && !hasPrefix(i.first, "BASH_")) {
|
||||||
|
if (i.second.associative)
|
||||||
|
out << fmt("declare -A %s=(%s)\n", i.first, i.second.value);
|
||||||
|
else {
|
||||||
out << fmt("%s=%s\n", i.first, i.second.value);
|
out << fmt("%s=%s\n", i.first, i.second.value);
|
||||||
if (i.second.exported)
|
if (i.second.exported)
|
||||||
out << fmt("export %s\n", i.first);
|
out << fmt("export %s\n", i.first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
out << "PATH=\"$PATH:$nix_saved_PATH\"\n";
|
out << "PATH=\"$PATH:$nix_saved_PATH\"\n";
|
||||||
|
|
||||||
|
@ -201,7 +220,7 @@ struct Common : InstallableCommand, MixProfile
|
||||||
|
|
||||||
auto & drvPath = *drvs.begin();
|
auto & drvPath = *drvs.begin();
|
||||||
|
|
||||||
return getDerivationEnvironment(store, store->derivationFromPath(drvPath));
|
return getDerivationEnvironment(store, drvPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
9
src/nix/get-env.sh
Normal file
9
src/nix/get-env.sh
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
set -e
|
||||||
|
if [ -e .attrs.sh ]; then source .attrs.sh; fi
|
||||||
|
export IN_NIX_SHELL=impure
|
||||||
|
export dontAddDisableDepTrack=1
|
||||||
|
if [[ -n $stdenv ]]; then
|
||||||
|
source $stdenv/setup
|
||||||
|
fi
|
||||||
|
export > $out
|
||||||
|
set >> $out
|
|
@ -28,4 +28,6 @@ $(eval $(call install-symlink, $(bindir)/nix, $(libexecdir)/nix/build-remote))
|
||||||
|
|
||||||
src/nix-env/user-env.cc: src/nix-env/buildenv.nix.gen.hh
|
src/nix-env/user-env.cc: src/nix-env/buildenv.nix.gen.hh
|
||||||
|
|
||||||
|
src/nix/dev-shell.cc: src/nix/get-env.sh.gen.hh
|
||||||
|
|
||||||
$(d)/flake.cc: $(d)/flake-template.nix.gen.hh
|
$(d)/flake.cc: $(d)/flake-template.nix.gen.hh
|
||||||
|
|
Loading…
Reference in a new issue