summaryrefslogtreecommitdiffstats
blob: 5f1989889ad1c5bdf009081d231f0b23d402259d (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
65
66
67
68
69
import SCons.Util, os.path

def generate(env) :
    def createAppBundle(env, bundle, version = "1.0", resources = [], frameworks = [], info = {}, handlesXMPPURIs = False, sparklePublicDSAKey = None) :
        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" : "(c) 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"""

        if sparklePublicDSAKey :
            plist += "<key>SUPublicDSAKeyFile</key>"
            plist += "<string>" + sparklePublicDSAKey.name.encode("utf-8") + "</string>"
            env.Install(resourcesDir, sparklePublicDSAKey)
        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"