summaryrefslogtreecommitdiffstats
path: root/build/osx
diff options
context:
space:
mode:
Diffstat (limited to 'build/osx')
-rw-r--r--build/osx/OSConsX.py720
-rw-r--r--build/osx/README1
-rw-r--r--build/osx/crossosx.py142
-rw-r--r--build/osx/entitlements.plist28
-rw-r--r--build/osx/golden_environment1
-rwxr-xr-xbuild/osx/install_environment.sh13
-rw-r--r--build/osx/otool.py239
-rw-r--r--build/osx/product_definition.plist14
8 files changed, 0 insertions, 1158 deletions
diff --git a/build/osx/OSConsX.py b/build/osx/OSConsX.py
deleted file mode 100644
index 1aa7da5f72..0000000000
--- a/build/osx/OSConsX.py
+++ /dev/null
@@ -1,720 +0,0 @@
-"""
-OSConsX.py - scons support for building applications on OS X using SCons.
-
-Functions to build .app bundles and .dmg images, and to use otool(1) to trace
-out the needed libraries.
-
-usage:
-
-env = Environment(tools = ['OSConsX', toolpath=['path/to/osconsx'])
-env.App('
-
-By <nick@kousu.ca> January 16th 2009
-License: 2-clause BSD (XXX put a proper notice here)
-
-
-Please email me with questions/comments/patches!
-
-TODO:
-- add a CheckFramework() call that looks for a framework (and maybe adds to
- CXXFLAGS||CPPATH||LINKFLAGS if found)
- """
-
-import sys
-import os
-import shutil
-import stat
-import SCons
-from SCons.Builder import Builder
-from SCons.Script import Copy, Dir, Execute, File, Glob, Mkdir
-import otool
-
-# Dev info:
-# http://doc.trolltech.com/qq/qq09-mac-deployment.html
-# http://www.scons.org/wiki/MacOSX
-# (not very featureful, but the tip about resource forks might be important
-# (wait did I say important? I meant out of date. see CpMac(1))
-
-# oooh, you can use warnings! just call "warn()"
-
-
-def system(s):
- """
- Wrap system() to give us feedback on what it's doing.
-
- Anything using this call should be fixed to use SCons's declarative style
- (once you figure that out, right nick?)
- """
- print(s),
- sys.stdout.flush() # ignore line buffering..
- result = os.system(s)
- print()
- return result
-
-
-def no_sources(target, source, env):
- """
- An emitter that forces null sources.
-
- So that we don't need to have the user explicitly say there are no
- dependencies (SCons assumes that if you are building 'X.out' then you need
- 'X.in')
- """
- return target, []
-
-
-def InstallDir(target, source, env): # XXX this belongs not in this module
- """
- Copies the given source dir inside of the given target dir.
- """
- # XXX could be rewritten better with schemey-recursion as "if source is
- # File: env.Install(), elif source is Dir, scan the dir and recurse"
- # SCons doesn't really like using directories as targets. Like, at all.
- # Mkdir(os.path.join(str(target), str(source)))
- # translate install(a/, b/) to install(a/b/, [files in b])
- contents = Glob(
- os.path.join(str(source), "*")
- ) # XXX there's probably a cleaner way that SCons has to do this
- # print("contents:", contents)
- files = filter(lambda f: isinstance(f, SCons.Node.FS.File), contents)
- folders = filter(lambda f: isinstance(f, SCons.Node.FS.Dir), contents)
- # print(map(str, folders))
- name = os.path.basename(str(source))
-
- # install the files local to this
- nodes = env.Install(Dir(os.path.join(str(target), name)), files)
-
- # now recursively install the subfolders
- for f in folders:
- nodes += InstallDir(Dir(os.path.join(str(target), name)), f, env)
- return nodes
-
-
-# okay, this works. It could be done better (make better use of SCons's
-# declarativity, look at http://frungy.org/~tpot/weblog/2008/05/02#scons-rpm2
-# for ideas) Specifically, this does file copying by itself, instead of telling
-# SCons about it.
-# On the other hand, the files it is copying are not really part of the build
-# process, they are tmp files, so maybe it works....
-# BUG: scons doesn't track that it's built the .dmg. It decides it needs to
-# build it every time "because it doesn't exist".
-def build_dmg(target, source, env):
- """
- Builds a *.dmg file.
-
- Takes the given source files, makes a temporary directory, copies them all
- there, and then packages that directory into a .dmg.
- """
- # TODO: make emit_dmg emit that we are making the Dmg that we are making
-
- # since we are building into a single .dmg, coerce target to point at the
- # actual name
- assert len(target) == 1
- target = target[0]
-
- # I'm going to let us overwrite the .dmg for now - Albert
- # huhh? why do I have to say +.dmg here? I thought scons was supposed to
- # handle that
- # if os.path.exists(str(target)+".dmg"):
- # raise Exception(".dmg target already exists.")
-
- # if 'DMG_DIR' in env: .... etc fill me in please
- dmg = (
- os.tmpnam() + "-" + env["VOLNAME"].strip() + "-dmg"
- ) # create a directory to build the .dmg root from
-
- # is os.system the best thing for this? Can't we declare that these files
- # need to be moved somehow? aah there must be a more SCons-ey (i.e.
- # declarative) way to do all this; the trouble with doing
- os.mkdir(dmg)
- for f in source:
- print("Copying", f)
- a, b = str(f), os.path.join(dmg, os.path.basename(str(f.path)))
- if isinstance(f, SCons.Node.FS.Dir):
- # XXX there's a lot of cases that could throw this off,
- # particularly if you try to pass in subdirs
- copier = shutil.copytree
- elif isinstance(f, SCons.Node.FS.File):
- copier = shutil.copy
- else:
- raise Exception(
- "%s is neither Dir nor File node? Bailing out." % f
- )
-
- try:
- copier(a, b)
- except Exception as e:
- print("ERRRR", e)
- raise Exception("Error copying %s: " % (a,), e)
-
- # Symlink Applications to /Applications
- os.system("ln -s /Applications %s" % os.path.join(dmg, "Applications"))
-
- if env["ICON"]:
- env["ICON"] = File(str(env["ICON"]))
- # make sure the given file is an icon; scons does this wrapping for us
- # on sources and targets but not on environment vars (obviously, that
- # would be stupid).
- # XXX this doesn't seem to work, at least not on MacOS 10.5
- # the MacFUSE people have solved it, though, see "._" in
- # http://www.google.com/codesearch/p?hl=en#OXKFx3-7cSY/tags/macfuse-1.0.0/filesystems-objc/FUSEObjC/FUSEFileSystem.m&q=volumeicon
- # appearently it requires making a special volume header file named
- # "._$VOLNAME" with a binary blob in it But also the Qt4 dmg has a
- # working icon, and it has no ._$VOLNAME file
-
- # XXX bug: will crash if not given an icon file
- shutil.copy(str(env["ICON"]), os.path.join(dmg, ".VolumeIcon.icns"))
- # is there an sconsey way to declare this? Would be nice so that it
- # could write what
- system('SetFile -a C "%s"' % dmg)
-
- # TODO(rryan): hdiutil has a bug where if srcfolder is greater than 100M it
- # fails to create a DMG with error -5341. The actual size of the resulting
- # DMG is not affected by the -size parameter -- I think it's just the size
- # of the "partition" in the DMG. Hard-coding 150M is a band-aid to get the
- # build working again while we figure out the right solution.
- if system(
- "hdiutil create -size 150M -srcfolder %s -format UDBZ -ov "
- "-volname %s %s" % (dmg, env["VOLNAME"], target)
- ):
- raise Exception("hdiutil create failed")
-
- shutil.rmtree(dmg)
-
-
-Dmg = Builder(action=build_dmg, suffix=".dmg")
-
-
-class Bundle(SCons.Node.Node):
- """
- Bundle Node.
-
- Until SCons gets its shit together and is able to handle having directories
- as targets, we use this
- """
-
- def __init__(self, path):
- path = str(path) # decast the object from being a File or a Dir
- self.path = path
- SCons.Node.Node.__init__(self)
- self.clear()
- assert self.path == path, "Node constructor overwrote .path :("
-
- def __str__(self):
- return self.path
-
- def __repr__(self):
- return 'Bundle("%s")' % self.path
-
-
-def write_file(target, source, env):
- data = env["DATA"]
- for t in target:
- f = open(str(t), "wb")
- f.write(data)
- f.close()
-
-
-# should be in a different module, really
-Writer = Builder(action=write_file, emitter=no_sources)
-
-
-def build_app(target, source, env):
- """
- Build App.
-
- PLUGINS - a list of plugins to install; as a feature/hack/bug (inspired by
- Qt, but probably needed by other libs) you can pass a tuple where the first
- is the file/node and the second is the folder under PlugIns/ that you want
- it installed to
- """
- # TODO: make it strip(1) the installed binary (saves about 1Mb)
-
- # EEEP: this code is pretty flakey because I can't figure out how to force;
- # have asked the scons list about it
-
- # This doesn't handle Frameworks correctly, only .dylibs
- # useful to know:
- # http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/
- # Concepts/FrameworkAnatomy.html#//apple_ref/doc/uid/20002253
- # ^ so you do have to copy in and _entire_ framework to be sure...
- # but for some frameworks it's okay to pretend they are regular
-
- bundle = target[0]
- binary = source[0]
-
- # this is copied from emit_app, which is unfortunate
- contents = Dir(os.path.join(str(bundle), "Contents"))
- MacOS = Dir(os.path.join(str(contents), "MacOS/"))
- frameworks = Dir(
- os.path.join(str(contents), "Frameworks")
- ) # we put both frameworks and standard unix sharedlibs in here
- plugins = Dir(os.path.join(str(contents), "PlugIns"))
-
- # installed_bin = source[-1] #env['APP_INSTALLED_BIN']
- installed_bin = os.path.join(str(MacOS), os.path.basename(str(binary)))
-
- strip = bool(env.get("STRIP", False))
-
- otool_local_paths = env.get("OTOOL_LOCAL_PATHS", [])
- otool_system_paths = env.get("OTOOL_SYSTEM_PATHS", [])
-
- # TODO: expose the ability to override the list of System dirs
- # ugh, I really don't like this... I wish I could package it up nicer. I
- # could use a Builder but then I would have to pass in to the builder
- # installed_bin which seems backwards since
-
- # could we use patch_lib on the initial binary itself????
-
- def embed_lib(abs):
- """
- Get the path to embed library abs in the bundle.
- """
- name = os.path.basename(abs)
- return os.path.join(str(frameworks), name)
-
- def relative(emb):
- """
- Compute the path of the given embedded binary relative to the binary.
-
- (i.e. @executable_path/../+...)
- """
- # assume that we start in X.app/Contents/, since we know necessarily
- # that @executable_path/../ gives us that so then we only need
- base = os.path.abspath(str(installed_bin))
- emb = os.path.abspath(emb) # XXX is abspath really necessary?
- # the path from Contents/ down to the file. Since we are taking away
- # the length of the common prefix we are left with only what is unique
- # to the embedded library's path
- down = emb[len(os.path.commonprefix([base, emb])) :]
- return os.path.join("@executable_path/../", down)
-
- # todo: precache all this shit, in case we have to change the install names
- # of a lot of libraries
-
- def automagic_references(embedded): # XXX bad name
- "modify a binary file to patch up all it's references"
-
- for ref in otool.dependencies(embedded):
- if ref in locals:
- embd = locals[ref][
- 1
- ] # the path that this reference is getting embedded at
- otool.change_ref(str(embedded), ref, relative(embd))
-
- def patch_lib(embedded):
- otool.change_id(
- embedded, relative(embedded)
- ) # change the name the library knows itself as
- automagic_references(embedded)
- if strip:
- # XXX stripping seems to only work on libs compiled a certain way,
- # todo: try out ALL the options, see if can adapt it to work on
- # every sort of lib
- system("strip -S '%s' 2>/dev/null" % embedded)
- # (the stripping fails with ""symbols referenced by relocation
- # entries that can't be stripped"" for some obscure Apple-only
- # reason sometimes, related to their hacks to gcc---it depends on
- # how the file was compiled; since we don't /really/ care about
- # this we just let it silently fail)
-
- # Workarounds for a bug/feature in SCons such that it doesn't necessarily
- # run the source builders before the target builders (wtf scons??)
- Execute(Mkdir(contents))
- Execute(Mkdir(MacOS))
- Execute(Mkdir(frameworks))
- Execute(Mkdir(plugins))
-
- # XXX locals should be keyed by absolute path to the lib, not by reference;
- # that way it's easy to tell when a lib referenced in two different ways is
- # actually the same XXX rename locals => embeds
- # precache the list of names of libs we are using so we can figure out if a
- # lib is local or not (and therefore a ref to it needs to be updated)
-
- # XXX it seems kind of wrong to only look at the basename (even if, by the
- # nature of libraries, that must be enough) but there is no easy way to
- # compute the abspath
-
- locals = {}
- # [ref] => (absolute_path, embedded_path) (ref is the original reference
- # from looking at otool -L; we use this to decide if two libs are the same)
-
- # XXX it would be handy if embed_dependencies returned the otool list for
- # each ref it reads..
- binary_rpaths = otool.rpaths(str(binary))
- otool_local_paths = binary_rpaths + otool_local_paths
- for ref, path in otool.embed_dependencies(
- str(binary), LOCAL=otool_local_paths, SYSTEM=otool_system_paths
- ):
- locals[ref] = (path, embed_lib(path))
-
- # XXX bad name #list of tuples (source, embed) of plugins to stick under
- # the plugins/ dir
- plugins_l = []
- for p in env["PLUGINS"]: # build any necessary dirs for plugins (siiiigh)
- embedded_p = os.path.join(str(plugins), os.path.basename(str(p)))
- plugins_l.append((str(p), embedded_p))
-
- for subdir, p in env["QT_HACK"]:
- Execute(Mkdir(os.path.join(str(plugins), subdir)))
- embedded_p = os.path.join(
- str(plugins), subdir, os.path.basename(str(p))
- )
- plugins_l.append((p, embedded_p))
-
- print("Scanning plugins for new dependencies:")
- for p, ep in plugins_l:
- print("Scanning plugin", p)
- for ref, path in otool.embed_dependencies(
- p, LOCAL=otool_local_paths, SYSTEM=otool_system_paths
- ):
- if ref not in locals:
- locals[ref] = path, embed_lib(path)
- else:
- assert path == locals[ref][0], "Path '%s' is not '%s'" % (
- path,
- locals[ref][0],
- )
-
- # we really should have a libref-to-abspath function somewhere... right now
- # it's inline in embed_dependencies() better yet, make a Frameworks type
- # that you say Framework("QtCore") and then can use that as a dependency
- print("Installing main binary:")
- Execute(Copy(installed_bin, binary))
- # e.g. this SHOULD be an env.Install() call, but if scons decides to run
- # build_app before that env.Install then build_app fails and brings the
- # rest of the build with it, of course
- for ref in otool.dependencies(str(installed_bin)):
- if ref in locals:
- embedded = locals[ref][1]
- otool.change_ref(
- str(installed_bin), ref, relative(embedded)
- ) # change the reference to the library in the program binary
- if strip:
- system("strip '%s'" % installed_bin)
-
- print("Installing embedded libs:")
- for ref, (abs, embedded) in locals.items():
- real_abs = os.path.realpath(abs)
- print("installing", real_abs, "to", embedded)
- # NOTE(rryan): abs can be a symlink. we want to copy the binary it is
- # pointing to. os.path.realpath does this for us.
- Execute(Copy(embedded, real_abs))
- if not os.access(embedded, os.W_OK):
- print("Adding write permissions to %s" % embedded_p)
- mode = os.stat(embedded).st_mode
- os.chmod(embedded, mode | stat.S_IWUSR)
- patch_lib(embedded)
-
- print("Installing plugins:")
- for p, embedded_p in plugins_l:
- real_p = os.path.realpath(p)
- print("installing", real_p, "to", embedded_p)
- # NOTE(rryan): p can be a symlink. we want to copy the binary it is
- # pointing to. os.path.realpath does this for us.
- Execute(Copy(embedded_p, real_p)) # :/
- patch_lib(str(embedded_p))
-
-
-def emit_app(target, source, env):
- """
- The first source is the binary program file, the rest are files/folders to
- include in the App's Resources directory.
-
- extra variables available:
- ICON - the filename of the icon file to use, used in package metadata. If
- not specified defaults to 'application.icns' (which should be in your
- sources list, but if you spec a file not in there it'll actually add it for
- you)
- SIGNATURE - the bundle signature, a four byte code. If not specified uses
- the first four characters of the bundle name.
- PLUGINS - a list of files/folders to place in Contents/PlugIns (Adium uses
- Contents/PlugIns, Audacity uses plug-ins AND Contents/plug-ins..., Apple
- Mail uses Contents/PlugIns, so that's what we should stick with)
- IDENTIFIER - An identifier string that specifies the application type of
- the bundle in reverse DNS format.
- DISPLAY_NAME - The application name to be encoded in the Plist and menu
- bar.
- SHORT_VERSION - Specifies the release version number of the bundle, which
- identifies a released iteration of the application. The release version
- number is a string comprised of three period-separated integers
- COPYRIGHT - Human readable copyright (NSHumanReadableCopyright)
- CATEGORY - Your application's category.
- """
- # TODO: implement a FRAMEWORKS= arg, or maybe a Framework() builder so that
- # we can declare "this app depends on these frameworks"; then look in
- # env['FRAMEWORKS'] and env['LIBS'] and figure out the library dependencies
- # *ahead of time* so that we can get scons to copy them (and so that we
- # needn't redo their install_name's &c all the time)
-
- # bah, unless we decide to change the interface so you pass the app icon in
- # as a separate param, then we *have* to change Mixxx to work properly with
- # the Resources/ dir
-
- assert len(target) == 1
- bundle = target[0]
- # pull the binary off the front since it's a special case
- binary, resources = source[0], source[1:]
- try:
- icon = env["ICON"]
- except KeyError:
- icon = "application.icns"
-
- try:
- plugins = env["PLUGINS"]
- except KeyError:
- plugins = env["PLUGINS"] = []
-
- # so, this doesn't work realistically because if the passed in icon is a
- # remote path then shit clashes but still it might be useful.
- # XXX think this through.
- # if icon not in [str(ff) for ff in source]:
- # source.append(File(icon))
-
- bundle_type = "APPL"
-
- try:
- bundle_signature = env["SIGNATURE"]
- except KeyError:
- bundle_signature = str(bundle)[:4].lower()
- assert len(bundle_signature) == 4, "Bundle signature must be four bytes"
-
- # coerce the target to a Bundle
- # XXX huh, that's weird, it builds fine now... oh shit it's because it
- # caches types in its database
- # we don't need to tell it Bundle(), we just need to postpend the .app
- # it seems that if we tell Builder "suffix = '.app'" then it _at that
- # point_ assumes that $NAME.app is a file, which then causes "TypeError:
- # Tried to lookup File 'Mixxx.app' as a Dir.:"
- # so just work around that here
- if type(bundle) != Bundle:
- bundle = Bundle(str(bundle).replace("_bundle", "") + ".app")
-
- bundle_identifier = env["IDENTIFIER"]
- bundle_version = env["VERSION"]
- bundle_display_name = env["DISPLAY_NAME"]
- bundle_short_version_string = env["SHORT_VERSION"]
- human_readable_copyright = env["COPYRIGHT"]
- application_category_type = env["CATEGORY"]
- minimum_osx_version = env["MINIMUM_OSX_VERSION"]
-
- # BUG: if the icon file is changed but nothing else then the plist doesn't
- # get rebuilt (but since it's a str() and not a Node() there's no clean way
- # to hook this in)
- # Precache some the important paths
- # idea: hide these in the env[]?
- bundle = Dir(str(bundle)) # coerce the bundle target into being a Dir
- contents = Dir(os.path.join(str(bundle), "Contents"))
- # Following variable is unused
- # frameworks = Dir(
- # os.path.join(str(contents), "Frameworks")
- # ) # we put both frameworks and standard unix sharedlibs in here
-
- env["APP_RESOURCES"] = Dir(os.path.join(str(contents), "Resources"))
-
- # env['APP_INSTALLED_BIN'] = installed_bin
-
- # Generate the .plist and PkgInfo files
-
- # The contents of the PkgInfo file are the 4-byte package type followed by
- # the 4-byte signature of your application. Thus, for the TextEdit
- # application, whose type is 'APPL' and whose signature is 'ttxt', the file
- # would contain the ASCII string "APPLttxt".
- # So, we use the first four characters of the app
- env.Writer(
- File(os.path.join(str(contents), "PkgInfo")),
- [],
- DATA="%s%s" % (bundle_type, bundle_signature),
- )
-
- # Bug #1258435: executable name must match CFBundleExecutable otherwise
- # case-sensitive file systems break. Don't use binary.name.title() here.
- plist_data = {
- "CFBundleExecutable": binary.name,
- "CFBundleIconFile": icon,
- "CFBundlePackageType": bundle_type,
- "CFBundleSignature": bundle_signature,
- "CFBundleIdentifier": bundle_identifier,
- "CFBundleDisplayName": bundle_display_name,
- "CFBundleVersion": bundle_version,
- "CFBundleShortVersionString": bundle_short_version_string,
- "NSHumanReadableCopyright": human_readable_copyright,
- "NSPrincipalClass": "NSApplication",
- "NSHighResolutionCapable": "True",
- "LSApplicationCategoryType": application_category_type,
- "LSMinimumSystemVersion": minimum_osx_version,
- }
- if env["FOR_APP_STORE"]:
- plist_data["ForAppStore"] = "yes"
- env.Plist(os.path.join(str(contents), "Info"), PLIST=plist_data)
-
- # NB: only need CFBundleExecutale if the binary name differs from the
- # bundle name
- # todo:
- """Application Keys
-
- At a minimum, all applications should contain the following keys in their
- information property list file:
- CFBundleDisplayName
- CFBundleIdentifier
- CFBundleName
- CFBundlePackageType
- CFBundleShortVersionString
- CFBundleSignature
- CFBundleVersion
- LSHasLocalizedDisplayName
- NSHumanReadableCopyright
- NSAppleScriptEnabled"""
- # further: we should support generating document associations
-
- resource_map = env.get("APP_RESOURCES_MAP", {})
-
- for i in resources:
- path = resource_map.get(str(i), "")
- target = env["APP_RESOURCES"]
- if path != "":
- target = Dir(os.path.join(str(target), path))
- if isinstance(i, SCons.Node.FS.Dir):
- InstallDir(target, i, env)
- elif isinstance(i, SCons.Node.FS.File) or isinstance(i, str):
- env.Install(target, i)
-
- plugins = env["PLUGINS"]
-
- return bundle, source + plugins # +[installed_bin]
-
-
-App = Builder(action=build_app, emitter=emit_app)
-
-
-def codesign_path(identity, keychain, entitlements, path):
- print("Codesigning: ", path)
- command = "codesign -f -s '%s'%s%s %s" % (
- identity,
- " --keychain %s" % keychain if keychain else "",
- " --entitlements %s" % entitlements if entitlements else "",
- path,
- )
- if system(command) != 0:
- raise Exception("codesign failed: " + command)
-
-
-def do_codesign(target, source, env):
- # target[0] is a File object, coerce to string to get its path (usually
- # something like osxXX_build/Mixxx)
- bundle = str(target[0]).replace("_codesign", "")
-
- # HACK(XXX) SCons can't have a Dir which is a target so we append .app here
- # since our actual target (the thing we want to codesign) is the bundle
- # folder.
- if not bundle.endswith(".app"):
- bundle += ".app"
-
- binary_path = os.path.join(bundle, "Contents", "MacOS")
- frameworks_path = os.path.join(bundle, "Contents", "Frameworks")
- plugins_path = os.path.join(bundle, "Contents", "PlugIns")
-
- keychain = env.get("CODESIGN_KEYCHAIN", None)
- keychain_password = env.get("CODESIGN_KEYCHAIN_PASSWORD", None)
- # Following variable is unused
- # installer_identity = env.get("CODESIGN_INSTALLER_IDENTITY", None)
- application_identity = env.get("CODESIGN_APPLICATION_IDENTITY", None)
- entitlements = env.get("CODESIGN_ENTITLEMENTS", None)
- if application_identity is not None:
- if keychain and keychain_password is not None:
- print("Unlocking keychain:")
- if (
- system(
- "security unlock-keychain -p '%s' %s"
- % (keychain_password, keychain)
- )
- != 0
- ):
- raise Exception("Could not unlock keychain.")
-
- # Codesign the frameworks.
- for root, dirs, files in os.walk(frameworks_path):
- for framework in dirs + files:
- codesign_path(
- application_identity,
- keychain,
- entitlements,
- os.path.join(root, framework),
- )
- # Don't descend.
- del dirs[:]
-
- # Codesign plugins.
- for root, dirs, files in os.walk(plugins_path):
- for filename in files:
- codesign_path(
- application_identity,
- keychain,
- entitlements,
- os.path.join(root, filename),
- )
-
- # Codesign binaries.
- for root, dirs, files in os.walk(binary_path):
- for filename in files:
- codesign_path(
- application_identity,
- keychain,
- entitlements,
- os.path.join(root, filename),
- )
-
- # Codesign the bundle.
- codesign_path(application_identity, keychain, entitlements, bundle)
-
-
-CodeSign = Builder(action=do_codesign)
-
-
-def build_plist(target, source, env):
- d = env["PLIST"]
- assert len(target) == 1
- target = target[0]
-
- # XXX what happens if PLIST isn't passed in?
- # todo: make this support more than just <string>. but to do that means
- # more research and fuck that at this point
-
- # this is a bad way to do this, should really use an XML writer... but fuck
- # that
- outer_template = (
- '<?xml version="1.0" encoding="UTF-8"?>'
- '<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" '
- '"http://www.apple.com/DTDs/PropertyList-1.0.dtd">'
- '<plist version="1.0">'
- "<dict>%s</dict>"
- "</plist>"
- )
- inner_template = "<key>%s</key><string>%s</string>"
-
- inner = str.join("\n", [inner_template % (k, v) for k, v in d.items()])
- plist = outer_template % inner
-
- f = open(str(target), "w")
- f.write(plist)
- f.close()
-
-
-Plist = Builder(action=build_plist, emitter=no_sources, suffix="plist")
-
-# TODO: want to be able to say env.Append(FRAMEWORKS=['QtCore']) and have it
-# get translated properly... is there any way to do that here?
-
-
-def generate(env):
- env["BUILDERS"]["App"] = App
- env["BUILDERS"]["Dmg"] = Dmg
- env["BUILDERS"]["Plist"] = Plist
- env["BUILDERS"][
- "Writer"
- ] = Writer # this should be in a different module, really
- env["BUILDERS"]["CodeSign"] = CodeSign
-
-
-def exists(env):
- return os.platform == "darwin"
diff --git a/build/osx/README b/build/osx/README
deleted file mode 100644
index dd4ccb8b7c..0000000000
--- a/build/osx/README
+++ /dev/null
@@ -1 +0,0 @@
-This directory contains files needed to create the OS X package.
diff --git a/build/osx/crossosx.py b/build/osx/crossosx.py
deleted file mode 100644
index a89dfca8b0..0000000000
--- a/build/osx/crossosx.py
+++ /dev/null
@@ -1,142 +0,0 @@
-import os
-import os.path
-import string
-
-import SCons.Action
-import SCons.Builder
-import SCons.Tool
-import SCons.Util
-
-# This is what we search for to find mingw:
-prefixes = SCons.Util.Split("""
- i686-apple-darwin9-
- powerpc-apple-darwin9-
- x86_64-apple-darwin9-
-""")
-
-def find(env):
- for prefix in prefixes:
- # First search in the SCons path and then the OS path:
- if env.WhereIs(prefix + 'gcc') or SCons.Util.WhereIs(prefix + 'gcc'):
- return prefix
-
- return ''
-
-def shlib_generator(target, source, env, for_signature):
- cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS'])
-
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
- if dll: cmd.extend(['-o', dll])
-
- cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
-
- implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
- if implib: cmd.append('-Wl,--out-implib,'+implib.get_string(for_signature))
-
- def_target = env.FindIxes(target, 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX')
- if def_target: cmd.append('-Wl,--output-def,'+def_target.get_string(for_signature))
-
- return [cmd]
-
-def shlib_emitter(target, source, env):
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
- no_import_lib = env.get('no_import_lib', 0)
-
- if not dll:
- raise SCons.Errors.UserError, "A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX")
-
- if not no_import_lib and \
- not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
-
- # Append an import library to the list of targets.
- target.append(env.ReplaceIxes(dll,
- 'SHLIBPREFIX', 'SHLIBSUFFIX',
- 'LIBPREFIX', 'LIBSUFFIX'))
-
- # Append a def file target if there isn't already a def file target
- # or a def file source. There is no option to disable def file
- # target emitting, because I can't figure out why someone would ever
- # want to turn it off.
- def_source = env.FindIxes(source, 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX')
- def_target = env.FindIxes(target, 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX')
- if not def_source and not def_target:
- target.append(env.ReplaceIxes(dll,
- 'SHLIBPREFIX', 'SHLIBSUFFIX',
- 'WIN32DEFPREFIX', 'WIN32DEFSUFFIX'))
-
- return (target, source)
-
-# TODO: Backported to old scons version
-#shlib_action = SCons.Action.CommandGenerator(shlib_generator)
-shlib_action = SCons.Action.Action(shlib_generator,generator=1)
-
-res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
-
-res_builder = SCons.Builder.Builder(action=res_action, suffix='.res.o',
- source_scanner=SCons.Tool.SourceFileScanner)
-SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan)
-
-def generate(env):
- gcc_prefix = find(env)
-
- if gcc_prefix:
- dir = os.path.dirname(env.WhereIs(gcc_prefix + 'gcc') or SCons.Util.WhereIs(gcc_prefix + 'gcc'))
-
- # The mingw bin directory must be added to the path:
- path = env['ENV'].get('PATH', [])
- if not path:
- path = []
- if SCons.Util.is_String(path):
- path = string.split(path, os.pathsep)
-
- env['ENV']['PATH'] = string.join([dir] + path, os.pathsep)
-
- # Most of mingw is the same as gcc and friends...
- gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas']
- for tool in gnu_tools:
- SCons.Tool.Tool(tool)(env)
-
- #... but a few things differ:
- env['CC'] = gcc_prefix + 'gcc'
- env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
- env['CXX'] = gcc_prefix + 'g++'
- env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
- env['SHLINKCOM'] = shlib_action
- env.Append(SHLIBEMITTER = [shlib_emitter])
- # This line isn't required and breaks C++ linking
- #env['LINK'] = gcc_prefix + 'g++'
- env['AS'] = gcc_prefix + 'as'
- env['AR'] = gcc_prefix + 'ar'
- env['RANLIB'] = gcc_prefix + 'ranlib'
- env['WIN32DEFPREFIX'] = ''
- env['WIN32DEFSUFFIX'] = '.def'
- env['SHOBJSUFFIX'] = '.o'
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
-
- env['RC'] = gcc_prefix + 'windres'
- env['RCFLAGS'] = SCons.Util.CLVar('')
- env['RCINCFLAGS'] = '$( ${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs, TARGET)} $)'
- env['RCINCPREFIX'] = '--include-dir '
- env['RCINCSUFFIX'] = ''
- env['RCCOM'] = '$RC $RCINCFLAGS $RCINCPREFIX $SOURCE.dir $RCFLAGS -i $SOURCE -o $TARGET'
- #env['BUILDERS']['RES'] = res_builder
-
- # Some setting from the platform also have to be overridden:
- env['OBJPREFIX'] = ''
- env['OBJSUFFIX'] = '.o'
- env['LIBPREFIX'] = 'lib'
- env['LIBSUFFIX'] = '.a'
- env['SHOBJPREFIX'] = '$OBJPREFIX'
- env['SHOBJSUFFIX'] = '$OBJSUFFIX'
- env['PROGPREFIX'] = ''
- env['PROGSUFFIX'] = ''
- env['LIBPREFIX'] = 'lib'
- env['LIBSUFFIX'] = '.a'
- env['SHLIBPREFIX'] = 'lib'
- env['SHLIBSUFFIX'] = '.dylib'
- env['LIBPREFIXES'] = [ '$LIBPREFIX' ]
- env['LIBSUFFIXES'] = [ '$LIBSUFFIX' ]
-
-def exists(env):
- return find(env)
diff --git a/build/osx/entitlements.plist b/build/osx/entitlements.plist
deleted file mode 100644
index a30f1aa87e..0000000000
--- a/build/osx/entitlements.plist
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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>com.apple.security.app-sandbox</key>
- <true/>
- <key>com.apple.security.assets.music.read-write</key>
- <true/>
- <key>com.apple.security.files.downloads.read-write</key>
- <true/>
- <key>com.apple.security.device.firewire</key>
- <true/>
- <key>com.apple.security.device.microphone</key>
- <true/>
- <key>com.apple.security.device.usb</key>
- <true/>
- <key>com.apple.security.network.client</key>
- <true/>
- <key>com.apple.security.files.user-selected.read-write</key>
- <true/>
- <key>com.apple.security.files.bookmarks.app-scope</key>
- <true/>
- <key>com.apple.security.cs.allow-jit</key>
- <true/>
- <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
- <true/>
- </dict>
-</plist>
diff --git a/build/osx/golden_environment b/build/osx/golden_environment
deleted file mode 100644
index 4cefc5cced..0000000000
--- a/build/osx/golden_environment
+++ /dev/null
@@ -1 +0,0 @@
-2.3-j00004-497fe02e-osx10.11-x86_64-release
diff --git a/build/osx/install_environment.sh b/build/osx/install_environment.sh
deleted file mode 100755
index 65e7d6088b..0000000000
--- a/build