mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-12 14:05:16 +03:00
Push the Nix dependency management configuration to the OSS repository.
We don't need to hide it. PR-URL: https://github.com/hasura/graphql-engine-mono/pull/6255 GitOrigin-RevId: 9b46511c6b274dd7e8e52ee74644dc86c7d75872
This commit is contained in:
parent
2f94bcf6c7
commit
1ffc19367d
53
.envrc
Normal file
53
.envrc
Normal file
@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This file provides some tooling on an opt-in basis via `direnv`
|
||||
# (https://direnv.net/)
|
||||
|
||||
# To use the functionality here, create an `.envrc.local` file in this folder
|
||||
# that runs the functions you need.
|
||||
# There is an example in `.envrc.local.example` you can start with
|
||||
|
||||
# `use nvm`
|
||||
# if `nvm` is installed, use it to select the right node.js version
|
||||
# as defined in the `.nvmrc` file
|
||||
use_nvm() {
|
||||
local NVM_DIR
|
||||
if [[ -z "${XDG_CONFIG_HOME:-}" ]]; then
|
||||
NVM_DIR="${HOME}/.nvm"
|
||||
else
|
||||
NVM_DIR="${XDG_CONFIG_HOME}/nvm"
|
||||
fi
|
||||
if ! [[ -d "$NVM_DIR" ]]; then
|
||||
echo >&2 "ERROR: nvm not found. Could not set the node.js version."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# shellcheck source=/dev/null
|
||||
[[ -s "$NVM_DIR/nvm.sh" ]] && \. "$NVM_DIR/nvm.sh" # This loads nvm
|
||||
nvm use
|
||||
}
|
||||
|
||||
# `use ghcup`
|
||||
# if `ghcup` is available, use it to install and set the GHC version
|
||||
# as defined in the `.ghcversion` file
|
||||
use_ghcup() {
|
||||
local GHC_VERSION GHCUP_PATH
|
||||
GHC_VERSION="$(<.ghcversion)"
|
||||
GHCUP_PATH="$(which ghcup)"
|
||||
if [[ -z "$GHC_VERSION" ]]; then
|
||||
echo >&2 'ERROR: Required GHC version not found.'
|
||||
return 1
|
||||
fi
|
||||
if [[ -z "$GHCUP_PATH" ]]; then
|
||||
echo 'ERROR: ghcup not found. Could not set the GHC version.'
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! ghcup whereis ghc "$GHC_VERSION" &> /dev/null; then
|
||||
ghcup install ghc "$GHC_VERSION"
|
||||
fi
|
||||
ghcup set ghc "$GHC_VERSION"
|
||||
}
|
||||
|
||||
# this line sources your `.envrc.local` file
|
||||
source_env_if_exists .envrc.local
|
42
flake.lock
Normal file
42
flake.lock
Normal file
@ -0,0 +1,42 @@
|
||||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"locked": {
|
||||
"lastModified": 1659877975,
|
||||
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1664957017,
|
||||
"narHash": "sha256-beO1xAHLXXfVTAq4E/pbdt+vUMgYtOGjAUyPq81LV7c=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "1237bfb999d269c46868b34bb4b33b5ff084ac5f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
55
flake.nix
Normal file
55
flake.nix
Normal file
@ -0,0 +1,55 @@
|
||||
# This Nix flake defines the dependencies of the Hasura GraphQL Engine.
|
||||
# Currently, we do not use it for building anything, just for providing a shell.
|
||||
#
|
||||
# The shell provides tooling for the Server, CLI, Console, and other components.
|
||||
# You can start it with `nix develop`, or by using `direnv` (see .envrc).
|
||||
#
|
||||
# If you are using macOS, note that we apply a patch to GHC, and therefore all
|
||||
# tooling needs to be built from scratch. If you're averse to waiting several
|
||||
# hours for your environment to become usable, you can add @SamirTalwar's Cachix
|
||||
# repository to save yourself the trouble:
|
||||
#
|
||||
# https://app.cachix.org/cache/hasura-samirtalwar#pull
|
||||
{
|
||||
description = "Hasura GraphQL Engine";
|
||||
|
||||
inputs = {
|
||||
flake-utils = {
|
||||
url = github:numtide/flake-utils;
|
||||
};
|
||||
|
||||
nixpkgs = {
|
||||
url = github:NixOS/nixpkgs;
|
||||
};
|
||||
};
|
||||
|
||||
outputs =
|
||||
{ self
|
||||
, flake-utils
|
||||
, nixpkgs
|
||||
}:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
config = {
|
||||
allowUnfree = true;
|
||||
};
|
||||
overlays = [
|
||||
(import ./nix/overlays/ghc.nix)
|
||||
];
|
||||
};
|
||||
in
|
||||
{
|
||||
packages.graphql-parser = (pkgs.haskell.packages.${pkgs.ghcName}.callCabal2nix "graphql-parser" ./server/lib/graphql-parser-hs { }).overrideScope (
|
||||
self: super: {
|
||||
hedgehog = self.hedgehog_1_1_1;
|
||||
}
|
||||
);
|
||||
|
||||
formatter = pkgs.nixpkgs-fmt;
|
||||
|
||||
devShells.default = import ./nix/shell.nix { inherit pkgs; };
|
||||
}
|
||||
);
|
||||
}
|
62
nix/overlays/ghc.nix
Normal file
62
nix/overlays/ghc.nix
Normal file
@ -0,0 +1,62 @@
|
||||
self: super:
|
||||
let
|
||||
versions = import ../versions.nix { pkgs = super; };
|
||||
|
||||
ghcVersion = "9.2.4";
|
||||
ghcName = "ghc${builtins.replaceStrings ["."] [""] ghcVersion}";
|
||||
ghcPatches =
|
||||
if super.stdenv.targetPlatform.isDarwin
|
||||
then [
|
||||
# Copied from https://github.com/NixOS/nixpkgs/pull/149942
|
||||
# If the GHC version is updated, we must update the patch URL too.
|
||||
# ---
|
||||
# Reverts the linking behavior of GHC to not resolve `-libc++` to `c++`.
|
||||
# Without this, we get the following error on macOS:
|
||||
# ghc: loadArchive: Neither an archive, nor a fat archive: `/path/to/clang++'
|
||||
(super.fetchpatch {
|
||||
url = "https://raw.githubusercontent.com/input-output-hk/haskell.nix/4b6ee9767daaf5fc1d5419e07733ab006b95ec93/overlays/patches/ghc/ghc-9.2-macOS-loadArchive-fix.patch";
|
||||
sha256 = "qOfIOqI5oM9695iWtK//OoP7NeF9K6ykGsdSOWJQN/I=";
|
||||
})
|
||||
] else [ ];
|
||||
in
|
||||
{
|
||||
haskell = super.haskell // {
|
||||
compiler = super.haskell.compiler // {
|
||||
${ghcName} = (versions.ensureVersion super.haskell.compiler.${ghcName}).overrideAttrs (oldAttrs: {
|
||||
patches = (if oldAttrs ? patches then oldAttrs.patches else [ ]) ++ ghcPatches;
|
||||
});
|
||||
};
|
||||
|
||||
packages = super.haskell.packages // {
|
||||
${ghcName} = super.haskell.packages.${ghcName}.override {
|
||||
overrides = hself: hsuper:
|
||||
if super.stdenv.targetPlatform.isDarwin
|
||||
then
|
||||
# macOS-specific overrides:
|
||||
let
|
||||
# Ormolu v0.5.0.1 doesn't build correctly on aarch64-darwin.
|
||||
# Disabling the "fixity-th" flag seems to fix it.
|
||||
# https://github.com/tweag/ormolu/issues/927
|
||||
fixOrmolu = p: super.lib.pipe p [
|
||||
(super.haskell.lib.compose.addExtraLibrary hself.file-embed)
|
||||
(super.haskell.lib.compose.disableCabalFlag "fixity-th")
|
||||
];
|
||||
in
|
||||
{
|
||||
# On aarch64-darwin, this creates a cycle for some reason; didn't look too much into it.
|
||||
ghcid = super.haskell.lib.overrideCabal hsuper.ghcid (drv: { enableSeparateBinOutput = false; });
|
||||
# See above.
|
||||
ormolu = hself.ormolu_0_5_0_1;
|
||||
ormolu_0_5_0_1 = fixOrmolu hsuper.ormolu_0_5_0_1;
|
||||
fourmolu = hself.fourmolu_0_8_2_0;
|
||||
fourmolu_0_8_2_0 = fixOrmolu hsuper.fourmolu_0_8_2_0;
|
||||
}
|
||||
else
|
||||
# We don't need to override anything on Linux:
|
||||
{ };
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
inherit ghcVersion ghcName;
|
||||
}
|
132
nix/shell.nix
Normal file
132
nix/shell.nix
Normal file
@ -0,0 +1,132 @@
|
||||
{ pkgs }:
|
||||
let
|
||||
versions = import ./versions.nix { inherit pkgs; };
|
||||
|
||||
# Unix ODBC Support
|
||||
freetdsWithODBC = pkgs.freetds.override {
|
||||
odbcSupport = true;
|
||||
inherit (pkgs) unixODBC;
|
||||
};
|
||||
|
||||
# Verify this works by running `odbcinst -q -d`.
|
||||
# The output should be the headings from the odbcinst.ini file.
|
||||
# (You can easily see the generated file by running `cat $ODBCINSTINI`.)
|
||||
# If you see any errors, please contact your friendly MSSQL and/or Nix expert.
|
||||
odbcinstFile =
|
||||
let msodbcsql = pkgs.unixODBCDrivers.msodbcsql17;
|
||||
in
|
||||
pkgs.writeTextFile {
|
||||
name = "odbcinst.ini";
|
||||
text = ''
|
||||
[${msodbcsql.fancyName}]
|
||||
Description = ${msodbcsql.meta.description}
|
||||
Driver = ${msodbcsql}/${msodbcsql.driver}
|
||||
'';
|
||||
};
|
||||
|
||||
baseInputs = [
|
||||
pkgs.stdenv
|
||||
pkgs.jq
|
||||
];
|
||||
|
||||
consoleInputs = [
|
||||
pkgs.google-cloud-sdk
|
||||
pkgs."nodejs-${versions.nodejsVersion}_x"
|
||||
];
|
||||
|
||||
docsInputs = [
|
||||
pkgs.yarn
|
||||
];
|
||||
|
||||
integrationTestInputs = [
|
||||
pkgs.python3
|
||||
];
|
||||
|
||||
# The version of GHC in `ghcName` is set in nix/overlays/ghc.nix.
|
||||
#
|
||||
# We list top-level packages before packages scoped to the GHC version, so
|
||||
# that they appear first in the PATH. Otherwise we might end up with older
|
||||
# versions of transitive dependencies (e.g. HLS depending on Ormolu).
|
||||
haskellInputs = [
|
||||
pkgs.cabal2nix
|
||||
|
||||
# The correct version of GHC.
|
||||
pkgs.haskell.compiler.${pkgs.ghcName}
|
||||
|
||||
# We use the default versions of these packages.
|
||||
(versions.ensureVersion pkgs.haskellPackages.hlint)
|
||||
(versions.ensureVersion pkgs.haskellPackages.hpack)
|
||||
(versions.ensureVersion pkgs.haskellPackages.ormolu)
|
||||
|
||||
# We build these packages using our custom GHC.
|
||||
pkgs.haskell.packages.${pkgs.ghcName}.alex
|
||||
pkgs.haskell.packages.${pkgs.ghcName}.apply-refact
|
||||
pkgs.haskell.packages.${pkgs.ghcName}.cabal-install
|
||||
pkgs.haskell.packages.${pkgs.ghcName}.ghcid
|
||||
pkgs.haskell.packages.${pkgs.ghcName}.happy
|
||||
pkgs.haskell.packages.${pkgs.ghcName}.haskell-language-server
|
||||
pkgs.haskell.packages.${pkgs.ghcName}.hoogle
|
||||
pkgs.haskell.packages.${pkgs.ghcName}.hspec-discover
|
||||
];
|
||||
|
||||
devInputs = [
|
||||
pkgs.nixpkgs-fmt
|
||||
pkgs.shellcheck
|
||||
];
|
||||
|
||||
ciInputs = [
|
||||
pkgs.go
|
||||
];
|
||||
|
||||
dynamicLibraries = [
|
||||
pkgs.gmp
|
||||
pkgs.libkrb5 # Includes required `gssapi` headers.
|
||||
pkgs.ncurses
|
||||
pkgs.openssl_3
|
||||
pkgs.pcre
|
||||
pkgs.zlib
|
||||
pkgs.zstd
|
||||
|
||||
# PostgreSQL, Microsoft SQL Server, & MySQL dependencies.
|
||||
freetdsWithODBC
|
||||
pkgs.libmysqlclient
|
||||
pkgs.mariadb
|
||||
pkgs.postgresql
|
||||
pkgs.unixODBC
|
||||
]
|
||||
# Linux-specific libraries.
|
||||
++ pkgs.lib.optionals pkgs.stdenv.targetPlatform.isLinux [
|
||||
pkgs.stdenv.cc.cc.lib
|
||||
# Microsoft SQL Server drivers don't work on aarch64 yet.
|
||||
pkgs.unixODBCDrivers.msodbcsql17
|
||||
];
|
||||
|
||||
includeLibraries = [
|
||||
pkgs.libkrb5.dev
|
||||
pkgs.ncurses.dev
|
||||
pkgs.openssl_3.dev
|
||||
pkgs.pcre.dev
|
||||
pkgs.zlib.dev
|
||||
];
|
||||
|
||||
serverDeps =
|
||||
haskellInputs
|
||||
++ dynamicLibraries
|
||||
++ includeLibraries
|
||||
++ integrationTestInputs;
|
||||
in
|
||||
pkgs.mkShell {
|
||||
buildInputs = baseInputs ++ consoleInputs ++ docsInputs ++ serverDeps ++ devInputs ++ ciInputs;
|
||||
|
||||
# We set the ODBCINSTINI to the file defined above, which points to the MSSQL ODBC driver.
|
||||
# The path is relative to `ODBCSYSINI`, which we set to empty.
|
||||
# Microsoft SQL Server drivers don't work on aarch64 yet, so we also disable this.
|
||||
ODBCSYSINI = "";
|
||||
ODBCINSTINI = pkgs.lib.strings.optionalString pkgs.stdenv.targetPlatform.isLinux "${odbcinstFile}";
|
||||
|
||||
LD_LIBRARY_PATH = pkgs.lib.strings.makeLibraryPath dynamicLibraries;
|
||||
shellHook = pkgs.lib.strings.optionalString pkgs.stdenv.targetPlatform.isDarwin ''
|
||||
# Without this, GHC will use the system `libcrypto` and `libssl` libraries, which fail.
|
||||
export DYLD_LIBRARY_PATH="$LD_LIBRARY_PATH";
|
||||
'';
|
||||
}
|
14
nix/versions.nix
Normal file
14
nix/versions.nix
Normal file
@ -0,0 +1,14 @@
|
||||
{ pkgs }:
|
||||
let
|
||||
versions = pkgs.lib.trivial.importJSON ../server/VERSIONS.json;
|
||||
in
|
||||
{
|
||||
ensureVersion = package:
|
||||
let expected = versions.${package.pname};
|
||||
in
|
||||
if expected == package.version
|
||||
then package
|
||||
else throw "Invalid version for package ${package.pname}: expected ${expected}, got ${package.version}";
|
||||
|
||||
nodejsVersion = pkgs.lib.strings.fileContents ../.nvmrc;
|
||||
}
|
Loading…
Reference in New Issue
Block a user