working_from_macos.md 4.1 KB

Working on MacOS

Copied from here: https://github.com/raysan5/raylib/wiki/Working-on-macOS

Building raylib without Xcode (statically)

Building statically means you can run this application on other machines with ease - users won't have to have any of the frameworks installed that are required. Also, this will work on mac's 10.9 and up.

Here's the quick instructions:

  1. From the command line

    export MACOSX_DEPLOYMENT_TARGET=10.9
    
  2. Install XCode tools (don't forget to then update the tools in the Mac App Store after!)

    xcode-select --install
    
  3. Build Vinora and raylib (Again, this is so the export line takes effect)

    make
    

You may do the otool check with the file in external/raylib/libraylib.a here if you like. (LC_VERSION_MIN_MACOSX should be version 10.4), and we're good!

  1. Build your project! (TODO: THIS NEED TO BE INCLUDED IN MAKEFILE)

    clang -framework CoreVideo -framework IOKit -framework Cocoa -framework\
    GLUT -framework OpenGL libraylib.a my_app.c -o my_app
    

Note: If you are compiling a C++ project, you will need to make sure your compiler supports C++11 standards. With clang you can enable this by passing -std=c++11, see https://clang.llvm.org/cxx_status.html for more details.

Check for warnings! This can tell you if a library you're linking to was not built for OSX 10.9, in which case you'll need to rebuild that too.

Check otool one last time for the LC_VERSION_MIN_MACOSX version:

otool -l my_app

Last thing, let me show you something cool:

otool -L my_app

This shows you everything your application links to. Basically, if anything is pointing to anything but /usr/lib/* or /System/Library/*, your application will throw an error if you run it on any other Mac. It's not portable. For example if it's linking to something in /usr/local/lib, or a relative folder, that would be bad. But after the above, you should be clear of dynamic dependencies!

Bundle your app in an Application

mkdir standard.app/Contents
mkdir standard.app/Contents/MacOS
mkdir standard.app/Contents/Resources
touch standard.app/Contents/Info.plist

The app you just created, "my_app" should go in the MacOS folder.

mv my_app standard.app/Contents/MacOS

Info.plist should read like this:

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <key>CFBundleExecutable</key>
      <string>my_app</string>
    </dict>
    </plist>

See more fields you can add here: https://stackoverflow.com/questions/1596945/building-osx-app-bundle

Now you can double click on standard.app and it will run your application! Note that some things will be cached by the OS. If you want to refresh your application bundle run this:

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -f standard.app

This has a whole lot of potentially useful info on all the apps on your system, you can use this to determine if the version is correct I suppose:

 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump > dump.txt

Just search for your app in dump.txt.

Creating a DMG image for sharing your app

You could just as easily do a zip I suppose, but DMGs are fashionable aren't they?

Here's a 32 megabyte dmg:

  1. Create the writeable dmg.

    hdiutil create -size 32m -fs HFS+ -volname "My App" my_app_writeable.dmg
    
  2. Attach my_app_writeable.dmg. This should tell you something like /dev/disk3 or something. Make a note of that, you'll need it for the next step.

    hdiutil attach my_app_writeable.dmg
    
  3. Drag your app into the dmg. Then run this, replacing disk999 with whatever /dev/disk was specified in the previous step.

    hdiutil detach /dev/disk999
    
  4. Convert to my_app.dmg.

    hdiutil convert my_app_writeable.dmg -format UDZO -o my_app.dmg
    
  5. Share it. Congratulations, my_app.dmg is ready to be sent to all your most trusted game critics.