aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/pkgs/misc/source-and-tags
diff options
context:
space:
mode:
authorKatharina Fey <kookie@spacekookie.de>2019-10-05 12:43:18 +0000
committerKatharina Fey <kookie@spacekookie.de>2019-10-05 12:44:52 +0000
commitcf85056ba64caf3267d43255ef4a1243e9c8ee3b (patch)
tree3051519e9c8275b870aac43f80af875715c9d124 /nixpkgs/pkgs/misc/source-and-tags
parent1148b1d122bc03e9a3665856c9b7bb96bd4e3994 (diff)
parent2436c27541b2f52deea3a4c1691216a02152e729 (diff)
Add 'nixpkgs/' from commit '2436c27541b2f52deea3a4c1691216a02152e729'
git-subtree-dir: nixpkgs git-subtree-mainline: 1148b1d122bc03e9a3665856c9b7bb96bd4e3994 git-subtree-split: 2436c27541b2f52deea3a4c1691216a02152e729
Diffstat (limited to 'nixpkgs/pkgs/misc/source-and-tags')
-rw-r--r--nixpkgs/pkgs/misc/source-and-tags/default.nix95
1 files changed, 95 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/misc/source-and-tags/default.nix b/nixpkgs/pkgs/misc/source-and-tags/default.nix
new file mode 100644
index 00000000000..7c082cbbbb0
--- /dev/null
+++ b/nixpkgs/pkgs/misc/source-and-tags/default.nix
@@ -0,0 +1,95 @@
+{ stdenv, lib, glibcLocales, unzip, hasktags, ctags } : {
+ # optional srcDir
+ annotatedWithSourceAndTagInfo = x : (x ? passthru && x.passthru ? sourceWithTags
+ || x ? meta && x.meta ? sourceWithTags );
+ # hack because passthru doesn't work the way I'd expect. Don't have time to spend on this right now
+ # that's why I'm abusing meta for the same purpose in ghcsAndLibs
+ sourceWithTagsFromDerivation = x : if x ? passthru && x.passthru ? sourceWithTags then x.passthru.sourceWithTags
+ else if x ? meta && x.meta ? sourceWithTags then x.meta.sourceWithTags
+ else null;
+
+ # createTagFiles = [ { name = "my_tag_name_without_suffix", tagCmd = "ctags -R . -o \$TAG_FILE"; } ]
+ # tag command must create file named $TAG_FILE
+ sourceWithTagsDerivation = {name, src, srcDir ? ".", tagSuffix ? "_tags", createTagFiles ? []} :
+ stdenv.mkDerivation {
+ phases = "unpackPhase buildPhase";
+ inherit src srcDir tagSuffix;
+ name = "${name}-source-with-tags";
+ buildInputs = [ unzip ];
+ # using separate tag directory so that you don't have to glob that much files when starting your editor
+ # is this a good choice?
+ buildPhase =
+ let createTags = lib.concatStringsSep "\n"
+ (map (a: ''
+ TAG_FILE="$SRC_DEST/${a.name}$tagSuffix"
+ echo running tag cmd "${a.tagCmd}" in `pwd`
+ ${a.tagCmd}
+ TAG_FILES="$TAG_FILES''${TAG_FILES:+:}$TAG_FILE"
+ '') createTagFiles );
+ in ''
+ SRC_DEST=$out/src/$name
+ mkdir -p $SRC_DEST
+ pwd; ls
+ cp -r $srcDir $SRC_DEST
+ cd $SRC_DEST
+ ${createTags}
+
+ mkdir -p $out/nix-support
+ echo "TAG_FILES=\"\$TAG_FILES\''${TAG_FILES:+:}$TAG_FILES\"" >> $out/nix-support/setup-hook
+ '';
+ };
+ # example usage
+ #testSourceWithTags = sourceWithTagsDerivation (ghc68extraLibs ghcsAndLibs.ghc68).happs_server_darcs.passthru.sourceWithTags;
+
+
+ # creates annotated derivation (comments see above)
+ addHasktagsTaggingInfo = deriv : deriv // {
+ passthru = {
+ sourceWithTags = {
+ inherit (deriv) src;
+ srcDir = if deriv ? srcDir then deriv.srcDir else ".";
+ name = deriv.name;
+ createTagFiles = [
+ { name = "${deriv.name}_haskell";
+ # tagCmd = "${toString ghcsAndLibs.ghc68.ghc}/bin/hasktags --ignore-close-implementation --ctags `find . -type f -name \"*.*hs\"`; sort tags > \$TAG_FILE"; }
+ # *.*hs.* to catch gtk2hs .hs.pp files
+ tagCmd = "
+ srcs=\"`find . -type f -name \"*.*hs\"; find . -type f -name \"*.*hs*\";`\"
+ [ -z \"$srcs\" ] || {
+ # without this creating tag files for lifted-base fails
+ export LC_ALL=en_US.UTF-8
+ export LANG=en_US.UTF-8
+ ${if stdenv.isLinux then "export LOCALE_ARCHIVE=${glibcLocales}/lib/locale/locale-archive;" else ""}
+
+ ${toString hasktags}/bin/hasktags --ignore-close-implementation --ctags .
+ mv tags \$TAG_FILE
+ }";
+ }
+ ];
+ };
+ };
+ };
+
+
+ addCTaggingInfo = deriv :
+ deriv // {
+ passthru = {
+ sourceWithTags = {
+ inherit (deriv) src;
+ name = "${deriv.name}-source-ctags";
+ createTagFiles = [
+ { inherit (deriv) name;
+ tagCmd = "${toString ctags}/bin/ctags --sort=yes -o \$TAG_FILE -R ."; }
+ ];
+ };
+ }; };
+}
+/*
+experimental
+idea:
+a) Attach some information to a nexpression telling how to create a tag file which can then be used within your favourite editor
+ Do this in a way not affecting the expression (using passthru or meta which is ignored when calculating the hash)
+ implementations: addCTaggingInfo (C / C++) and addHasktagsTaggingInfo (Haskell)
+b) use sourceWithTagsDerivation function to create a derivation installing the source along with the generated tag files
+ so that you can use them easily witihn your favourite text editor
+*/