mkbundle --cross

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

mkbundle --cross

Alexander Köplinger via Mono-devel-list

Hello everybody,
I would like to build a 'all in one' OSX program from linux (ubuntu).

This is the linux version I'm using:
Linux  4.4.0-81-generic #104-Ubuntu SMP Wed Jun 14 08:17:06 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

This and the Mono version installed:
Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Thu May 25 09:16:53 UTC 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           __thread
    SIGSEGV:       altstack
    Notifications: epoll
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug
    LLVM:          supported, not enabled.
    GC:            sgen (concurrent by default)

These are the necessary frameworks to run my program:
    Microsoft.CSharp.dll
    System.Configuration.dll
    System.Data.DataSetExtensions.dll
    System.Data.dll
    System.Deployment.dll
    System.dll
    System.Drawing.dll
    System.IO.Compression.dll
    System.IO.Compression.FileSystem.dll
    System.Net.Http.dll
    System.Runtime.Serialization.dll
    System.Web.dll
    System.Web.Extensions.dll
    System.Windows.Forms.dll
    System.Xml.dll
    System.Xml.Linq.dll

I took the following environments using the command "mkbundle --fetch-target":
mono-5.0.1-osx-10.7-i386.zip

I ran the build, using mkbundle, with the following command:
$ mkbundle --deps --cross mono-5.0.1-osx-10.7-i386.zip -o launcher-mac CHElauncher.exe

And this is the resulting output:
From: ~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip
Using runtime:
~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/bin/mono
    Assembly:
~/mac/CHElauncher.exe
    Assembly:
~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.West.dll
    Assembly:
~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.dll
Generated launcher-mac

Note that my program runs fine in windows, linux and mac environments but when I move
the resulting file from the build to the mac pc, where no mono environment is installed, and run it, I get the following error:
$ ./CHElauncher.exe
The assembly mscorlib.dll was not found or could not be loaded.
It should have been installed in the `/Library/Frameworks/Mono.framework/Versions/5.0.1/lib/mono/4.5/mscorlib.dll' directory.


I also tried to add mscorlib.dll to the command line mkbundle and I received this error:

Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

Could you explain to me what I'm wrong?

Thanks in advance for your attention.



_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: mkbundle --cross

David Curylo
You need to also add System.dll to the command line, and you’ll find that you have to add all of those other libraries, as well as possibly a few other that are under /usr/lib/mono/4.5/Facades if you use things like from those libraries like TaskExtensions from System.Threading.Tasks.dll.  According to the docs, --deps is supposed to discover those, but I’ve never been able to get it to find them even though things are directly referenced (not loading by reflection or anything).

I think you also need the --static flag to embed the mono runtime libraries.

On Jun 27, 2017, at 5:27 AM, dmaxime via Mono-devel-list <[hidden email]> wrote:

Hello everybody,
I would like to build a 'all in one' OSX program from linux (ubuntu).

This is the linux version I'm using:
Linux  4.4.0-81-generic #104-Ubuntu SMP Wed Jun 14 08:17:06 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

This and the Mono version installed:
Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Thu May 25 09:16:53 UTC 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           __thread
    SIGSEGV:       altstack
    Notifications: epoll
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug
    LLVM:          supported, not enabled.
    GC:            sgen (concurrent by default)

These are the necessary frameworks to run my program:
    Microsoft.CSharp.dll
    System.Configuration.dll
    System.Data.DataSetExtensions.dll
    System.Data.dll
    System.Deployment.dll
    System.dll
    System.Drawing.dll
    System.IO.Compression.dll
    System.IO.Compression.FileSystem.dll
    System.Net.Http.dll
    System.Runtime.Serialization.dll
    System.Web.dll
    System.Web.Extensions.dll
    System.Windows.Forms.dll
    System.Xml.dll
    System.Xml.Linq.dll

I took the following environments using the command "mkbundle --fetch-target":
mono-5.0.1-osx-10.7-i386.zip

I ran the build, using mkbundle, with the following command:
$ mkbundle --deps --cross mono-5.0.1-osx-10.7-i386.zip -o launcher-mac CHElauncher.exe

And this is the resulting output:
From: ~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip
Using runtime:
~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/bin/mono
    Assembly:
~/mac/CHElauncher.exe
    Assembly:
~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.West.dll
    Assembly:
~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.dll
Generated launcher-mac

Note that my program runs fine in windows, linux and mac environments but when I move
the resulting file from the build to the mac pc, where no mono environment is installed, and run it, I get the following error:
$ ./CHElauncher.exe
The assembly mscorlib.dll was not found or could not be loaded.
It should have been installed in the `/Library/Frameworks/Mono.framework/Versions/5.0.1/lib/mono/4.5/mscorlib.dll' directory.


I also tried to add mscorlib.dll to the command line mkbundle and I received this error:

Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

Could you explain to me what I'm wrong?

Thanks in advance for your attention.


_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list


_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: mkbundle --cross

Alexander Köplinger via Mono-devel-list

Hi, David,
I followed your advice and now my program runs fine on mac but I found other issues I would like
to point out to you::

If there are dlls with the same name in the current folder, mkbundle ignores the path on the command line (look path of System.dll):

$ mkbundle --deps --static --cross mono-5.0.1-osx-10.7-i386.zip -o launcher-mac CHElauncher.exe /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/System.dll
From: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip
Using runtime: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/bin/mono
     Assembly: /home/jak/mac/CHElauncher
     Assembly: /home/jak/mac/System.dll
     Assembly: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.West.dll
     Assembly: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.dll
Generated launcher-mac

(now I remove local file System.dll)

$ rm System.dll

$ mkbundle --deps --static --cross mono-5.0.1-osx-10.7-i386.zip -o launcher-mac CHElauncher.exe /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/System.dll
From: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip
Using runtime: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/bin/mono
     Assembly: /home/jak/mac/CHElauncher
     Assembly: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/System.dll
     Assembly: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.West.dll
     Assembly: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.dll
Generated launcher-mac

Also, I've looked at mkbundle source code on https://github.com/mono/mono/blob/master/mcs/tools/mkbundle/mkbundle.cs. I do not have the ability to use debugging tools on it, but it seems that in the QueueAssembly function, the first time recursively called, the first if is satisfied, so it ends up returning true, true again and stops its work. To follow, I send you the piece of code that I used to find out about the dependencies of my program. It is not recursive and seems to do its job properly. I've grubbed it here: https://stackoverflow.com/questions/851248/c-sharp-reflection-get-all-active-assemblies-in-a-solution .

        static int Main(string[] args) 
        {
            List<string> ass_name = new List<string>();

            try
            {
                foreach(var e in GetAssemblies(@args[0]))
                    ass_name.Add(e.GetName().Name);

                foreach(var e in ass_name)
                    Console.WriteLine(e);
            }
            catch(Exception e)
            {
                Console.WriteLine("An exception occurred: {0}", e.Message);
                return 1;
            }
            return 0;
        }

        public static IEnumerable<Assembly> GetAssemblies(string fname)
        {
            var list = new List<string>();
            var stack = new Stack<Assembly>();
            Assembly asm = null;
            stack.Push(Assembly.LoadFile(fname));

            do
            {
                asm = stack.Pop();

                yield return asm;

                foreach (var reference in asm.GetReferencedAssemblies())
                {
                    if (!list.Contains(reference.FullName))
                    {
                        stack.Push(Assembly.Load(reference));
                        list.Add(reference.FullName);
                    }
                }
            }
            while (stack.Count > 0);
        }    

I noticed another thing in mkbundle source code: the VerifySdk function verifies the presence of the runtime in sdk_path/bin/mono but in the windows environment there is no file called 'mono' in the folder, there is only mono.exe

Thank you again for your attention.
Greetings.

Il 27/06/2017 14:06, David Curylo ha scritto:
You need to also add System.dll to the command line, and you’ll find that you have to add all of those other libraries, as well as possibly a few other that are under /usr/lib/mono/4.5/Facades if you use things like from those libraries like TaskExtensions from System.Threading.Tasks.dll.  According to the docs, --deps is supposed to discover those, but I’ve never been able to get it to find them even though things are directly referenced (not loading by reflection or anything).

I think you also need the --static flag to embed the mono runtime libraries.

On Jun 27, 2017, at 5:27 AM, dmaxime via Mono-devel-list <[hidden email]> wrote:

Hello everybody,
I would like to build a 'all in one' OSX program from linux (ubuntu).

This is the linux version I'm using:
Linux  4.4.0-81-generic #104-Ubuntu SMP Wed Jun 14 08:17:06 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

This and the Mono version installed:
Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Thu May 25 09:16:53 UTC 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           __thread
    SIGSEGV:       altstack
    Notifications: epoll
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug
    LLVM:          supported, not enabled.
    GC:            sgen (concurrent by default)

These are the necessary frameworks to run my program:
    Microsoft.CSharp.dll
    System.Configuration.dll
    System.Data.DataSetExtensions.dll
    System.Data.dll
    System.Deployment.dll
    System.dll
    System.Drawing.dll
    System.IO.Compression.dll
    System.IO.Compression.FileSystem.dll
    System.Net.Http.dll
    System.Runtime.Serialization.dll
    System.Web.dll
    System.Web.Extensions.dll
    System.Windows.Forms.dll
    System.Xml.dll
    System.Xml.Linq.dll

I took the following environments using the command "mkbundle --fetch-target":
mono-5.0.1-osx-10.7-i386.zip

I ran the build, using mkbundle, with the following command:
$ mkbundle --deps --cross mono-5.0.1-osx-10.7-i386.zip -o launcher-mac CHElauncher.exe

And this is the resulting output:
From: ~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip
Using runtime:
~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/bin/mono
    Assembly:
~/mac/CHElauncher.exe
    Assembly:
~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.West.dll
    Assembly:
~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.dll
Generated launcher-mac

Note that my program runs fine in windows, linux and mac environments but when I move
the resulting file from the build to the mac pc, where no mono environment is installed, and run it, I get the following error:
$ ./CHElauncher.exe
The assembly mscorlib.dll was not found or could not be loaded.
It should have been installed in the `/Library/Frameworks/Mono.framework/Versions/5.0.1/lib/mono/4.5/mscorlib.dll' directory.


I also tried to add mscorlib.dll to the command line mkbundle and I received this error:

Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

Could you explain to me what I'm wrong?

Thanks in advance for your attention.


_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list



_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list
Loading...