diff --git a/compile-scripts/README.md b/compile-scripts/README.md
index 8ecc46b..a7a25d5 100644
--- a/compile-scripts/README.md
+++ b/compile-scripts/README.md
@@ -6,9 +6,16 @@ and Linux ones require Ruby (which is usually pre-installed). There are no
 instructions - if you can't figure out what these do from reading the scripts,
 you almost certainly should not be using them!
 
-They all assume a top-level folder (called 'FGFS' in my case) which contains
+They all assume a top-level folder  which contains
 checkouts of simgear, flightgear, fgdata, OpenSceneGraph (into a dir named
   'osg') and the windows-3rd-party dir in the case of Windows. It's assumed
   you copy the script to that same dir, edit paths and run from there.
 
+The Mac and Linux scripts will do the checkout for you - the Windows is not
+so smart because Window batch scripts are not my friend.
+
+On Mac you will need to grab the 3rdparty-dependency-build from Jenkins, or
+build PLIB manually yourself, either should be straightforward. For all other
+dependencies on Mac / Linux use your package manager / Homebrew.
+
 Files will be installed into a subdir called 'dist'
diff --git a/compile-scripts/commands-linux.rb b/compile-scripts/commands-linux.rb
new file mode 100755
index 0000000..6816115
--- /dev/null
+++ b/compile-scripts/commands-linux.rb
@@ -0,0 +1,130 @@
+#!/usr/bin/ruby
+
+require 'fileutils'
+require 'optparse'
+include FileUtils
+
+baseDir = Dir.pwd
+gitArgs = ""
+qtPath = ""
+
+doPull = false
+doCMake = false
+doInit = false
+doClean = false
+doPackage = false
+
+cmakeCommonArgs = "-DCMAKE_INSTALL_PREFIX=#{baseDir}/dist -DSIMGEAR_SHARED=1"
+cmakeFGArgs = ""
+sfUser = "jmturner"
+
+OptionParser.new do |opts|
+  opts.banner = "Usage: commands.rb [options]"
+  opts.on("", "--init", "Setup empty") do |v|
+    doInit = v
+  end
+
+  opts.on("-p", "--[no-]pull", "Pull from Git") do |v|
+    doPull = v
+  end
+  opts.on("-c", "--cmake", "Run Cmake") do |v|
+    doCMake = v
+  end
+  opts.on("", "--clean", "Clean build dirs") do |v|
+    doClean = v
+  end
+  opts.on("-r", "--rebase", "Rebase when pulling") do |v|
+    gitArgs += "--rebase"
+  end
+
+  opts.on("", "--qt=QTPATH", "Set Qt path when running cmake") do |v|
+    qtPath = v
+  end
+end.parse!(ARGV)
+
+def cloneEverything()
+  puts "Initialising"
+  if File.exist?("#{Dir.pwd}/simgear") or File.exist?("#{Dir.pwd}/flightgear")
+    puts "Checkout already exists"
+    return
+  end
+
+  `git clone ssh://#{sfUser}@git.code.sf.net/p/flightgear/simgear simgear`
+  `git clone ssh://#{sfUser}@git.code.sf.net/p/flightgear/flightgear flightgear`
+  `git clone ssh://#{sfUser}@git.code.sf.net/p/flightgear/fgdata fgdata`
+  `git clone https://github.com/openscenegraph/osg.git osg`
+end
+
+def createDirs()
+  `mkdir -p sgbuild`
+  `mkdir -p fgbuild`
+  `mkdir -p osg_release_build`
+end
+
+# path is needed for Cmake & running macdeployqt
+if qtPath != ""
+  ENV['PATH'] = "#{ENV['PATH']}:#{qtPath}/bin"
+end
+
+if doClean
+  puts "Cleaning build dirs"
+  `rm -r sgbuild`
+  `rm -r fgbuild`
+  `rm -r osg_release_build`
+  createDirs()
+end
+
+if doInit
+  puts "Doing init"
+    cloneEverything()
+    createDirs();
+end
+
+if doPull
+  puts "Pulling from Git"
+  dataPull = Thread.new do
+    puts "Syncing FGData"
+    Dir.chdir "#{baseDir}/fgdata"
+    `git pull #{gitArgs}`
+  end
+
+  Dir.chdir "#{baseDir}/simgear"
+  `git pull #{gitArgs}`
+
+  Dir.chdir "#{baseDir}/flightgear"
+  `git pull #{gitArgs}`
+end
+
+Dir.chdir "#{baseDir}/osg_release_build"
+if doCMake or !File.exist?("#{Dir.pwd}/Makefile")
+  `cmake ../osg -DCMAKE_INSTALL_PREFIX=#{baseDir}/dist`
+end
+
+puts "Building OpenSceneGraph"
+`make`
+`make install`
+
+Dir.chdir "#{baseDir}/sgbuild"
+
+if doCMake or !File.exist?("#{Dir.pwd}/Makefile")
+  `cmake ../simgear #{cmakeCommonArgs}`
+end
+
+puts "Building SimGear"
+`make`
+`make install`
+
+Dir.chdir "#{baseDir}/fgbuild"
+
+if doCMake or !File.exist?("#{Dir.pwd}/Makefile")
+  if qtPath != ""
+    cmakeFGArgs = '-DENABLE_QT=1'
+  end
+  `cmake ../flightgear #{cmakeCommonArgs} #{cmakeFGArgs}`
+end
+
+puts "Building FlightGear"
+`make`
+`make install`
+
+puts "All done."
diff --git a/compile-scripts/commands-mac.rb b/compile-scripts/commands-mac.rb
new file mode 100755
index 0000000..ed01055
--- /dev/null
+++ b/compile-scripts/commands-mac.rb
@@ -0,0 +1,134 @@
+#!/usr/bin/ruby
+
+require 'fileutils'
+require 'optparse'
+include FileUtils
+
+baseDir = Dir.pwd
+gitArgs = ""
+qtPath = ""
+
+doPull = false
+doCMake = false
+doInit = false
+doClean = false
+doPackage = false
+
+cmakeCommonArgs = "-G Xcode -DCMAKE_INSTALL_PREFIX=#{baseDir}/dist"
+cmakeSGArgs = "-DSIMGEAR_SHARED=1 -DENABLE_CURL=0"
+cmakeFGArgs = "-DSIMGEAR_SHARED=1"
+sfUser = "jmturner"
+
+OptionParser.new do |opts|
+  opts.banner = "Usage: commands.rb [options]"
+  opts.on("", "--init", "Setup empty") do |v|
+    doInit = v
+  end
+
+  opts.on("-p", "--[no-]pull", "Pull from Git") do |v|
+    doPull = v
+  end
+  opts.on("-c", "--cmake", "Run Cmake") do |v|
+    doCMake = v
+  end
+  opts.on("", "--clean", "Clean build dirs") do |v|
+    doClean = v
+  end
+  opts.on("-r", "--rebase", "Rebase when pulling") do |v|
+    gitArgs += "--rebase"
+  end
+
+  opts.on("", "--qt=QTPATH", "Set Qt path when running cmake") do |v|
+    qtPath = v
+  end
+end.parse!(ARGV)
+
+def cloneEverything()
+  puts "Initialising"
+  if File.exist?("#{Dir.pwd}/simgear") or File.exist?("#{Dir.pwd}/flightgear")
+    puts "Checkout already exists"
+    return
+  end
+
+  `git clone ssh://#{sfUser}@git.code.sf.net/p/flightgear/simgear simgear`
+  `git clone ssh://#{sfUser}@git.code.sf.net/p/flightgear/flightgear flightgear`
+  `git clone git@github.com:zakalawe/osg.git osg`
+end
+
+def createDirs()
+  `mkdir -p sgbuild`
+  `mkdir -p fgbuild`
+  `mkdir -p osg_mac_release_build`
+end
+
+# path is needed for Cmake & running macdeployqt
+if qtPath != ""
+  ENV['PATH'] = "#{ENV['PATH']}:#{qtPath}/bin"
+end
+
+if doClean
+  puts "Cleaning build dirs"
+  `rm -r sgbuild`
+  `rm -r fgbuild`
+  `rm -r osg_mac_release_build`
+  createDirs()
+end
+
+if doInit
+  puts "Doing init"
+    cloneEverything()
+    createDirs();
+end
+
+if doPull
+  puts "Pulling from Git"
+  dataPull = Thread.new do
+    puts "Syncing FGData"
+    Dir.chdir "#{baseDir}/fgdata"
+    `git pull #{gitArgs}`
+  end
+
+  Dir.chdir "#{baseDir}/simgear"
+  `git pull #{gitArgs}`
+
+  Dir.chdir "#{baseDir}/flightgear"
+  `git pull #{gitArgs}`
+end
+
+Dir.chdir "#{baseDir}/osg_mac_release_build"
+if doCMake or !File.exist?("#{Dir.pwd}/Makefile")
+  `cmake ../osg -DCMAKE_INSTALL_PREFIX=#{baseDir}/dist`
+end
+
+puts "Building OpenSceneGraph"
+`make -j4`
+`make install`
+
+Dir.chdir "#{baseDir}/sgbuild"
+
+if doCMake or !File.exist?("#{Dir.pwd}/SimGear.xcodeproj")
+  `cmake ../simgear #{cmakeCommonArgs} #{cmakeSGArgs}`
+end
+
+puts "Building SimGear Debug"
+`xcodebuild -target install -configuration Debug`
+
+puts "Building SimGear Release"
+`xcodebuild -target install -configuration Release`
+
+Dir.chdir "#{baseDir}/fgbuild"
+
+if doCMake or !File.exist?("#{Dir.pwd}/FlightGear.xcodeproj")
+  if qtPath != ""
+    cmakeFGArgs = '-DENABLE_QT=1'
+  end
+  `cmake ../flightgear #{cmakeCommonArgs} #{cmakeFGArgs}`
+end
+
+puts "Building FlightGear Debug"
+`xcodebuild -target fgfs -configuration Debug`
+
+puts "Building FlightGear Release"
+`xcodebuild -target fgfs -configuration Release`
+
+puts "All done."