summaryrefslogtreecommitdiffstats
blob: 6a343f6933eacb6fd384e184691f743e7419db88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import SCons.Util, os.path

def generate(env) :
  def createAppBundle(env, bundle, version = "1.0", resources = [], frameworks = [], info = {}, handlesXMPPURIs = False) :
    bundleDir = bundle + ".app"
    bundleContentsDir = bundleDir + "/Contents"
    resourcesDir = bundleContentsDir + "/Resources"
    frameworksDir = bundleContentsDir + "/Frameworks"
    env.Install(bundleContentsDir + "/MacOS", bundle)
    env.WriteVal(bundleContentsDir + "/PkgInfo", env.Value("APPL\77\77\77\77"))

    infoDict = {
        "CFBundleDevelopmentRegion" : "English",
        "CFBundleExecutable" : bundle,
        "CFBundleIdentifier" : "im.swift." + bundle,
        "CFBundleInfoDictionaryVersion" : "6.0",
        "CFBundleName" : bundle,
        "CFBundlePackageType" : "APPL",
        "CFBundleSignature": "\77\77\77\77",
        "CFBundleVersion" : version,
        "CFBundleIconFile" : bundle,
        "NSPrincipalClass" : "NSApplication",
        "NSHumanReadableCopyright" : unichr(0xA9) + " 2010 Swift Development Team.\nAll Rights Reserved."
      }
    infoDict.update(info)
    
    plist = """<?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>
  """
    for key, value in infoDict.items() :
      plist += "<key>" + key + "</key>\n"
      plist += "<string>" + value.encode("utf-8") + "</string>\n"
    if handlesXMPPURIs :
      plist += """<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>XMPP URL</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>xmpp</string>
        </array>
    </dict>
</array>\n"""
    plist += """</dict>
  </plist>
  """
    env.WriteVal(bundleContentsDir + "/Info.plist", env.Value(plist))

    for (target, resource) in resources.items() :
      env.Install(os.path.join(resourcesDir, target), resource)

    for framework in frameworks :
      env.Install(frameworksDir, framework)

    return env.Dir(bundleDir)

  env.AddMethod(createAppBundle, "AppBundle")


def exists(env) :
  return env["PLATFORM"] == "darwin"