unity-jar-resolver icon indicating copy to clipboard operation
unity-jar-resolver copied to clipboard

[Bug] Cannot build EDM4U from source on Windows with a modern version of Unity (2020.3.12f1)

Open patm1987 opened this issue 3 years ago • 3 comments

[READ] For Firebase Unity SDK issues, please report to Firebase Unity Sample

Once you've read this section and determined that your issue is appropriate for this repository, please delete this section.

[REQUIRED] Please fill in the following fields:

  • Unity editor version: 2020.3.12f1
  • External Dependency Manager version: HEAD
  • Source you installed EDM4U: _____ (.unitypackage or Unity Package Manager)
  • Features in External Dependency Manager in use: _____ (Android Resolver, iOS Resolver, VersionHandler, etc.)
  • Plugins SDK in use: _____ (Firebase, Admob, Facebook, etc.)
  • Platform you are using the Unity editor on: Windows (Mac, Windows, or Linux)

[REQUIRED] Please describe the issue here:

The base issue is:

PS D:\unity-jar-resolver> .\gradlew.bat build

> Configure project :
INFO: Could not find files for the given pattern(s).

FAILURE: Build failed with an exception.

* Where:
Build file 'D:\unity-jar-resolver\build.gradle' line: 55

* What went wrong:
A problem occurred evaluating root project 'playServicesResolver'.
> Unity editor executable (UNITY_EXE) not found

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 0s
PS D:\unity-jar-resolver>

It's possible to get past this by changing:

  List<String> defaultUnityPaths =
    [(OperatingSystem.UNKNOWN): ["Unity"],
     (OperatingSystem.MAC_OSX):
     ["/Applications/Unity/Unity.app/Contents/MacOS/Unity"] +
     (new FileNameFinder()).getFileNames(
       "/", "Applications/Unity/Hub/Editor/*/Unity.app/Contents/MacOS/Unity"),
     (OperatingSystem.WINDOWS):
     ["\\Program Files\\Unity\\Editor\\Unity.exe"] +
     (new FileNameFinder()).getFileNames(
       "\\", "Program Files\\Unity\\Hub\\Editor\\*\\Editor\\Unity.exe"),
     (OperatingSystem.LINUX): ["/opt/Unity/Editor/Unity"]][operatingSystem]

to:

  List<String> defaultUnityPaths =
    [(OperatingSystem.UNKNOWN): ["Unity"],
     (OperatingSystem.MAC_OSX):
     ["/Applications/Unity/Unity.app/Contents/MacOS/Unity"] +
     (new FileNameFinder()).getFileNames(
       "/", "Applications/Unity/Hub/Editor/*/Unity.app/Contents/MacOS/Unity"),
     (OperatingSystem.WINDOWS):
     ["\\Program Files\\Unity\\Editor\\Unity.exe"] +
     (new FileNameFinder()).getFileNames(
       "\\Program Files\\Unity\\Hub\\Editor\\", "*\\Editor\\Unity.exe"),
     (OperatingSystem.LINUX): ["/opt/Unity/Editor/Unity"]][operatingSystem]

(this fixes the wildcard search for the Unity editor installed via the Unity Hub).

  if (unityExe == null || !unityExe.exists()) {
    unityExe = findFileInPath(unityExe.name)
  }

should also be changed to

  if (unityExe == null || !unityExe.exists()) {
    unityExe = findFileInPath(new File(defaultUnityPaths[0]).name)
  }

(I don't think this should ever be really useful, but it does actually check for Unity.exe if unityExe is null, which is part of the if statement. It does feel a bit hacky).

Also, the way "Editor" is removed is incorrect. In groovy, the - operation will remove the first match, and if you install Unity via the Unity Hub then your path will look something like "Unity/Hub/Editor/Unity/Editor" (the wrong Editor will get removed). change:

  File unityRootDir = findFileProperty(
    "UNITY_DIR", new File(unityExe.parentFile.absolutePath -
                          unityExeParentPath), true)

to

  String unityExeAbsolutePath = unityExe.parentFile.absolutePath;
  Integer indexWhereUnityExeParentPathStarts = unityExeAbsolutePath.lastIndexOf(unityExeParentPath);
  String unityDir = unityExeAbsolutePath[0..indexWhereUnityExeParentPathStarts-1];
  File unityRootDir = findFileProperty("UNITY_DIR", new File(unityDir), true)

In newer versions of Unity, they ship mono.exe rather than mono.bat. You can fix this with:

  monoExe = getFileFromPropertyOrFileTree(
    "MONO_EXE", false, {
      unityRootDirTree.matching {
        include (operatingSystem == OperatingSystem.WINDOWS ?
          "**/bin/mono.bat" : "**/bin/mono")
        exclude unitySearchDirExcludes
      }
    })

to

  monoExe = getFileFromPropertyOrFileTree(
    "MONO_EXE", false, {
      unityRootDirTree.matching {
        include (operatingSystem == OperatingSystem.WINDOWS ?
          ["**/bin/mono.bin", "**/bin/mono.exe"] : "**/bin/mono")
        exclude unitySearchDirExcludes
      }
    })

Finally, nunit-console2.bat doesn't ship with newer Unity's. Maybe you can fix it with:

  nunitConsoleExe = getFileFromPropertyOrFileTree(
    "NUNIT_CONSOLE_EXE", false, {
      unityRootDirTree.matching {
        include (operatingSystem == OperatingSystem.WINDOWS ?
                 "**/bin/nunit-console2.bat" :
                 "**/nunit-console2")
        exclude unitySearchDirExcludes
      }
    })

to

  nunitConsoleExe = getFileFromPropertyOrFileTree(
    "NUNIT_CONSOLE_EXE", false, {
      unityRootDirTree.matching {
        include (operatingSystem == OperatingSystem.WINDOWS ?
                 ["**/bin/nunit-console2.bat", "**/bin/nunit-console.bat"] :
                 "**/nunit-console2")
        exclude unitySearchDirExcludes
      }
    })

Unfortunately, with all these changes I cannot get the project building. I get an error in XBuild that I don't know enough to debug:

> Task :compileVersionHandler FAILED

>>>> xbuild tool is deprecated and will be removed in future updates, use msbuild instead <<<<

XBuild Engine Version 4.0
Mono, Version 5.11.0.0
Copyright (C) 2005-2013 Various Mono authors

Build started 6/24/2021 4:55:03 PM.
__________________________________________________
Project "C:\Projects\unity-jar-resolver\source\ExternalDependencyManager.sln" (VersionHandler target(s)):
        Target ValidateSolutionConfiguration:
                Building solution configuration "Debug|Any CPU".
        Target VersionHandler:
                Project "C:\Projects\unity-jar-resolver\source\VersionHandler\VersionHandler.csproj" (default target(s)):
                        Target PrepareForBuild:
                                Configuration: Debug Platform: AnyCPU
                        Target GenerateSatelliteAssemblies:
                        No input files were specified for target GenerateSatelliteAssemblies, skipping.
                Done building project "C:\Projects\unity-jar-resolver\source\VersionHandler\VersionHandler.csproj".-- FAILED
        Task "MSBuild" execution -- FAILED
        Done building target "VersionHandler" in project "C:\Projects\unity-jar-resolver\source\ExternalDependencyManager.sln".-- FAILED
Done building project "C:\Projects\unity-jar-resolver\source\ExternalDependencyManager.sln".-- FAILED

Build FAILED.
         0 Warning(s)
         0 Error(s)

Time Elapsed 00:00:00.5829964

which is why I'm submitting this as a bug report rather than a patch. Here is a full patch of my working copy so far:

diff --git a/build.gradle b/build.gradle
index 264ff51..b4acdfc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -39,17 +39,21 @@ project.ext {
      (OperatingSystem.WINDOWS):
      ["\\Program Files\\Unity\\Editor\\Unity.exe"] +
      (new FileNameFinder()).getFileNames(
-       "\\", "Program Files\\Unity\\Hub\\Editor\\*\\Editor\\Unity.exe"),
+       "\\Program Files\\Unity\\Hub\\Editor\\", "*\\Editor\\Unity.exe"),
      (OperatingSystem.LINUX): ["/opt/Unity/Editor/Unity"]][operatingSystem]
 
   // Search for the Unity editor executable.
   // The Unity editor is required to package the plug-in.
+  logger.info('Unity paths: {}', defaultUnityPaths);
   for (defaultUnityPath in defaultUnityPaths) {
     unityExe = findFileProperty("UNITY_EXE", new File(defaultUnityPath), false)
-    if (unityExe != null && unityExe.exists()) break;
+    if (unityExe != null && unityExe.exists()) {
+      logger.info('{} exists! {}', unityExe, unityExe.exists());
+      break;
+    }
   }
   if (unityExe == null || !unityExe.exists()) {
-    unityExe = findFileInPath(unityExe.name)
+    unityExe = findFileInPath(new File(defaultUnityPaths[0]).name)
   }
   if (unityExe == null) {
     throw new StopActionException("Unity editor executable (UNITY_EXE) not " +
@@ -64,9 +68,12 @@ project.ext {
      (OperatingSystem.MAC_OSX): "Unity.app/Contents/MacOS",
      (OperatingSystem.WINDOWS): "Editor",
      (OperatingSystem.LINUX): "Editor"][operatingSystem]
-  File unityRootDir = findFileProperty(
-    "UNITY_DIR", new File(unityExe.parentFile.absolutePath -
-                          unityExeParentPath), true)
+  logger.info('unityExeParentPath: {}', unityExeParentPath);
+  String unityExeAbsolutePath = unityExe.parentFile.absolutePath;
+  Integer indexWhereUnityExeParentPathStarts = unityExeAbsolutePath.lastIndexOf(unityExeParentPath);
+  String unityDir = unityExeAbsolutePath[0..indexWhereUnityExeParentPathStarts-1];
+  logger.info('test path: {}', unityDir);
+  File unityRootDir = findFileProperty("UNITY_DIR", new File(unityDir), true)
   if (unityRootDir == null) {
     throw new StopActionException("Unity root directory (UNITY_DIR) not found.")
   }
@@ -126,7 +133,7 @@ project.ext {
     "MONO_EXE", false, {
       unityRootDirTree.matching {
         include (operatingSystem == OperatingSystem.WINDOWS ?
-          "**/bin/mono.bat" : "**/bin/mono")
+          ["**/bin/mono.bin", "**/bin/mono.exe"] : "**/bin/mono")
         exclude unitySearchDirExcludes
       }
     })
@@ -184,7 +191,7 @@ project.ext {
     "NUNIT_CONSOLE_EXE", false, {
       unityRootDirTree.matching {
         include (operatingSystem == OperatingSystem.WINDOWS ?
-                 "**/bin/nunit-console2.bat" :
+                 ["**/bin/nunit-console2.bat", "**/bin/nunit-console.bat"] :
                  "**/nunit-console2")
         exclude unitySearchDirExcludes
       }
@@ -382,6 +389,7 @@ String findProperty(String propertyName, String defaultValue = null) {
  */
 File findFileProperty(String propertyName, File defaultValue = null,
                       Boolean mustExist = false) {
+  logger.info('{} checking {}', propertyName, defaultValue);
   String foundFilePath = findProperty(
     propertyName, defaultValue != null ? defaultValue.absolutePath : null)
   File foundFile = foundFilePath != null ? new File(foundFilePath) : null
@@ -686,6 +694,8 @@ Task createXbuildTask(String taskName, String taskDescription,
                       File projectToBuild, String target,
                       Iterable<File> inputFiles, File outputDir,
                       Iterable<File> outputFiles, Iterable<Task> dependsOn) {
+
+  logger.info('createXbuildTask with target {}', target);
   File intermediatesDir = new File(outputDir, "obj")
   File binaryOutputDir = new File(outputDir, "bin")
   Iterable<File> outputFilesInBinaryOutputDir = outputFiles.collect {
@@ -759,7 +769,7 @@ Task createXbuildTask(String taskName, String taskDescription,
                sprintf("/property:OutputPath=%s%s",
                        binaryOutputDir.absolutePath,
                        File.separator),
-               "/verbosity:quiet",
+               "/verbosity:normal",
                projectToBuild.absolutePath])
       }
     }

Please answer the following, if applicable:

What's the issue repro rate? (eg 100%, 1/5 etc)

What happened? How can we make the problem occur? This could be a description, log/console output, etc.

If you have a downloadable sample project that reproduces the bug you're reporting, you will likely receive a faster response on your issue.

patm1987 avatar Jun 24 '21 23:06 patm1987

@patm1987

Thanks for the detail investigation!

There are a number of obstacle to build EDM4U on Windows. Another one is related to the Python the build script try to download, which is invalid if the current platform is Windows.

We can do some investigation to make sure EDM4U can build on Windows and with later versions of Unity.

chkuang-g avatar Jun 30 '21 00:06 chkuang-g

I believe I am having this issue. In Unity it says what's in this post : https://answers.unity.com/questions/1849801/gradle-build-failed-unity-2020314-incompatible-dae.html?childToView=1881734 In the link I posted I have tried all suggested solutions with no avail.

cadenburleson avatar Jan 17 '22 23:01 cadenburleson

I was actually attempting to build this project on Windows as well, and I casually ended up on the same XBuild issues on top of the latest Unity 2020 LTS. Accidentially we made the very same patches and we reached the very same conclusion.

For anyone curious to checkout the project here you can find the branch I was attempting the fix: https://github.com/julianxhokaxhiu/unity-jar-resolver/tree/bugfix/windows-build

I was tempted to convert the script to MSBuild but I'm not sure how much this would really fix the whole build or create more issues. Maybe it's worth to know what Google is doing around this project and what is the direction.

julianxhokaxhiu avatar Mar 20 '22 17:03 julianxhokaxhiu