From 610d109f751b93ecb14ed7df1612ba804340cfcd Mon Sep 17 00:00:00 2001 From: Sander van der Burg Date: Tue, 13 Sep 2011 12:17:04 +0000 Subject: Initial implementation of a main class wrapper which resolves runtime dependencies automatically svn path=/nixpkgs/trunk/; revision=29235 --- pkgs/build-support/dotnetenv/build-solution.nix | 55 ++++++++++++++++++------- pkgs/build-support/dotnetenv/default.nix | 2 +- 2 files changed, 40 insertions(+), 17 deletions(-) (limited to 'pkgs/build-support/dotnetenv') diff --git a/pkgs/build-support/dotnetenv/build-solution.nix b/pkgs/build-support/dotnetenv/build-solution.nix index 65e4ca71475b2..da2097d9d52f2 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 577a7a3b5e84d..2389a47902941 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; } -- cgit 1.4.1