diff --git a/.gitignore b/.gitignore index 58f3c07..3747abe 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ /Build/.vs /DependenciesBuild /DependenciesSource +/Downloads +/BuildOutput diff --git a/Build/Program.cs b/Build/Program.cs index 4e1c4ab..bbebb05 100644 --- a/Build/Program.cs +++ b/Build/Program.cs @@ -12,7 +12,7 @@ using static System.Runtime.InteropServices.JavaScript.JSType; class Application { - + public static bool SkipBuildDeps = false; static string GetCurrentFileDir([CallerFilePath]string callerFilePath = null) { return Path.GetDirectoryName(callerFilePath); } @@ -22,37 +22,45 @@ class Application { } - static void BuildZLib(string zlib, string installDir) { - var buildDir = TempDirectory.New(); - var cmake = Find.Executable("cmake"); - var ninja = Find.Executable("ninja"); - var configResult = cmake.Run($"-G \"Ninja\" -DCMAKE_INSTALL_PREFIX={Path.Combine(installDir, "zlib")} -DCMAKE_BUILD_TYPE=RELEASE {zlib}", buildDir); - var buildResult = ninja.Run("", buildDir); - var installResult = ninja.Run("install", buildDir); + static string BuildZLib(string zlib, string installDir) { + var installPrefix = Path.Combine(installDir, "zlib"); + if (!SkipBuildDeps) { + var buildDir = TempDirectory.New(); + var cmake = Find.Executable("cmake"); + var ninja = Find.Executable("ninja"); + var configResult = cmake.Run($"-G \"Ninja\" -DCMAKE_INSTALL_PREFIX={installPrefix} -DCMAKE_BUILD_TYPE=RELEASE {zlib}", buildDir); + var buildResult = ninja.Run("", buildDir); + var installResult = ninja.Run("install", buildDir); + } + return installPrefix; } - static void BuildOpenssl(string source, string installDir) { - var tmpDir = TempDirectory.New(); - - var perl = Find.Executable("perl"); - if (perl == null) { - throw new Exception("Perl not found but required for OpenSSL build"); - } - - var nasm = Find.Executable("nasm"); - if (nasm == null) { - throw new Exception("Nasm not found but required for OpenSSL build"); - } - + static string BuildOpenssl(string source, string installDir) { var installPrefix = Path.Combine(installDir, "openssl").Replace("\\", "/"); - var configFilePath = Path.Combine(source, "Configure").Replace("\\", "/"); + if (!SkipBuildDeps) { + var tmpDir = TempDirectory.New(); - var configureResult = perl.Run($"{configFilePath} VC-WIN64A enable-capieng --prefix={installPrefix} --openssldir={installPrefix}", tmpDir); + var perl = Find.Executable("perl"); + if (perl == null) { + throw new Exception("Perl not found but required for OpenSSL build"); + } - var nmake = Find.Executable("nmake"); + var nasm = Find.Executable("nasm"); + if (nasm == null) { + throw new Exception("Nasm not found but required for OpenSSL build"); + } - var buildResult = nmake.Run("", tmpDir); - var installResult = nmake.Run("install", tmpDir); + + var configFilePath = Path.Combine(source, "Configure").Replace("\\", "/"); + + var configureResult = perl.Run($"{configFilePath} VC-WIN64A enable-capieng --prefix={installPrefix} --openssldir={installPrefix}", tmpDir); + + var nmake = Find.Executable("nmake"); + + var buildResult = nmake.Run("", tmpDir); + var installResult = nmake.Run("install", tmpDir); + } + return installPrefix; } @@ -63,43 +71,57 @@ class Application { var ninja = Find.Executable("ninja"); var installPrefix = Path.Combine(installDir, "apr").Replace("\\", "/"); - var configResult = cmake.Run($"-DCMAKE_INSTALL_PREFIX={installPrefix} -G \"Ninja\" -DAPR_INSTALL_PRIVATE_H=ON -DCMAKE_BUILD_TYPE=RELEASE -DAPR_BUILD_STATIC=ON {source}", tmpDir); - var buildResult = ninja.Run("", tmpDir); - var installResult = ninja.Run("install", tmpDir); + if (!SkipBuildDeps) { + var configResult = cmake.Run($"-DCMAKE_INSTALL_PREFIX={installPrefix} -G \"Ninja\" -DAPR_INSTALL_PRIVATE_H=ON -DCMAKE_BUILD_TYPE=RELEASE -DAPR_BUILD_STATIC=ON {source}", tmpDir); + var buildResult = ninja.Run("", tmpDir); + var installResult = ninja.Run("install", tmpDir); + } + return installPrefix; } - static void BuildAprUtil(string source, string expatLibDir, string installDir) { - var tmpDir = TempDirectory.New(); - - var cmake = Find.Executable("cmake"); - var ninja = Find.Executable("ninja"); + static string BuildAprUtil(string source, string expatLibDir, string installDir) { var installPrefix = Path.Combine(installDir, "apr").Replace("\\", "/"); + if (!SkipBuildDeps) { + var tmpDir = TempDirectory.New(); - var expatLibPath = Path.Combine(expatLibDir, "Bin", "libexpat.lib").Replace("\\", "/"); - var expatIncPath = Path.Combine(expatLibDir, "Source", "lib").Replace("\\", "/"); - var opensslPath = Path.Combine(installDir, "openssl").Replace("\\", "/"); + var cmake = Find.Executable("cmake"); + var ninja = Find.Executable("ninja"); - var configResult = cmake.Run($"-DCMAKE_INSTALL_PREFIX={installPrefix} -G \"Ninja\" -DAPR_INSTALL_PRIVATE_H=ON -DCMAKE_BUILD_TYPE=RELEASE -DEXPAT_LIBRARY={expatLibPath} -DEXPAT_INCLUDE_DIR={expatIncPath} -DAPU_HAVE_CRYPTO=ON -DOPENSSL_ROOT_DIR={opensslPath} {source}", tmpDir); - var buildResult = ninja.Run("", tmpDir); - var installResult = ninja.Run("install", tmpDir); + + var expatLibPath = Path.Combine(expatLibDir, "Bin", "libexpat.lib").Replace("\\", "/"); + var expatIncPath = Path.Combine(expatLibDir, "Source", "lib").Replace("\\", "/"); + var opensslPath = Path.Combine(installDir, "openssl").Replace("\\", "/"); + + var configResult = cmake.Run($"-DCMAKE_INSTALL_PREFIX={installPrefix} -G \"Ninja\" -DAPR_INSTALL_PRIVATE_H=ON -DCMAKE_BUILD_TYPE=RELEASE -DEXPAT_LIBRARY={expatLibPath} -DEXPAT_INCLUDE_DIR={expatIncPath} -DAPU_HAVE_CRYPTO=ON -DOPENSSL_ROOT_DIR={opensslPath} {source}", tmpDir); + var buildResult = ninja.Run("", tmpDir); + var installResult = ninja.Run("install", tmpDir); + } + return installPrefix; } - static void BuildSerf(string source, string installDir) { - var scons = Find.Executable("scons"); + static string BuildSerf(string source, string installDir) { var installPrefix = Path.Combine(installDir, "serf").Replace("\\", "/"); - var libinstallPrefix = Path.Combine(installPrefix, "lib").Replace("\\", "/"); + if (!SkipBuildDeps) { + var scons = Find.Executable("scons"); - var aprPath = Path.Combine(installDir, "apr").Replace("\\", "/"); - var aprUtilPath = Path.Combine(installDir, "apr").Replace("\\", "/"); - var zlibPath = Path.Combine(installDir, "zlib").Replace("\\", "/"); - var opensslPath = Path.Combine(installDir, "openssl").Replace("\\", "/"); - // - scons.Run($"APR={aprPath} APU={aprUtilPath} ZLIB={zlibPath} OPENSSL={opensslPath} SOURCE_LAYOUT=0 TARGET_ARCH=X64 MSVC_VERSION=2022 PREFIX={installPrefix} LIBDIR={libinstallPrefix}", source); - scons.Run("install", source); + var libinstallPrefix = Path.Combine(installPrefix, "lib").Replace("\\", "/"); + + var aprPath = Path.Combine(installDir, "apr").Replace("\\", "/"); + var aprUtilPath = Path.Combine(installDir, "apr").Replace("\\", "/"); + var zlibPath = Path.Combine(installDir, "zlib").Replace("\\", "/"); + var opensslPath = Path.Combine(installDir, "openssl").Replace("\\", "/"); + // + scons.Run($"APR={aprPath} APU={aprUtilPath} ZLIB={zlibPath} OPENSSL={opensslPath} SOURCE_LAYOUT=0 TARGET_ARCH=X64 MSVC_VERSION=2022 PREFIX={installPrefix} LIBDIR={libinstallPrefix}", source); + scons.Run("install", source); + } + return installPrefix; } static void FixAprForSerf(string installDir) { + if (SkipBuildDeps) { + return; + } var aprPath = Path.Combine(installDir, "apr"); var incPath = Path.Combine(aprPath, "include"); @@ -116,6 +138,9 @@ class Application { } static void PatchSerf(string serfSource) { + if (SkipBuildDeps) { + return; + } var sconstructPath = Path.Combine(serfSource, "SConstruct"); @@ -136,15 +161,14 @@ class Application { } - static string BuildSubversion(string svnSource, string sqlSource, string installDir, string expatDir) { - var aprPath = Path.Combine(installDir, "apr").Replace("\\", "/"); - var serfPath = Path.Combine(installDir, "serf").Replace("\\", "/"); - var zlibPath = Path.Combine(installDir, "zlib").Replace("\\", "/"); - var opensslPath = Path.Combine(installDir, "openssl").Replace("\\", "/"); + static string BuildSubversion(string svnSource, string sqlSource, string aprInstallDir, string serfInstallDir, string zlibInstallDir, string opensslInstallDir, string expatDir, string svnInstallPrefix) { + var aprPath = aprInstallDir.Replace("\\", "/"); + var serfPath = serfInstallDir.Replace("\\", "/"); + var zlibPath = zlibInstallDir.Replace("\\", "/"); + var opensslPath = opensslInstallDir.Replace("\\", "/"); string libPaths = $"{aprPath};{serfPath};{zlibPath}"; string expatBinDir = Path.Combine(expatDir,"Bin"); string expatIncDir = Path.Combine(expatDir, "Source/lib"); - string installPrefix = Path.Combine(installDir, "subversion"); List args = new List(); args.Add("-G \"Ninja\""); @@ -160,13 +184,17 @@ class Application { args.Add($"-DSVN_ENABLE_SVNXX=ON"); args.Add($"-DSVN_ENABLE_NLS=OFF"); args.Add($"-DZLIB_USE_STATIC_LIBS=ON"); - args.Add($"-DCMAKE_INSTALL_PREFIX={installPrefix}"); + args.Add($"-DCMAKE_INSTALL_PREFIX={svnInstallPrefix}"); args.Add($"{svnSource}"); var argsString = string.Join(" ", args); var cmake = Find.Executable("cmake"); var ninja = Find.Executable("ninja"); + var python = Find.Executable("python"); + + var genCmakeResult = python.Run("gen-make.py -t cmake", svnSource); + // python gen-make.py -t cmake var tmpDir = TempDirectory.New(); var configResult = cmake.Run(argsString, tmpDir); @@ -174,10 +202,12 @@ class Application { var buildResult = ninja.Run("", tmpDir); var installResult = ninja.Run("install", tmpDir); - return installPrefix; + return svnInstallPrefix; } public static async Task Main() { + SkipBuildDeps = false; + VisualStudio.SetupEnvironment(CpuArchitecture.x64); var projectRootDir = GetProjectRootDir(); @@ -185,8 +215,8 @@ class Application { var depsSourceDirectory = Path.Combine(projectRootDir, "Downloads"); Directory.CreateDirectory(depsSourceDirectory); - var tempDir = TempDirectory.New(); - var depsBuildDirectory = Path.Combine(tempDir, "DependenciesBuild"); + + var depsBuildDirectory = Path.Combine(projectRootDir, "BuildOutput"); Directory.CreateDirectory(depsBuildDirectory); var svn = await Dependencies.GetSubversion(projectRootDir); @@ -198,18 +228,18 @@ class Application { var openssl = await Dependencies.GetOpenssl(depsSourceDirectory); var expat = await Dependencies.GetExpat(depsSourceDirectory); - BuildOpenssl(openssl, depsBuildDirectory); - BuildZLib(zLib, depsBuildDirectory); + var opensslInstallDir = BuildOpenssl(openssl, depsBuildDirectory); + var zlibInstallDir = BuildZLib(zLib, depsBuildDirectory); var aprInstallDir = BuildApr(apr, depsBuildDirectory); BuildAprUtil(aprUtil, expat, depsBuildDirectory); FixAprForSerf(depsBuildDirectory); PatchSerf(serf); - BuildSerf(serf, depsBuildDirectory); - var svnInstallDir = BuildSubversion(svn, sqLite, tempDir, expat); + var serfInstallDir = BuildSerf(serf, depsBuildDirectory); + var svnInstallDir = BuildSubversion(svn, sqLite, aprInstallDir, serfInstallDir, zlibInstallDir, opensslInstallDir, expat, Path.Combine(depsBuildDirectory, "subversion")); CopyLibraries(Path.Combine(aprInstallDir, "bin"), svnInstallDir); CopyLibraries(Path.Combine(expat, "Bin"), svnInstallDir); - CopyLibraries(Path.Combine(openssl, "bin"), svnInstallDir); + CopyLibraries(Path.Combine(opensslInstallDir, "bin"), svnInstallDir); Console.WriteLine($"SVN install directory: {svnInstallDir}");