summary refs log tree commit diff
path: root/pkgs/build-support/dotnetenv
diff options
context:
space:
mode:
authorSander van der Burg <s.vanderburg@tudelft.nl>2011-09-13 12:17:04 +0000
committerSander van der Burg <s.vanderburg@tudelft.nl>2011-09-13 12:17:04 +0000
commit610d109f751b93ecb14ed7df1612ba804340cfcd (patch)
tree77df109cf9e84a7b458a25a8c61af8c84c8ee58f /pkgs/build-support/dotnetenv
parentf75f1871d7e56ffd36908a6a53fd1478030ba221 (diff)
downloadnixpkgs-610d109f751b93ecb14ed7df1612ba804340cfcd.tar
nixpkgs-610d109f751b93ecb14ed7df1612ba804340cfcd.tar.gz
nixpkgs-610d109f751b93ecb14ed7df1612ba804340cfcd.tar.bz2
nixpkgs-610d109f751b93ecb14ed7df1612ba804340cfcd.tar.lz
nixpkgs-610d109f751b93ecb14ed7df1612ba804340cfcd.tar.xz
nixpkgs-610d109f751b93ecb14ed7df1612ba804340cfcd.tar.zst
nixpkgs-610d109f751b93ecb14ed7df1612ba804340cfcd.zip
Initial implementation of a main class wrapper which resolves runtime dependencies automatically
svn path=/nixpkgs/trunk/; revision=29235
Diffstat (limited to 'pkgs/build-support/dotnetenv')
-rw-r--r--pkgs/build-support/dotnetenv/build-solution.nix55
-rw-r--r--pkgs/build-support/dotnetenv/default.nix2
2 files changed, 40 insertions, 17 deletions
diff --git a/pkgs/build-support/dotnetenv/build-solution.nix b/pkgs/build-support/dotnetenv/build-solution.nix
index 65e4ca71475..da2097d9d52 100644
--- a/pkgs/build-support/dotnetenv/build-solution.nix
+++ b/pkgs/build-support/dotnetenv/build-solution.nix
@@ -7,18 +7,55 @@
 , verbosity ? "detailed"
 , options ? "/p:Configuration=Debug;Platform=Win32"
 , assemblyInputs ? []
-, runtimeAssemblies ? []
 , preBuild ? ""
+, wrapMain ? false
+, namespace ? null
+, mainClassName ? null
+, mainClassFile ? null
 }:
 
+assert wrapMain -> namespace != null && mainClassName != null && mainClassFile != null;
+
+let
+  wrapperCS = ./Wrapper.cs.in;  
+in
 stdenv.mkDerivation {
-  inherit name src preBuild;  
+  inherit name src;
   
   buildInputs = [ dotnetfx ];  
+
   preConfigure = ''
     cd ${baseDir}
   '';
   
+  preBuild = ''
+    ${preBuild}
+    
+    # Create wrapper class with main method
+    ${stdenv.lib.optionalString wrapMain ''
+      # Generate assemblySearchPaths string array contents
+      for path in ${toString assemblyInputs}
+      do
+          assemblySearchArray="$assemblySearchPaths @\"$(cygpath --windows $path | sed 's|\\|\\\\|g')\""
+      done
+
+      sed -e "s|@NAMESPACE@|${namespace}|" \
+          -e "s|@MAINCLASSNAME@|${mainClassName}|" \
+	  -e "s|@ASSEMBLYSEARCHPATHS@|$assemblySearchArray|" \
+          ${wrapperCS} > $(dirname ${mainClassFile})/${mainClassName}Wrapper.cs
+
+      # Rename old main method and make it publically accessible
+      # so that the wrapper can invoke it
+      sed -i -e "s|static void Main|public static void Main2|g" ${mainClassFile}
+      
+      # Add the wrapper to the C# project file so that will be build as well
+      find . -name \*.csproj | while read file
+      do
+          sed -i -e "s|$(basename ${mainClassFile})|$(basename ${mainClassFile});${mainClassName}Wrapper.cs|" "$file"
+      done
+    ''}
+  '';
+  
   installPhase = ''        
     for i in ${toString assemblyInputs}
     do
@@ -43,19 +80,5 @@ stdenv.mkDerivation {
     
     ensureDir $out
     MSBuild.exe ${toString slnFile} /nologo /t:${targets} /p:IntermediateOutputPath=$(cygpath --windows $out)\\ /p:OutputPath=$(cygpath --windows $out)\\ /verbosity:${verbosity} ${options}
-    
-    # Create references to runtime dependencies
-    # !!! Should be more efficient (e.g. symlinking)
-    
-    for i in ${toString runtimeAssemblies}
-    do
-        cd $i
-	
-        for j in $(find . -type f)
-	do
-	    mkdir -p $out/$(dirname $j)
-	    cp $j $out/$(dirname $j)
-	done
-    done
   '';
 }
diff --git a/pkgs/build-support/dotnetenv/default.nix b/pkgs/build-support/dotnetenv/default.nix
index 577a7a3b5e8..2389a479029 100644
--- a/pkgs/build-support/dotnetenv/default.nix
+++ b/pkgs/build-support/dotnetenv/default.nix
@@ -5,6 +5,6 @@
     inherit stdenv;
     dotnetfx = dotnetfx.pkg;
   };
-  
+    
   inherit (dotnetfx) assembly20Path wcfPath referenceAssembly30Path referenceAssembly35Path;
 }