2016-02-09 22:28:29 +02:00
# pragma once
2020-03-30 20:14:17 +03:00
# include "installables.hh"
2016-02-09 22:28:29 +02:00
# include "args.hh"
2017-10-24 13:45:11 +03:00
# include "common-eval-args.hh"
2019-12-05 20:11:09 +02:00
# include "path.hh"
2020-02-07 15:22:01 +02:00
# include "eval.hh"
2016-02-09 22:28:29 +02:00
namespace nix {
2018-01-31 17:14:47 +02:00
extern std : : string programPath ;
2019-10-27 19:45:02 +02:00
/* A command that requires a Nix store. */
2016-02-09 22:28:29 +02:00
struct StoreCommand : virtual Command
{
2016-03-21 19:03:36 +02:00
StoreCommand ( ) ;
2016-02-09 22:28:29 +02:00
void run ( ) override ;
2017-04-25 12:20:37 +03:00
ref < Store > getStore ( ) ;
2017-03-16 15:25:54 +02:00
virtual ref < Store > createStore ( ) ;
2016-02-09 22:28:29 +02:00
virtual void run ( ref < Store > ) = 0 ;
2017-04-25 12:20:37 +03:00
private :
std : : shared_ptr < Store > _store ;
2016-02-09 22:28:29 +02:00
} ;
2020-03-30 20:14:17 +03:00
struct SourceExprCommand : virtual StoreCommand , MixEvalArgs
2017-04-25 13:06:32 +03:00
{
Path file ;
2017-10-24 13:45:11 +03:00
SourceExprCommand ( ) ;
2017-04-25 13:06:32 +03:00
/* Return a value representing the Nix expression from which we
are installing . This is either the file specified by ‘ - - file ’ ,
or an attribute set constructed from $ NIX_PATH , e . g . ‘ { nixpkgs
= import . . . ; bla = import . . . ; } ’ . */
Value * getSourceExpr ( EvalState & state ) ;
2017-07-17 20:02:56 +03:00
ref < EvalState > getEvalState ( ) ;
private :
std : : shared_ptr < EvalState > evalState ;
2020-04-16 17:54:34 +03:00
RootValue vSourceExpr ;
2017-07-17 20:02:56 +03:00
} ;
2017-09-10 16:58:30 +03:00
enum RealiseMode { Build , NoBuild , DryRun } ;
2017-07-17 20:02:56 +03:00
/* A command that operates on a list of "installables", which can be
store paths , attribute paths , Nix expressions , etc . */
struct InstallablesCommand : virtual Args , SourceExprCommand
{
std : : vector < std : : shared_ptr < Installable > > installables ;
InstallablesCommand ( )
{
expectArgs ( " installables " , & _installables ) ;
}
2017-04-25 13:06:32 +03:00
void prepare ( ) override ;
2017-05-02 16:28:35 +03:00
virtual bool useDefaultInstallables ( ) { return true ; }
2017-04-25 13:06:32 +03:00
private :
2017-10-24 13:45:11 +03:00
std : : vector < std : : string > _installables ;
2017-04-25 13:06:32 +03:00
} ;
2019-10-27 19:45:02 +02:00
/* A command that operates on exactly one "installable" */
2017-08-29 17:18:00 +03:00
struct InstallableCommand : virtual Args , SourceExprCommand
{
std : : shared_ptr < Installable > installable ;
InstallableCommand ( )
{
expectArg ( " installable " , & _installable ) ;
}
void prepare ( ) override ;
private :
std : : string _installable ;
} ;
2017-04-25 14:20:26 +03:00
/* A command that operates on zero or more store paths. */
struct StorePathsCommand : public InstallablesCommand
{
private :
bool recursive = false ;
bool all = false ;
2018-03-30 01:56:13 +03:00
protected :
RealiseMode realiseMode = NoBuild ;
2017-04-25 14:20:26 +03:00
public :
2017-09-27 19:28:54 +03:00
StorePathsCommand ( bool recursive = false ) ;
2017-04-25 14:20:26 +03:00
using StoreCommand : : run ;
2019-12-05 20:11:09 +02:00
virtual void run ( ref < Store > store , std : : vector < StorePath > storePaths ) = 0 ;
2017-04-25 14:20:26 +03:00
void run ( ref < Store > store ) override ;
2017-05-02 16:28:35 +03:00
bool useDefaultInstallables ( ) override { return ! all ; }
2017-04-25 14:20:26 +03:00
} ;
2017-05-04 15:16:26 +03:00
/* A command that operates on exactly one store path. */
struct StorePathCommand : public InstallablesCommand
{
using StoreCommand : : run ;
2019-12-05 20:11:09 +02:00
virtual void run ( ref < Store > store , const StorePath & storePath ) = 0 ;
2017-05-04 15:16:26 +03:00
void run ( ref < Store > store ) override ;
} ;
2016-02-09 22:28:29 +02:00
/* A helper class for registering commands globally. */
struct RegisterCommand
{
2019-06-18 17:01:35 +03:00
static Commands * commands ;
2016-02-09 22:28:29 +02:00
2019-06-18 17:01:35 +03:00
RegisterCommand ( const std : : string & name ,
std : : function < ref < Command > ( ) > command )
2016-02-09 22:28:29 +02:00
{
2019-06-18 17:01:35 +03:00
if ( ! commands ) commands = new Commands ;
commands - > emplace ( name , command ) ;
2016-02-09 22:28:29 +02:00
}
} ;
2019-06-18 17:01:35 +03:00
template < class T >
static RegisterCommand registerCommand ( const std : : string & name )
{
return RegisterCommand ( name , [ ] ( ) { return make_ref < T > ( ) ; } ) ;
}
2017-09-10 16:58:30 +03:00
std : : shared_ptr < Installable > parseInstallable (
SourceExprCommand & cmd , ref < Store > store , const std : : string & installable ,
bool useDefaultInstallables ) ;
2018-02-09 17:42:32 +02:00
Buildables build ( ref < Store > store , RealiseMode mode ,
2017-09-10 16:58:30 +03:00
std : : vector < std : : shared_ptr < Installable > > installables ) ;
2019-12-05 20:11:09 +02:00
std : : set < StorePath > toStorePaths ( ref < Store > store , RealiseMode mode ,
2017-09-10 16:58:30 +03:00
std : : vector < std : : shared_ptr < Installable > > installables ) ;
2019-12-05 20:11:09 +02:00
StorePath toStorePath ( ref < Store > store , RealiseMode mode ,
2017-09-10 16:58:30 +03:00
std : : shared_ptr < Installable > installable ) ;
2019-12-05 20:11:09 +02:00
std : : set < StorePath > toDerivations ( ref < Store > store ,
Add "nix show-derivation"
This debug command prints a store derivation in JSON format. For
example:
$ nix show-derivation nixpkgs.hello
{
"/nix/store/ayjwpwwiyy04nh9z71rsdgd3q7bra7ch-hello-2.10.drv": {
"outputs": {
"out": {
"path": "/nix/store/w5w4v29ql0qwqhczkdxs94ix2lh7ibgs-hello-2.10"
}
},
"inputSrcs": [
"/nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25b-default-builder.sh"
],
"inputDrvs": {
"/nix/store/13839aqdf6x4k3b785rw5f2l7857l6y3-bash-4.4-p12.drv": [
"out"
],
"/nix/store/vgdx7fdc7d4iirmnwj2py1nrvr5qwzj7-hello-2.10.tar.gz.drv": [
"out"
],
"/nix/store/x3kkd0vsqfflbvwf1055l9mr39bg0ms0-stdenv.drv": [
"out"
]
},
"platform": "x86_64-linux",
"builder": "/nix/store/qp5fw57d38bd1n07ss4zxh88zg67c3vg-bash-4.4-p12/bin/bash",
"args": [
"-e",
"/nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25b-default-builder.sh"
],
"env": {
"buildInputs": "",
"builder": "/nix/store/qp5fw57d38bd1n07ss4zxh88zg67c3vg-bash-4.4-p12/bin/bash",
"configureFlags": "",
"doCheck": "1",
"name": "hello-2.10",
"nativeBuildInputs": "",
"out": "/nix/store/w5w4v29ql0qwqhczkdxs94ix2lh7ibgs-hello-2.10",
"propagatedBuildInputs": "",
"propagatedNativeBuildInputs": "",
"src": "/nix/store/3x7dwzq014bblazs7kq20p9hyzz0qh8g-hello-2.10.tar.gz",
"stdenv": "/nix/store/6zngq1rdh0ans9qyckqimqibgnlvlfrm-stdenv",
"system": "x86_64-linux"
}
}
}
This removes the need for pp-aterm.
2017-09-25 14:43:35 +03:00
std : : vector < std : : shared_ptr < Installable > > installables ,
bool useDeriver = false ) ;
2019-11-08 16:13:32 +02:00
/* Helper function to generate args that invoke $EDITOR on
filename : lineno . */
Strings editorFor ( const Pos & pos ) ;
2020-03-30 20:14:17 +03:00
struct MixProfile : virtual StoreCommand
{
std : : optional < Path > profile ;
MixProfile ( ) ;
/* If 'profile' is set, make it point at 'storePath'. */
void updateProfile ( const StorePath & storePath ) ;
/* If 'profile' is set, make it point at the store path produced
by ' buildables ' . */
void updateProfile ( const Buildables & buildables ) ;
} ;
struct MixDefaultProfile : MixProfile
{
MixDefaultProfile ( ) ;
} ;
struct MixEnvironment : virtual Args {
StringSet keep , unset ;
Strings stringsEnv ;
std : : vector < char * > vectorEnv ;
bool ignoreEnvironment ;
MixEnvironment ( ) ;
/* Modify global environ based on ignoreEnvironment, keep, and unset. It's expected that exec will be called before this class goes out of scope, otherwise environ will become invalid. */
void setEnviron ( ) ;
} ;
2016-02-09 22:28:29 +02:00
}