toolchain: create new Xcode template, based on cookie cutter tempting system.

This commit is contained in:
Mathieu Virbel 2015-02-14 13:05:54 +01:00
parent ddbfb912ef
commit 9cb199652f
47 changed files with 6446 additions and 547 deletions

View file

@ -13,7 +13,6 @@ from os import listdir, unlink, makedirs, environ, chdir
import zipfile import zipfile
import tarfile import tarfile
import importlib import importlib
import sh
import io import io
import json import json
import shutil import shutil
@ -23,6 +22,11 @@ try:
except ImportError: except ImportError:
from urllib import FancyURLopener from urllib import FancyURLopener
curdir = dirname(__file__)
sys.path.insert(0, join(curdir, "tools", "external"))
import sh
IS_PY3 = sys.version_info[0] >= 3 IS_PY3 = sys.version_info[0] >= 3
@ -840,7 +844,21 @@ Available commands:
def create(self): def create(self):
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Create a new xcode project") description="Create a new xcode project")
parser.add_argument("name", help="Name of your project")
parser.add_argument("directory", help="Directory where your project live")
args = parser.parse_args(sys.argv[2:]) args = parser.parse_args(sys.argv[2:])
from cookiecutter.main import cookiecutter
ctx = Context()
template_dir = join(curdir, "tools", "templates")
context = {
"title": args.name,
"project_name": args.name.lower(),
"domain_name": "org.kivy.{}".format(args.name.lower()),
"project_dir": realpath(args.directory),
"version": "1.0.0",
"dist_dir": ctx.dist_dir,
}
cookiecutter(template_dir, no_input=True, extra_context=context)
ToolchainCL() ToolchainCL()

View file

@ -1,57 +0,0 @@
#!/bin/bash
try () {
"$@" || exit -1
}
. $(dirname $0)/environment.sh
APPNAME=$1
SRCDIR=$2
APPID=$(echo $APPNAME | tr '[A-Z]' '[a-z]')
TEMPLATESDIR=$(dirname $0)/templates/
APPDIR=$KIVYIOSROOT/app-$APPID
OLD_LC_CTYPE=$LC_CTYPE
OLD_LANG=$LANG
# fix for -> sed: RE error: illegal byte sequence
LC_CTYPE=C
LANG=C
if [ "X$APPNAME" == "X" ]; then
echo $(basename $0) "<appname> <source directory>"
exit 1
fi
if [ "X$SRCDIR" == "X" ]; then
echo $(basename $0) "<appname> <source directory>"
exit 1
fi
echo "-> Create $APPDIR directory"
try mkdir $APPDIR
echo "-> Copy templates"
try cp $TEMPLATESDIR/main.m $APPDIR/main.m
try cp $TEMPLATESDIR/bridge.h $APPDIR/bridge.h
try cp $TEMPLATESDIR/bridge.m $APPDIR/bridge.m
try cp $TEMPLATESDIR/icon.png $APPDIR/icon.png
try cp $TEMPLATESDIR/template-Info.plist $APPDIR/$APPID-Info.plist
try cp -a $TEMPLATESDIR/template.xcodeproj $APPDIR/$APPID.xcodeproj
echo "-> Customize templates"
try find $APPDIR -type f -not -iname '*.png' -exec sed -i '' "s/##APPID##/$APPID/g" {} \;
try find $APPDIR -type f -not -iname '*.png' -exec sed -i '' "s/##APPNAME##/$APPNAME/g" {} \;
try find $APPDIR -type f -not -iname '*.png' -exec sed -i '' "s/##SDKVER##/$SDKVER/g" {} \;
try find $APPDIR -type f -not -iname '*.png' -exec sed -i '' "s^##SRCDIR##^$SRCDIR^g" {} \;
LC_CTYPE=$OLD_LC_CTYPE
LANG=$OLD_LANG
echo "-> Done !"
echo
echo "Your project is available at $APPDIR"
echo
echo "You can now type: open $APPDIR/$APPID.xcodeproj"
echo

0
tools/external/__init__.py vendored Normal file
View file

16
tools/external/cookiecutter/__init__.py vendored Executable file
View file

@ -0,0 +1,16 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter
------------
Main package for Cookiecutter.
"""
from .compat import OLD_PY2
__version__ = '0.9.0'
if OLD_PY2:
msg = 'Python 2.6 support was removed from cookiecutter in release 1.0.0.'
raise DeprecationWarning(msg)

70
tools/external/cookiecutter/cli.py vendored Executable file
View file

@ -0,0 +1,70 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter.cli
-----------------
Main `cookiecutter` CLI.
"""
from __future__ import unicode_literals
import os
import sys
import logging
import click
from cookiecutter import __version__
from cookiecutter.main import cookiecutter
logger = logging.getLogger(__name__)
def print_version(context, param, value):
if not value or context.resilient_parsing:
return
click.echo('Cookiecutter %s from %s (Python %s)' % (
__version__,
os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
sys.version[:3]
))
context.exit()
@click.command()
@click.argument('template')
@click.option(
'--no-input', is_flag=True,
help='Do not prompt for parameters and only use cookiecutter.json '
'file content',
)
@click.option(
'-c', '--checkout',
help='branch, tag or commit to checkout after git clone',
)
@click.option(
'-V', '--version',
is_flag=True, help='Show version information and exit.',
callback=print_version, expose_value=False, is_eager=True,
)
@click.option(
'-v', '--verbose',
is_flag=True, help='Print debug information', default=False
)
def main(template, no_input, checkout, verbose):
"""Create a project from a Cookiecutter project template (TEMPLATE)."""
if verbose:
logging.basicConfig(
format='%(levelname)s %(filename)s: %(message)s',
level=logging.DEBUG
)
else:
# Log info and above to console
logging.basicConfig(
format='%(levelname)s: %(message)s',
level=logging.INFO
)
cookiecutter(template, checkout, no_input)

140
tools/external/cookiecutter/compat.py vendored Normal file
View file

@ -0,0 +1,140 @@
import os
import sys
PY3 = sys.version_info[0] == 3
OLD_PY2 = sys.version_info[:2] < (2, 7)
if PY3: # pragma: no cover
input_str = 'builtins.input'
iteritems = lambda d: iter(d.items())
from unittest.mock import patch
from io import StringIO
def read_response(prompt=''):
"""
Prompt the user for a response.
Prints the given prompt (which should be a Unicode string),
and returns the text entered by the user as a Unicode string.
:param prompt: A Unicode string that is presented to the user.
"""
# The Python 3 input function does exactly what we want
return input(prompt)
else: # pragma: no cover
from __builtin__ import raw_input
input = raw_input
input_str = '__builtin__.raw_input'
iteritems = lambda d: d.iteritems()
from mock import patch
from cStringIO import StringIO
def read_response(prompt=''):
"""
Prompt the user for a response.
Prints the given prompt (which should be a Unicode string),
and returns the text entered by the user as a Unicode string.
:param prompt: A Unicode string that is presented to the user.
"""
# For Python 2, raw_input takes a byte string argument for the prompt.
# This must be encoded using the encoding used by sys.stdout.
# The result is a byte string encoding using sys.stdin.encoding.
# However, if the program is not being run interactively, sys.stdout
# and sys.stdin may not have encoding attributes.
# In that case we don't print a prompt (stdin/out isn't interactive,
# so prompting is pointless), and we assume the returned data is
# encoded using sys.getdefaultencoding(). This may not be right,
# but it's likely the best we can do.
# Isn't Python 2 encoding support wonderful? :-)
if sys.stdout.encoding:
prompt = prompt.encode(sys.stdout.encoding)
else:
prompt = ''
enc = sys.stdin.encoding or sys.getdefaultencoding()
return raw_input(prompt).decode(enc)
if PY3: # Forced testing
from shutil import which
else: # Forced testing
def is_exe(program):
"""
Returns whether or not a file is an executable.
"""
return os.path.isfile(program) and os.access(program, os.X_OK)
def which(cmd, mode=os.F_OK | os.X_OK, path=None):
"""Given a command, mode, and a PATH string, return the path which
conforms to the given mode on the PATH, or None if there is no such
file.
`mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
of os.environ.get("PATH"), or can be overridden with a custom search
path.
Note: This function was backported from the Python 3 source code.
"""
# Check that a given file can be accessed with the correct mode.
# Additionally check that `file` is not a directory, as on Windows
# directories pass the os.access check.
def _access_check(fn, mode):
return (os.path.exists(fn) and os.access(fn, mode)
and not os.path.isdir(fn))
# If we're given a path with a directory part, look it up directly
# rather than referring to PATH directories. This includes checking
# relative to the current directory, e.g. ./script
if os.path.dirname(cmd):
if _access_check(cmd, mode):
return cmd
return None
if path is None:
path = os.environ.get("PATH", os.defpath)
if not path:
return None
path = path.split(os.pathsep)
if sys.platform == "win32":
# The current directory takes precedence on Windows.
if os.curdir not in path:
path.insert(0, os.curdir)
# PATHEXT is necessary to check on Windows.
pathext = os.environ.get("PATHEXT", "").split(os.pathsep)
# See if the given file matches any of the expected path
# extensions. This will allow us to short circuit when given
# "python.exe". If it does match, only test that one, otherwise we
# have to try others.
if any(cmd.lower().endswith(ext.lower()) for ext in pathext):
files = [cmd]
else:
files = [cmd + ext for ext in pathext]
else:
# On other platforms you don't have things like PATHEXT to tell you
# what file suffixes are executable, so just pass on cmd as-is.
files = [cmd]
seen = set()
for dir in path:
normdir = os.path.normcase(dir)
if normdir not in seen:
seen.add(normdir)
for thefile in files:
name = os.path.join(dir, thefile)
if _access_check(name, mode):
return name
return None
def is_string(obj):
"""Determine if an object is a string."""
return isinstance(obj, str if PY3 else basestring)
_hush_pyflakes = (patch, StringIO, which)

64
tools/external/cookiecutter/config.py vendored Executable file
View file

@ -0,0 +1,64 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter.config
-------------------
Global configuration handling
"""
from __future__ import unicode_literals
import copy
import logging
import os
import io
import yaml
from .exceptions import ConfigDoesNotExistException
from .exceptions import InvalidConfiguration
logger = logging.getLogger(__name__)
DEFAULT_CONFIG = {
'cookiecutters_dir': os.path.expanduser('~/.cookiecutters/'),
'default_context': {}
}
def get_config(config_path):
"""
Retrieve the config from the specified path, returning it as a config dict.
"""
if not os.path.exists(config_path):
raise ConfigDoesNotExistException
logger.debug('config_path is {0}'.format(config_path))
with io.open(config_path, encoding='utf-8') as file_handle:
try:
yaml_dict = yaml.safe_load(file_handle)
except yaml.scanner.ScannerError:
raise InvalidConfiguration(
'{0} is no a valid YAML file'.format(config_path))
config_dict = copy.copy(DEFAULT_CONFIG)
config_dict.update(yaml_dict)
return config_dict
def get_user_config():
"""
Retrieve config from the user's ~/.cookiecutterrc, if it exists.
Otherwise, return None.
"""
# TODO: test on windows...
USER_CONFIG_PATH = os.path.expanduser('~/.cookiecutterrc')
if os.path.exists(USER_CONFIG_PATH):
return get_config(USER_CONFIG_PATH)
return copy.copy(DEFAULT_CONFIG)

64
tools/external/cookiecutter/exceptions.py vendored Executable file
View file

@ -0,0 +1,64 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter.exceptions
-----------------------
All exceptions used in the Cookiecutter code base are defined here.
"""
class CookiecutterException(Exception):
"""
Base exception class. All Cookiecutter-specific exceptions should subclass
this class.
"""
class NonTemplatedInputDirException(CookiecutterException):
"""
Raised when a project's input dir is not templated.
The name of the input directory should always contain a string that is
rendered to something else, so that input_dir != output_dir.
"""
class UnknownTemplateDirException(CookiecutterException):
"""
Raised when Cookiecutter cannot determine which directory is the project
template, e.g. more than one dir appears to be a template dir.
"""
class MissingProjectDir(CookiecutterException):
"""
Raised during cleanup when remove_repo() can't find a generated project
directory inside of a repo.
"""
class ConfigDoesNotExistException(CookiecutterException):
"""
Raised when get_config() is passed a path to a config file, but no file
is found at that path.
"""
class InvalidConfiguration(CookiecutterException):
"""
Raised if the global configuration file is not valid YAML or is
badly contructed.
"""
class UnknownRepoType(CookiecutterException):
"""
Raised if a repo's type cannot be determined.
"""
class VCSNotInstalled(CookiecutterException):
"""
Raised if the version control system (git or hg) is not installed.
"""

42
tools/external/cookiecutter/find.py vendored Executable file
View file

@ -0,0 +1,42 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter.find
-----------------
Functions for finding Cookiecutter templates and other components.
"""
import logging
import os
from .exceptions import NonTemplatedInputDirException
def find_template(repo_dir):
"""
Determines which child directory of `repo_dir` is the project template.
:param repo_dir: Local directory of newly cloned repo.
:returns project_template: Relative path to project template.
"""
logging.debug('Searching {0} for the project template.'.format(repo_dir))
repo_dir_contents = os.listdir(repo_dir)
project_template = None
for item in repo_dir_contents:
if 'cookiecutter' in item and '{{' in item and '}}' in item:
project_template = item
break
if project_template:
project_template = os.path.join(repo_dir, project_template)
logging.debug(
'The project template appears to be {0}'.format(project_template)
)
return project_template
else:
raise NonTemplatedInputDirException

198
tools/external/cookiecutter/generate.py vendored Executable file
View file

@ -0,0 +1,198 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter.generate
---------------------
Functions for generating a project from a project template.
"""
from __future__ import unicode_literals
from collections import OrderedDict
import io
import json
import logging
import os
import shutil
from jinja2 import FileSystemLoader, Template
from jinja2.environment import Environment
from jinja2.exceptions import TemplateSyntaxError
from binaryornot.check import is_binary
from .exceptions import NonTemplatedInputDirException
from .find import find_template
from .utils import make_sure_path_exists, work_in
from .hooks import run_hook
def generate_context(context_file='cookiecutter.json', default_context=None,
extra_context=None):
"""
Generates the context for a Cookiecutter project template.
Loads the JSON file as a Python object, with key being the JSON filename.
:param context_file: JSON file containing key/value pairs for populating
the cookiecutter's variables.
:param default_context: Dictionary containing config to take into account.
:param extra_context: Dictionary containing configuration overrides
"""
context = {}
file_handle = open(context_file)
obj = json.load(file_handle, object_pairs_hook=OrderedDict)
# Add the Python object to the context dictionary
file_name = os.path.split(context_file)[1]
file_stem = file_name.split('.')[0]
context[file_stem] = obj
# Overwrite context variable defaults with the default context from the
# user's global config, if available
if default_context:
obj.update(default_context)
if extra_context:
obj.update(extra_context)
logging.debug('Context generated is {0}'.format(context))
return context
def generate_file(project_dir, infile, context, env):
"""
1. Render the filename of infile as the name of outfile.
2. Deal with infile appropriately:
a. If infile is a binary file, copy it over without rendering.
b. If infile is a text file, render its contents and write the
rendered infile to outfile.
Precondition:
When calling `generate_file()`, the root template dir must be the
current working directory. Using `utils.work_in()` is the recommended
way to perform this directory change.
:param project_dir: Absolute path to the resulting generated project.
:param infile: Input file to generate the file from. Relative to the root
template dir.
:param context: Dict for populating the cookiecutter's variables.
:param env: Jinja2 template execution environment.
"""
logging.debug('Generating file {0}'.format(infile))
# Render the path to the output file (not including the root project dir)
outfile_tmpl = Template(infile)
outfile = os.path.join(project_dir, outfile_tmpl.render(**context))
logging.debug('outfile is {0}'.format(outfile))
# Just copy over binary files. Don't render.
logging.debug("Check {0} to see if it's a binary".format(infile))
if is_binary(infile):
logging.debug('Copying binary {0} to {1} without rendering'
.format(infile, outfile))
shutil.copyfile(infile, outfile)
else:
# Force fwd slashes on Windows for get_template
# This is a by-design Jinja issue
infile_fwd_slashes = infile.replace(os.path.sep, '/')
# Render the file
try:
tmpl = env.get_template(infile_fwd_slashes)
except TemplateSyntaxError as exception:
# Disable translated so that printed exception contains verbose
# information about syntax error location
exception.translated = False
raise
rendered_file = tmpl.render(**context)
logging.debug('Writing {0}'.format(outfile))
with io.open(outfile, 'w', encoding='utf-8') as fh:
fh.write(rendered_file)
# Apply file permissions to output file
shutil.copymode(infile, outfile)
def render_and_create_dir(dirname, context, output_dir):
"""
Renders the name of a directory, creates the directory, and
returns its path.
"""
name_tmpl = Template(dirname)
rendered_dirname = name_tmpl.render(**context)
logging.debug('Rendered dir {0} must exist in output_dir {1}'.format(
rendered_dirname,
output_dir
))
dir_to_create = os.path.normpath(
os.path.join(output_dir, rendered_dirname)
)
make_sure_path_exists(dir_to_create)
return dir_to_create
def ensure_dir_is_templated(dirname):
"""
Ensures that dirname is a templated directory name.
"""
if '{{' in dirname and '}}' in dirname:
return True
else:
raise NonTemplatedInputDirException
def generate_files(repo_dir, context=None, output_dir='.'):
"""
Renders the templates and saves them to files.
:param repo_dir: Project template input directory.
:param context: Dict for populating the template's variables.
:param output_dir: Where to output the generated project dir into.
"""
template_dir = find_template(repo_dir)
logging.debug('Generating project from {0}...'.format(template_dir))
context = context or {}
unrendered_dir = os.path.split(template_dir)[1]
ensure_dir_is_templated(unrendered_dir)
project_dir = render_and_create_dir(unrendered_dir, context, output_dir)
# We want the Jinja path and the OS paths to match. Consequently, we'll:
# + CD to the template folder
# + Set Jinja's path to '.'
#
# In order to build our files to the correct folder(s), we'll use an
# absolute path for the target folder (project_dir)
project_dir = os.path.abspath(project_dir)
logging.debug('project_dir is {0}'.format(project_dir))
# run pre-gen hook from repo_dir
with work_in(repo_dir):
run_hook('pre_gen_project', project_dir, context)
with work_in(template_dir):
env = Environment(keep_trailing_newline=True)
env.loader = FileSystemLoader('.')
for root, dirs, files in os.walk('.'):
for d in dirs:
unrendered_dir = os.path.join(project_dir,
os.path.join(root, d))
render_and_create_dir(unrendered_dir, context, output_dir)
for f in files:
infile = os.path.join(root, f)
logging.debug('f is {0}'.format(f))
generate_file(project_dir, infile, context, env)
# run post-gen hook from repo_dir
with work_in(repo_dir):
run_hook('post_gen_project', project_dir, context)

107
tools/external/cookiecutter/hooks.py vendored Executable file
View file

@ -0,0 +1,107 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter.hooks
------------------
Functions for discovering and executing various cookiecutter hooks.
"""
import io
import logging
import os
import subprocess
import sys
import tempfile
from jinja2 import Template
from cookiecutter import utils
_HOOKS = [
'pre_gen_project',
'post_gen_project',
# TODO: other hooks should be listed here
]
def find_hooks():
"""
Must be called with the project template as the current working directory.
Returns a dict of all hook scripts provided.
Dict's key will be the hook/script's name, without extension, while
values will be the absolute path to the script.
Missing scripts will not be included in the returned dict.
"""
hooks_dir = 'hooks'
r = {}
logging.debug('hooks_dir is {0}'.format(hooks_dir))
if not os.path.isdir(hooks_dir):
logging.debug('No hooks/ dir in template_dir')
return r
for f in os.listdir(hooks_dir):
basename = os.path.splitext(os.path.basename(f))[0]
if basename in _HOOKS:
r[basename] = os.path.abspath(os.path.join(hooks_dir, f))
return r
def run_script(script_path, cwd='.'):
"""
Executes a script from a working directory.
:param script_path: Absolute path to the script to run.
:param cwd: The directory to run the script from.
"""
run_thru_shell = sys.platform.startswith('win')
if script_path.endswith('.py'):
script_command = [sys.executable, script_path]
else:
script_command = [script_path]
utils.make_executable(script_path)
proc = subprocess.Popen(
script_command,
shell=run_thru_shell,
cwd=cwd
)
proc.wait()
def run_script_with_context(script_path, cwd, context):
"""
Executes a script after rendering with it Jinja.
:param script_path: Absolute path to the script to run.
:param cwd: The directory to run the script from.
:param context: Cookiecutter project template context.
"""
_, extension = os.path.splitext(script_path)
contents = io.open(script_path, 'r', encoding='utf-8').read()
with tempfile.NamedTemporaryFile(
delete=False,
mode='w',
suffix=extension
) as temp:
temp.write(Template(contents).render(**context))
run_script(temp.name, cwd)
def run_hook(hook_name, project_dir, context):
"""
Try to find and execute a hook from the specified project directory.
:param hook_name: The hook to execute.
:param project_dir: The directory to execute the script from.
:param context: Cookiecutter project context.
"""
script = find_hooks().get(hook_name)
if script is None:
logging.debug('No hooks found')
return
return run_script_with_context(script, project_dir, context)

103
tools/external/cookiecutter/main.py vendored Executable file
View file

@ -0,0 +1,103 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter.main
-----------------
Main entry point for the `cookiecutter` command.
The code in this module is also a good example of how to use Cookiecutter as a
library rather than a script.
"""
from __future__ import unicode_literals
import logging
import os
from .config import get_user_config
from .prompt import prompt_for_config
from .generate import generate_context, generate_files
from .vcs import clone
logger = logging.getLogger(__name__)
builtin_abbreviations = {
'gh': 'https://github.com/{0}.git',
'bb': 'https://bitbucket.org/{0}',
}
def expand_abbreviations(template, config_dict):
"""
Expand abbreviations in a template name.
:param template: The project template name.
:param config_dict: The user config, which will contain abbreviation
definitions.
"""
abbreviations = builtin_abbreviations.copy()
abbreviations.update(config_dict.get('abbreviations', {}))
if template in abbreviations:
return abbreviations[template]
# Split on colon. If there is no colon, rest will be empty
# and prefix will be the whole template
prefix, sep, rest = template.partition(':')
if prefix in abbreviations:
return abbreviations[prefix].format(rest)
return template
def cookiecutter(template, checkout=None, no_input=False, extra_context=None):
"""
API equivalent to using Cookiecutter at the command line.
:param template: A directory containing a project template directory,
or a URL to a git repository.
:param checkout: The branch, tag or commit ID to checkout after clone.
:param no_input: Prompt the user at command line for manual configuration?
:param extra_context: A dictionary of context that overrides default
and user configuration.
"""
# Get user config from ~/.cookiecutterrc or equivalent
# If no config file, sensible defaults from config.DEFAULT_CONFIG are used
config_dict = get_user_config()
template = expand_abbreviations(template, config_dict)
# TODO: find a better way to tell if it's a repo URL
if 'git@' in template or 'https://' in template:
repo_dir = clone(
repo_url=template,
checkout=checkout,
clone_to_dir=config_dict['cookiecutters_dir'],
no_input=no_input
)
else:
# If it's a local repo, no need to clone or copy to your
# cookiecutters_dir
repo_dir = template
context_file = os.path.join(repo_dir, 'cookiecutter.json')
logging.debug('context_file is {0}'.format(context_file))
context = generate_context(
context_file=context_file,
default_context=config_dict['default_context'],
extra_context=extra_context,
)
# prompt the user to manually configure at the command line.
# except when 'no-input' flag is set
context['cookiecutter'] = prompt_for_config(context, no_input)
# Create project from local context and project template.
generate_files(
repo_dir=repo_dir,
context=context
)

80
tools/external/cookiecutter/prompt.py vendored Executable file
View file

@ -0,0 +1,80 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter.prompt
---------------------
Functions for prompting the user for project info.
"""
from __future__ import unicode_literals
import sys
from .compat import iteritems, read_response, is_string
from jinja2.environment import Environment
def prompt_for_config(context, no_input=False):
"""
Prompts the user to enter new config, using context as a source for the
field names and sample values.
:param no_input: Prompt the user at command line for manual configuration?
"""
cookiecutter_dict = {}
env = Environment()
for key, raw in iteritems(context['cookiecutter']):
raw = raw if is_string(raw) else str(raw)
val = env.from_string(raw).render(cookiecutter=cookiecutter_dict)
if not no_input:
prompt = '{0} (default is "{1}")? '.format(key, val)
new_val = read_response(prompt).strip()
if new_val != '':
val = new_val
cookiecutter_dict[key] = val
return cookiecutter_dict
def query_yes_no(question, default='yes'):
"""
Ask a yes/no question via `read_response()` and return their answer.
:param question: A string that is presented to the user.
:param default: The presumed answer if the user just hits <Enter>.
It must be "yes" (the default), "no" or None (meaning
an answer is required of the user).
The "answer" return value is one of "yes" or "no".
Adapted from
http://stackoverflow.com/questions/3041986/python-command-line-yes-no-input
http://code.activestate.com/recipes/577058/
"""
valid = {'yes': True, 'y': True, 'ye': True, 'no': False, 'n': False}
if default is None:
prompt = ' [y/n] '
elif default == 'yes':
prompt = ' [Y/n] '
elif default == 'no':
prompt = ' [y/N] '
else:
raise ValueError('Invalid default answer: "{0}"'.format(default))
while True:
sys.stdout.write(question + prompt)
choice = read_response().lower()
if default is not None and choice == '':
return valid[default]
elif choice in valid:
return valid[choice]
else:
sys.stdout.write('Please respond with "yes" or "no" '
'(or "y" or "n").\n')

79
tools/external/cookiecutter/utils.py vendored Executable file
View file

@ -0,0 +1,79 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter.utils
------------------
Helper functions used throughout Cookiecutter.
"""
from __future__ import unicode_literals
import contextlib
import errno
import logging
import os
import stat
import shutil
def force_delete(func, path, exc_info):
"""
Error handler for `shutil.rmtree()` equivalent to `rm -rf`
Usage: `shutil.rmtree(path, onerror=force_delete)`
From stackoverflow.com/questions/1889597
"""
os.chmod(path, stat.S_IWRITE)
func(path)
def rmtree(path):
"""
Removes a directory and all its contents. Like rm -rf on Unix.
:param path: A directory path.
"""
shutil.rmtree(path, onerror=force_delete)
def make_sure_path_exists(path):
"""
Ensures that a directory exists.
:param path: A directory path.
"""
logging.debug('Making sure path exists: {0}'.format(path))
try:
os.makedirs(path)
except OSError as exception:
if exception.errno != errno.EEXIST:
return False
return True
@contextlib.contextmanager
def work_in(dirname=None):
"""
Context manager version of os.chdir. When exited, returns to the working
directory prior to entering.
"""
curdir = os.getcwd()
try:
if dirname is not None:
os.chdir(dirname)
yield
finally:
os.chdir(curdir)
def make_executable(script_path):
"""
Makes `script_path` executable
:param script_path: The file to change
"""
status = os.stat(script_path)
os.chmod(script_path, status.st_mode | stat.S_IEXEC)

113
tools/external/cookiecutter/vcs.py vendored Executable file
View file

@ -0,0 +1,113 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
cookiecutter.vcs
----------------
Helper functions for working with version control systems.
"""
from __future__ import unicode_literals
import logging
import os
import subprocess
import sys
from .compat import which
from .exceptions import UnknownRepoType, VCSNotInstalled
from .prompt import query_yes_no
from .utils import make_sure_path_exists, rmtree
def prompt_and_delete_repo(repo_dir, no_input=False):
"""
Asks the user whether it's okay to delete the previously-cloned repo.
If yes, deletes it. Otherwise, Cookiecutter exits.
:param repo_dir: Directory of previously-cloned repo.
:param no_input: Suppress prompt to delete repo and just delete it.
"""
# Suppress prompt if called via API
if no_input:
ok_to_delete = True
else:
ok_to_delete = query_yes_no(
"You've cloned {0} before. "
'Is it okay to delete and re-clone it?'.format(repo_dir),
default='yes'
)
if ok_to_delete:
rmtree(repo_dir)
else:
sys.exit()
def identify_repo(repo_url):
"""
Determines if `repo_url` should be treated as a URL to a git or hg repo.
:param repo_url: Repo URL of unknown type.
:returns: "git", "hg", or None.
"""
if 'git' in repo_url:
return 'git'
elif 'bitbucket' in repo_url:
return 'hg'
else:
raise UnknownRepoType
def is_vcs_installed(repo_type):
"""
Check if the version control system for a repo type is installed.
:param repo_type:
"""
return bool(which(repo_type))
def clone(repo_url, checkout=None, clone_to_dir=".", no_input=False):
"""
Clone a repo to the current directory.
:param repo_url: Repo URL of unknown type.
:param checkout: The branch, tag or commit ID to checkout after clone.
:param clone_to_dir: The directory to clone to.
Defaults to the current directory.
:param no_input: Suppress all user prompts when calling via API.
"""
# Ensure that clone_to_dir exists
clone_to_dir = os.path.expanduser(clone_to_dir)
make_sure_path_exists(clone_to_dir)
# identify the repo_type
repo_type = identify_repo(repo_url)
# check that the appropriate VCS for the repo_type is installed
if not is_vcs_installed(repo_type):
msg = "'{0}' is not installed.".format(repo_type)
raise VCSNotInstalled(msg)
tail = os.path.split(repo_url)[1]
if repo_type == 'git':
repo_dir = os.path.normpath(os.path.join(clone_to_dir,
tail.rsplit('.git')[0]))
elif repo_type == 'hg':
repo_dir = os.path.normpath(os.path.join(clone_to_dir, tail))
logging.debug('repo_dir is {0}'.format(repo_dir))
if os.path.isdir(repo_dir):
prompt_and_delete_repo(repo_dir, no_input=no_input)
if repo_type in ['git', 'hg']:
subprocess.check_call([repo_type, 'clone', repo_url], cwd=clone_to_dir)
if checkout is not None:
subprocess.check_call([repo_type, 'checkout', checkout],
cwd=repo_dir)
return repo_dir

2386
tools/external/mock.py vendored Normal file

File diff suppressed because it is too large Load diff

2352
tools/external/sh.py vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,38 +0,0 @@
#!/bin/bash
try () {
"$@" || exit -1
}
. $(dirname $0)/environment.sh
APPNAME=$1
APPID=$(echo $APPNAME | tr '[A-Z]' '[a-z]')
APPDIR=$KIVYIOSROOT/app-$APPID
SRCDIR=$2
set -x
if [ "X$APPNAME" == "X" ]; then
echo $(basename $0) "<appname> <source directory>"
exit 1
fi
if [ "X$SRCDIR" == "X" ]; then
echo $(basename $0) "<appname> <source directory>"
exit 1
fi
echo "-> Copy $SRCDIR to $APPDIR/YourApp"
YOURAPPDIR=$APPDIR/YourApp
echo "-> Synchronize source code"
try rsync -av --delete $SRCDIR/ $YOURAPPDIR
echo "-> Compile to pyo"
$HOSTPYTHON -OO -m compileall $YOURAPPDIR
echo "-> Remove unused files (pyc, py)"
find $YOURAPPDIR -iname '*.py' -exec rm {} \;
find $YOURAPPDIR -iname '*.pyc' -exec rm {} \;
echo "-> Source code of $APPNAME updated."

View file

@ -0,0 +1 @@
{}

View file

@ -1,423 +0,0 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
010731C2137F20B800A8D3A0 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 010731C1137F20B800A8D3A0 /* AudioToolbox.framework */; };
010731C4137F20C300A8D3A0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 010731C3137F20C300A8D3A0 /* QuartzCore.framework */; };
01532DAA137C099F0076F6BF /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 01532DA9137C099F0076F6BF /* icon.png */; };
01790B81137E5ED900E037D1 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 01790B7A137E5ED900E037D1 /* OpenGLES.framework */; };
1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; };
2C18EF8C17CBD2900041C0E1 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C18EF8A17CBD2900041C0E1 /* libffi.a */; };
2C18EF8D17CBD2900041C0E1 /* libpyobjus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C18EF8B17CBD2900041C0E1 /* libpyobjus.a */; };
2CB5F34417D51580006187AB /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CB5F34317D51580006187AB /* CoreMotion.framework */; };
2CB5F34717D5233A006187AB /* bridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CB5F34617D5233A006187AB /* bridge.m */; };
596C7514150CFC75003F57D9 /* include in Resources */ = {isa = PBXBuildFile; fileRef = 596C7513150CFC75003F57D9 /* include */; };
5983EC97163CB90D00475EFB /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5983EC96163CB90D00475EFB /* libsqlite3.dylib */; };
598E034D14F80187000D1362 /* libSDL_mixer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 598E034C14F80187000D1362 /* libSDL_mixer.a */; };
598E035414F80578000D1362 /* libogg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 598E035314F80578000D1362 /* libogg.a */; };
598E035A14F8177A000D1362 /* libvorbisidec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 598E035914F8177A000D1362 /* libvorbisidec.a */; };
59994D8D148D48E300863906 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994D8C148D48E300863906 /* ImageIO.framework */; };
59994D90148D686900863906 /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994D8F148D686900863906 /* libbz2.dylib */; };
59994D9E148E353000863906 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994D9D148E352F00863906 /* libz.dylib */; };
59994DAD148E558600863906 /* libfreetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994DA8148E558600863906 /* libfreetype.a */; };
59994DAE148E558600863906 /* libkivy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994DA9148E558600863906 /* libkivy.a */; };
59994DAF148E558600863906 /* libpython2.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994DAA148E558600863906 /* libpython2.7.a */; };
59994DB0148E558600863906 /* libSDL_ttf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994DAB148E558600863906 /* libSDL_ttf.a */; };
59994DB1148E558600863906 /* libSDL2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994DAC148E558600863906 /* libSDL2.a */; };
59994DB3148E564400863906 /* lib in Resources */ = {isa = PBXBuildFile; fileRef = 59994DB2148E564400863906 /* lib */; };
59994E3B148E85C800863906 /* YourApp in Resources */ = {isa = PBXBuildFile; fileRef = 59994E3A148E85C800863906 /* YourApp */; };
59ED7D08150E0C4400A92BEE /* libios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 59ED7D07150E0C4400A92BEE /* libios.a */; };
59ED7D0B150E325100A92BEE /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59ED7D0A150E325100A92BEE /* MessageUI.framework */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
010731C1137F20B800A8D3A0 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
010731C3137F20C300A8D3A0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
01532DA9137C099F0076F6BF /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = "<group>"; };
01790B7A137E5ED900E037D1 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
1D6058910D05DD3D006BFB54 /* ##APPNAME##.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ##APPNAME##.app; sourceTree = BUILT_PRODUCTS_DIR; };
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
2C18EF8A17CBD2900041C0E1 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libffi.a; path = ../build/lib/libffi.a; sourceTree = "<group>"; };
2C18EF8B17CBD2900041C0E1 /* libpyobjus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpyobjus.a; path = ../build/lib/libpyobjus.a; sourceTree = "<group>"; };
2CB5F34317D51580006187AB /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };
2CB5F34517D5233A006187AB /* bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bridge.h; sourceTree = SOURCE_ROOT; };
2CB5F34617D5233A006187AB /* bridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = bridge.m; sourceTree = SOURCE_ROOT; };
596C7513150CFC75003F57D9 /* include */ = {isa = PBXFileReference; lastKnownFileType = folder; name = include; path = ../build/python/embed/include; sourceTree = "<group>"; };
5983EC96163CB90D00475EFB /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
598E034C14F80187000D1362 /* libSDL_mixer.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSDL_mixer.a; path = ../build/lib/libSDL_mixer.a; sourceTree = "<group>"; };
598E035314F80578000D1362 /* libogg.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libogg.a; path = ../build/lib/libogg.a; sourceTree = "<group>"; };
598E035914F8177A000D1362 /* libvorbisidec.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvorbisidec.a; path = ../build/lib/libvorbisidec.a; sourceTree = "<group>"; };
59994D8C148D48E300863906 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; };
59994D8F148D686900863906 /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = usr/lib/libbz2.dylib; sourceTree = SDKROOT; };
59994D9D148E352F00863906 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
59994DA8148E558600863906 /* libfreetype.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfreetype.a; path = ../build/lib/libfreetype.a; sourceTree = "<group>"; };
59994DA9148E558600863906 /* libkivy.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libkivy.a; path = ../build/lib/libkivy.a; sourceTree = "<group>"; };
59994DAA148E558600863906 /* libpython2.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpython2.7.a; path = ../build/lib/libpython2.7.a; sourceTree = "<group>"; };
59994DAB148E558600863906 /* libSDL_ttf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSDL_ttf.a; path = ../build/lib/libSDL_ttf.a; sourceTree = "<group>"; };
59994DAC148E558600863906 /* libSDL2.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSDL2.a; path = ../build/lib/libSDL2.a; sourceTree = "<group>"; };
59994DB2148E564400863906 /* lib */ = {isa = PBXFileReference; lastKnownFileType = folder; name = lib; path = ../build/python/lib; sourceTree = SOURCE_ROOT; };
59994E3A148E85C800863906 /* YourApp */ = {isa = PBXFileReference; lastKnownFileType = folder; path = YourApp; sourceTree = "<group>"; };
59ED7D07150E0C4400A92BEE /* libios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libios.a; path = ../build/lib/libios.a; sourceTree = "<group>"; };
59ED7D0A150E325100A92BEE /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };
8D1107310486CEB800E47090 /* ##APPID##-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "##APPID##-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2CB5F34417D51580006187AB /* CoreMotion.framework in Frameworks */,
2C18EF8C17CBD2900041C0E1 /* libffi.a in Frameworks */,
2C18EF8D17CBD2900041C0E1 /* libpyobjus.a in Frameworks */,
5983EC97163CB90D00475EFB /* libsqlite3.dylib in Frameworks */,
59ED7D0B150E325100A92BEE /* MessageUI.framework in Frameworks */,
59ED7D08150E0C4400A92BEE /* libios.a in Frameworks */,
598E035A14F8177A000D1362 /* libvorbisidec.a in Frameworks */,
598E035414F80578000D1362 /* libogg.a in Frameworks */,
598E034D14F80187000D1362 /* libSDL_mixer.a in Frameworks */,
59994DAD148E558600863906 /* libfreetype.a in Frameworks */,
59994DAE148E558600863906 /* libkivy.a in Frameworks */,
59994DAF148E558600863906 /* libpython2.7.a in Frameworks */,
59994DB0148E558600863906 /* libSDL_ttf.a in Frameworks */,
59994DB1148E558600863906 /* libSDL2.a in Frameworks */,
59994D90148D686900863906 /* libbz2.dylib in Frameworks */,
59994D9E148E353000863906 /* libz.dylib in Frameworks */,
59994D8D148D48E300863906 /* ImageIO.framework in Frameworks */,
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */,
01790B81137E5ED900E037D1 /* OpenGLES.framework in Frameworks */,
010731C2137F20B800A8D3A0 /* AudioToolbox.framework in Frameworks */,
010731C4137F20C300A8D3A0 /* QuartzCore.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
080E96DDFE201D6D7F000001 /* Classes */ = {
isa = PBXGroup;
children = (
2CB5F34517D5233A006187AB /* bridge.h */,
2CB5F34617D5233A006187AB /* bridge.m */,
);
path = Classes;
sourceTree = "<group>";
};
19C28FACFE9D520D11CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
1D6058910D05DD3D006BFB54 /* ##APPNAME##.app */,
);
name = Products;
sourceTree = "<group>";
};
29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
isa = PBXGroup;
children = (
080E96DDFE201D6D7F000001 /* Classes */,
29B97315FDCFA39411CA2CEA /* Other Sources */,
29B97317FDCFA39411CA2CEA /* Resources */,
29B97323FDCFA39411CA2CEA /* Frameworks */,
19C28FACFE9D520D11CA2CBB /* Products */,
);
name = CustomTemplate;
sourceTree = "<group>";
};
29B97315FDCFA39411CA2CEA /* Other Sources */ = {
isa = PBXGroup;
children = (
596C7513150CFC75003F57D9 /* include */,
29B97316FDCFA39411CA2CEA /* main.m */,
);
name = "Other Sources";
sourceTree = "<group>";
};
29B97317FDCFA39411CA2CEA /* Resources */ = {
isa = PBXGroup;
children = (
59994DB2148E564400863906 /* lib */,
59994E3A148E85C800863906 /* YourApp */,
01532DA9137C099F0076F6BF /* icon.png */,
8D1107310486CEB800E47090 /* ##APPID##-Info.plist */,
);
name = Resources;
sourceTree = "<group>";
};
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
isa = PBXGroup;
children = (
2CB5F34317D51580006187AB /* CoreMotion.framework */,
2C18EF8A17CBD2900041C0E1 /* libffi.a */,
2C18EF8B17CBD2900041C0E1 /* libpyobjus.a */,
5983EC96163CB90D00475EFB /* libsqlite3.dylib */,
59994DA8148E558600863906 /* libfreetype.a */,
59994DA9148E558600863906 /* libkivy.a */,
59994DAA148E558600863906 /* libpython2.7.a */,
59994DAB148E558600863906 /* libSDL_ttf.a */,
598E035914F8177A000D1362 /* libvorbisidec.a */,
598E035314F80578000D1362 /* libogg.a */,
598E034C14F80187000D1362 /* libSDL_mixer.a */,
59994DAC148E558600863906 /* libSDL2.a */,
59ED7D07150E0C4400A92BEE /* libios.a */,
59994D9D148E352F00863906 /* libz.dylib */,
59994D8F148D686900863906 /* libbz2.dylib */,
59994D8C148D48E300863906 /* ImageIO.framework */,
59ED7D0A150E325100A92BEE /* MessageUI.framework */,
010731C1137F20B800A8D3A0 /* AudioToolbox.framework */,
010731C3137F20C300A8D3A0 /* QuartzCore.framework */,
01790B7A137E5ED900E037D1 /* OpenGLES.framework */,
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
1D30AB110D05D00D00671497 /* Foundation.framework */,
288765FC0DF74451002DB57D /* CoreGraphics.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
1D6058900D05DD3D006BFB54 /* ##APPNAME## */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "##APPID##" */;
buildPhases = (
113D17E2153E3DB5001310A5 /* ShellScript */,
1D60588D0D05DD3D006BFB54 /* Resources */,
1D60588E0D05DD3D006BFB54 /* Sources */,
1D60588F0D05DD3D006BFB54 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = ##APPID##;
productName = ##APPID##;
productReference = 1D6058910D05DD3D006BFB54 /* ##APPNAME##.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0420;
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "##APPID##" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,
Japanese,
French,
German,
);
mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
projectDirPath = "";
projectRoot = "";
targets = (
1D6058900D05DD3D006BFB54 /* ##APPID## */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
1D60588D0D05DD3D006BFB54 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
01532DAA137C099F0076F6BF /* icon.png in Resources */,
59994DB3148E564400863906 /* lib in Resources */,
59994E3B148E85C800863906 /* YourApp in Resources */,
596C7514150CFC75003F57D9 /* include in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
113D17E2153E3DB5001310A5 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 12;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/bash;
shellScript = "../tools/populate-project.sh ##APPNAME## ##SRCDIR## ";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
1D60588E0D05DD3D006BFB54 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1D60589B0D05DD56006BFB54 /* main.m in Sources */,
2CB5F34717D5233A006187AB /* bridge.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
1D6058940D05DD3E006BFB54 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "";
GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = (
"\"$(PROJECT_DIR)/../build/include\"",
"\"$(PROJECT_DIR)/../build/python/include\"",
);
INFOPLIST_FILE = "##APPID##-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = ##SDKVER##;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(PROJECT_DIR)/../build/lib\"",
);
ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = "-all_load";
PRODUCT_NAME = ##APPNAME##;
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
SDKROOT = iphoneos;
STRIP_INSTALLED_PRODUCT = NO;
USER_HEADER_SEARCH_PATHS = "";
};
name = Debug;
};
1D6058950D05DD3E006BFB54 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "";
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = (
"\"$(PROJECT_DIR)/../build/include\"",
"\"$(PROJECT_DIR)/../build/python/include\"",
);
INFOPLIST_FILE = "##APPID##-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = ##SDKVER##;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(PROJECT_DIR)/../build/lib\"",
);
OTHER_LDFLAGS = "-all_load";
PRODUCT_NAME = ##APPNAME##;
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
SDKROOT = iphoneos;
SKIP_INSTALL = NO;
STRIP_INSTALLED_PRODUCT = NO;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
C01FCF4F08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
DEAD_CODE_STRIPPING = NO;
GCC_C_LANGUAGE_STANDARD = c99;
GCC_VERSION = com.apple.compilers.llvmgcc42;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "";
IPHONEOS_DEPLOYMENT_TARGET = ##SDKVER##;
ONLY_ACTIVE_ARCH = YES;
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
SDKROOT = iphoneos;
STRIP_INSTALLED_PRODUCT = YES;
STRIP_STYLE = all;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = 2;
VALID_ARCHS = armv7;
};
name = Debug;
};
C01FCF5008A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
DEAD_CODE_STRIPPING = NO;
GCC_C_LANGUAGE_STANDARD = c99;
GCC_VERSION = com.apple.compilers.llvmgcc42;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = ##SDKVER##;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
SDKROOT = iphoneos;
STRIP_INSTALLED_PRODUCT = YES;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = 2;
USER_HEADER_SEARCH_PATHS = "";
VALID_ARCHS = armv7;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "##APPID##" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1D6058940D05DD3E006BFB54 /* Debug */,
1D6058950D05DD3E006BFB54 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "##APPID##" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C01FCF4F08A954540054247B /* Debug */,
C01FCF5008A954540054247B /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

View file

@ -0,0 +1,20 @@
Pictures
========
A very simple image browser, supporting the reading only from images/
directory right now.
So put any images files inside images/ directory, and start the app !
Android
-------
You can copy/paste this directory into /sdcard/kivy/pictures in your
android device.
Licences
--------
* faust_github.jpg: lucie's cat accepted to share his face
* 5552597274_de8b3fb5d2_b.jpg: http://www.flickr.com/photos/chialin-gallery/5552597274/sizes/l/
* 5509213687_ffd18df0b9_b.jpg: http://www.flickr.com/photos/orsomk/5509213687/sizes/l/

View file

@ -0,0 +1,3 @@
title=Pictures
author=Kivy team
orientation=landscape

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

View file

@ -0,0 +1,57 @@
#:kivy 1.0
#:import kivy kivy
#:import win kivy.core.window
FloatLayout:
canvas:
Color:
rgb: 1, 1, 1
Rectangle:
source: 'data/images/background.jpg'
size: self.size
BoxLayout:
padding: 10
spacing: 10
size_hint: 1, None
pos_hint: {'top': 1}
height: 44
Image:
size_hint: None, None
size: 24, 24
source: 'data/logo/kivy-icon-24.png'
Label:
height: 24
text_size: self.width, None
color: (1, 1, 1, .8)
text: 'Kivy %s - Pictures' % kivy.__version__
<Picture>:
# each time a picture is created, the image can delay the loading
# as soon as the image is loaded, ensure that the center is changed
# to the center of the screen.
on_size: self.center = win.Window.center
size: image.size
size_hint: None, None
Image:
id: image
source: root.source
# create initial image to be 400 pixels width
size: 400, 400 / self.image_ratio
# add shadow background
canvas.before:
Color:
rgba: 1,1,1,1
BorderImage:
source: 'shadow32.png'
border: (36,36,36,36)
size:(self.width+72, self.height+72)
pos: (-36,-36)

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View file

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

View file

@ -1,12 +1,14 @@
// //
// main.m // main.m
// iOS-python-test // {{ cookiecutter.project_name }}
// //
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#include <python2.7/Python.h> //#include <python2.7/Python.h>
#include "SDL/SDL_main.h" //#include <Python.h>
#include "../dist/root/python/include/python2.7/Python.h"
#include "../dist/include/common/sdl2/SDL_main.h"
#include <dlfcn.h> #include <dlfcn.h>
void export_orientation(); void export_orientation();
@ -32,7 +34,7 @@ int main(int argc, char *argv[]) {
putenv("KIVY_BUILD=ios"); putenv("KIVY_BUILD=ios");
putenv("KIVY_NO_CONFIG=1"); putenv("KIVY_NO_CONFIG=1");
putenv("KIVY_NO_FILELOG=1"); putenv("KIVY_NO_FILELOG=1");
putenv("KIVY_WINDOW=sdl"); putenv("KIVY_WINDOW=sdl2");
putenv("KIVY_IMAGE=imageio,tex"); putenv("KIVY_IMAGE=imageio,tex");
putenv("KIVY_AUDIO=sdl"); putenv("KIVY_AUDIO=sdl");
#ifndef DEBUG #ifndef DEBUG
@ -97,7 +99,7 @@ void export_orientation() {
} }
putenv((char *)[result UTF8String]); putenv((char *)[result UTF8String]);
//NSLog(@"Available orientation: %@", result); NSLog(@"Available orientation: %@", result);
} }
void load_custom_builtin_importer() { void load_custom_builtin_importer() {
@ -128,7 +130,7 @@ void load_custom_builtin_importer() {
" f = fullname.replace('.', '_')\n" \ " f = fullname.replace('.', '_')\n" \
" mod = sys.modules.get(f)\n" \ " mod = sys.modules.get(f)\n" \
" if mod is None:\n" \ " if mod is None:\n" \
" #print 'LOAD DYNAMIC', f\n" \ " #print 'LOAD DYNAMIC', f, sys.modules.keys()\n" \
" try:\n" \ " try:\n" \
" mod = imp.load_dynamic(f, f)\n" \ " mod = imp.load_dynamic(f, f)\n" \
" except ImportError:\n" \ " except ImportError:\n" \

View file

@ -8,26 +8,10 @@
<string>${PRODUCT_NAME}</string> <string>${PRODUCT_NAME}</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string> <string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIconFiles</key>
<array>
<string>icon.png</string>
</array>
<key>CFBundleIcons</key> <key>CFBundleIcons</key>
<dict> <dict/>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>icon.png</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
</dict>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>org.kivy.##APPID##</string> <string>{{ cookiecutter.domain_name }}</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
@ -36,16 +20,25 @@
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.1</string> <string>1.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1.1</string> <string>1.1</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>UIStatusBarHidden</key>
<true/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key> <key>UISupportedInterfaceOrientations~ipad</key>
<array> <array>
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array> </array>
</dict> </dict>
</plist> </plist>

View file

@ -0,0 +1,481 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
010731C2137F20B800A8D3A0 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 010731C1137F20B800A8D3A0 /* AudioToolbox.framework */; };
010731C4137F20C300A8D3A0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 010731C3137F20C300A8D3A0 /* QuartzCore.framework */; };
01532DAA137C099F0076F6BF /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 01532DA9137C099F0076F6BF /* icon.png */; };
01790B81137E5ED900E037D1 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 01790B7A137E5ED900E037D1 /* OpenGLES.framework */; };
1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; };
2CB5F34417D51580006187AB /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CB5F34317D51580006187AB /* CoreMotion.framework */; };
2CB5F34717D5233A006187AB /* bridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CB5F34617D5233A006187AB /* bridge.m */; };
597360631A8A7ABD001B2C0C /* libkivy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5973605B1A8A7ABD001B2C0C /* libkivy.a */; };
597360641A8A7ABD001B2C0C /* libpython.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5973605C1A8A7ABD001B2C0C /* libpython.a */; };
597360651A8A7ABD001B2C0C /* libsdl2_mixer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5973605D1A8A7ABD001B2C0C /* libsdl2_mixer.a */; };
597360661A8A7ABD001B2C0C /* libsdl2_ttf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5973605E1A8A7ABD001B2C0C /* libsdl2_ttf.a */; };
597360671A8A7ABD001B2C0C /* libsdl2_image.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5973605F1A8A7ABD001B2C0C /* libsdl2_image.a */; };
597360681A8A7ABD001B2C0C /* libsdl2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 597360601A8A7ABD001B2C0C /* libsdl2.a */; };
5973606A1A8A7ABD001B2C0C /* libfreetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 597360621A8A7ABD001B2C0C /* libfreetype.a */; };
59738AAC1A8AE4DB001B2C0C /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59738AAB1A8AE4DB001B2C0C /* Accelerate.framework */; };
59738AB01A8AF5B7001B2C0C /* libc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 59738AAF1A8AF5B7001B2C0C /* libc++.dylib */; };
59738AB21A8AF870001B2C0C /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59738AB11A8AF870001B2C0C /* MobileCoreServices.framework */; };
59738AB31A8AFACA001B2C0C /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 597360611A8A7ABD001B2C0C /* libffi.a */; };
59738AB51A8BB5D8001B2C0C /* lib in Resources */ = {isa = PBXBuildFile; fileRef = 59738AB41A8BB5D8001B2C0C /* lib */; };
59738AB71A8BB71F001B2C0C /* include in Resources */ = {isa = PBXBuildFile; fileRef = 59738AB61A8BB71F001B2C0C /* include */; };
59738AB91A8C1C82001B2C0C /* libios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 59738AB81A8C1C82001B2C0C /* libios.a */; };
59738ABB1A8E19AA001B2C0C /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 59738ABA1A8E19AA001B2C0C /* Images.xcassets */; };
59738ADB1A8E62D6001B2C0C /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738AD01A8E62D6001B2C0C /* Default-568h@2x.png */; };
59738ADC1A8E62D6001B2C0C /* Default-667h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738AD11A8E62D6001B2C0C /* Default-667h@2x.png */; };
59738ADD1A8E62D6001B2C0C /* Default-763h@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738AD21A8E62D6001B2C0C /* Default-763h@3x.png */; };
59738ADE1A8E62D6001B2C0C /* Default-Landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738AD31A8E62D6001B2C0C /* Default-Landscape.png */; };
59738ADF1A8E62D6001B2C0C /* Default-Landscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738AD41A8E62D6001B2C0C /* Default-Landscape@2x.png */; };
59738AE01A8E62D6001B2C0C /* Default-Portrait.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738AD51A8E62D6001B2C0C /* Default-Portrait.png */; };
59738AE11A8E62D6001B2C0C /* Default-Portrait@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738AD61A8E62D6001B2C0C /* Default-Portrait@2x~ipad.png */; };
59738AE21A8E62D6001B2C0C /* Default-Portrait@3x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738AD71A8E62D6001B2C0C /* Default-Portrait@3x~ipad.png */; };
59738AE31A8E62D6001B2C0C /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738AD81A8E62D6001B2C0C /* Default.png */; };
59738AE41A8E62D6001B2C0C /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738AD91A8E62D6001B2C0C /* Default@2x.png */; };
59738AE51A8E62D6001B2C0C /* Default@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 59738ADA1A8E62D6001B2C0C /* Default@3x.png */; };
5983EC97163CB90D00475EFB /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5983EC96163CB90D00475EFB /* libsqlite3.dylib */; };
59994D8D148D48E300863906 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994D8C148D48E300863906 /* ImageIO.framework */; };
59994D90148D686900863906 /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994D8F148D686900863906 /* libbz2.dylib */; };
59994D9E148E353000863906 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 59994D9D148E352F00863906 /* libz.dylib */; };
59994E3B148E85C800863906 /* YourApp in Resources */ = {isa = PBXBuildFile; fileRef = 59994E3A148E85C800863906 /* YourApp */; };
59ED7D0B150E325100A92BEE /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59ED7D0A150E325100A92BEE /* MessageUI.framework */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
010731C1137F20B800A8D3A0 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
010731C3137F20C300A8D3A0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
01532DA9137C099F0076F6BF /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = "<group>"; };
01790B7A137E5ED900E037D1 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
1D6058910D05DD3D006BFB54 /* {{ cookiecutter.project_name }}.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = {{ cookiecutter.project_name }}.app; sourceTree = BUILT_PRODUCTS_DIR; };
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
2CB5F34317D51580006187AB /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };
2CB5F34517D5233A006187AB /* bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bridge.h; sourceTree = SOURCE_ROOT; };
2CB5F34617D5233A006187AB /* bridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = bridge.m; sourceTree = SOURCE_ROOT; };
5973605B1A8A7ABD001B2C0C /* libkivy.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libkivy.a; path = {{ cookiecutter.dist_dir }}/lib/libkivy.a; sourceTree = "<group>"; };
5973605C1A8A7ABD001B2C0C /* libpython.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpython.a; path = {{ cookiecutter.dist_dir }}/lib/libpython.a; sourceTree = "<group>"; };
5973605D1A8A7ABD001B2C0C /* libsdl2_mixer.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsdl2_mixer.a; path = {{ cookiecutter.dist_dir }}/lib/libsdl2_mixer.a; sourceTree = "<group>"; };
5973605E1A8A7ABD001B2C0C /* libsdl2_ttf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsdl2_ttf.a; path = {{ cookiecutter.dist_dir }}/lib/libsdl2_ttf.a; sourceTree = "<group>"; };
5973605F1A8A7ABD001B2C0C /* libsdl2_image.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsdl2_image.a; path = {{ cookiecutter.dist_dir }}/lib/libsdl2_image.a; sourceTree = "<group>"; };
597360601A8A7ABD001B2C0C /* libsdl2.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsdl2.a; path = {{ cookiecutter.dist_dir }}/lib/libsdl2.a; sourceTree = "<group>"; };
597360611A8A7ABD001B2C0C /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libffi.a; path = {{ cookiecutter.dist_dir }}/lib/libffi.a; sourceTree = "<group>"; };
597360621A8A7ABD001B2C0C /* libfreetype.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfreetype.a; path = {{ cookiecutter.dist_dir }}/lib/libfreetype.a; sourceTree = "<group>"; };
59738AAB1A8AE4DB001B2C0C /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; };
59738AAD1A8AE57F001B2C0C /* libgcc_s.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libgcc_s.1.dylib; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/usr/lib/libgcc_s.1.dylib; sourceTree = DEVELOPER_DIR; };
59738AAF1A8AF5B7001B2C0C /* libc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.dylib"; path = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/usr/lib/libc++.dylib"; sourceTree = DEVELOPER_DIR; };
59738AB11A8AF870001B2C0C /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; };
59738AB41A8BB5D8001B2C0C /* lib */ = {isa = PBXFileReference; lastKnownFileType = folder; name = lib; path = {{ cookiecutter.dist_dir }}/root/python/lib; sourceTree = "<group>"; };
59738AB61A8BB71F001B2C0C /* include */ = {isa = PBXFileReference; lastKnownFileType = folder; name = include; path = {{ cookiecutter.dist_dir }}/hostpython/include; sourceTree = "<group>"; };
59738AB81A8C1C82001B2C0C /* libios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libios.a; path = {{ cookiecutter.dist_dir }}/lib/libios.a; sourceTree = "<group>"; };
59738ABA1A8E19AA001B2C0C /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = {{ cookiecutter.project_name }}/Images.xcassets; sourceTree = "<group>"; };
59738AD01A8E62D6001B2C0C /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "LaunchImages/Default-568h@2x.png"; sourceTree = "<group>"; };
59738AD11A8E62D6001B2C0C /* Default-667h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-667h@2x.png"; path = "LaunchImages/Default-667h@2x.png"; sourceTree = "<group>"; };
59738AD21A8E62D6001B2C0C /* Default-763h@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-763h@3x.png"; path = "LaunchImages/Default-763h@3x.png"; sourceTree = "<group>"; };
59738AD31A8E62D6001B2C0C /* Default-Landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape.png"; path = "LaunchImages/Default-Landscape.png"; sourceTree = "<group>"; };
59738AD41A8E62D6001B2C0C /* Default-Landscape@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape@2x.png"; path = "LaunchImages/Default-Landscape@2x.png"; sourceTree = "<group>"; };
59738AD51A8E62D6001B2C0C /* Default-Portrait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait.png"; path = "LaunchImages/Default-Portrait.png"; sourceTree = "<group>"; };
59738AD61A8E62D6001B2C0C /* Default-Portrait@2x~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait@2x~ipad.png"; path = "LaunchImages/Default-Portrait@2x~ipad.png"; sourceTree = "<group>"; };
59738AD71A8E62D6001B2C0C /* Default-Portrait@3x~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait@3x~ipad.png"; path = "LaunchImages/Default-Portrait@3x~ipad.png"; sourceTree = "<group>"; };
59738AD81A8E62D6001B2C0C /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = LaunchImages/Default.png; sourceTree = "<group>"; };
59738AD91A8E62D6001B2C0C /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "LaunchImages/Default@2x.png"; sourceTree = "<group>"; };
59738ADA1A8E62D6001B2C0C /* Default@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@3x.png"; path = "LaunchImages/Default@3x.png"; sourceTree = "<group>"; };
5983EC96163CB90D00475EFB /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
59994D8C148D48E300863906 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; };
59994D8F148D686900863906 /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = usr/lib/libbz2.dylib; sourceTree = SDKROOT; };
59994D9D148E352F00863906 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
59994E3A148E85C800863906 /* YourApp */ = {isa = PBXFileReference; lastKnownFileType = folder; path = YourApp; sourceTree = "<group>"; };
59ED7D0A150E325100A92BEE /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };
8D1107310486CEB800E47090 /* {{ cookiecutter.project_name }}-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "{{ cookiecutter.project_name }}-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
59738AB91A8C1C82001B2C0C /* libios.a in Frameworks */,
59738AB31A8AFACA001B2C0C /* libffi.a in Frameworks */,
59738AB21A8AF870001B2C0C /* MobileCoreServices.framework in Frameworks */,
59738AB01A8AF5B7001B2C0C /* libc++.dylib in Frameworks */,
59738AAC1A8AE4DB001B2C0C /* Accelerate.framework in Frameworks */,
2CB5F34417D51580006187AB /* CoreMotion.framework in Frameworks */,
5973606A1A8A7ABD001B2C0C /* libfreetype.a in Frameworks */,
59994D8D148D48E300863906 /* ImageIO.framework in Frameworks */,
597360671A8A7ABD001B2C0C /* libsdl2_image.a in Frameworks */,
597360681A8A7ABD001B2C0C /* libsdl2.a in Frameworks */,
5983EC97163CB90D00475EFB /* libsqlite3.dylib in Frameworks */,
59ED7D0B150E325100A92BEE /* MessageUI.framework in Frameworks */,
59994D90148D686900863906 /* libbz2.dylib in Frameworks */,
59994D9E148E353000863906 /* libz.dylib in Frameworks */,
597360661A8A7ABD001B2C0C /* libsdl2_ttf.a in Frameworks */,
597360641A8A7ABD001B2C0C /* libpython.a in Frameworks */,
597360651A8A7ABD001B2C0C /* libsdl2_mixer.a in Frameworks */,
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */,
597360631A8A7ABD001B2C0C /* libkivy.a in Frameworks */,
01790B81137E5ED900E037D1 /* OpenGLES.framework in Frameworks */,
010731C2137F20B800A8D3A0 /* AudioToolbox.framework in Frameworks */,
010731C4137F20C300A8D3A0 /* QuartzCore.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
080E96DDFE201D6D7F000001 /* Classes */ = {
isa = PBXGroup;
children = (
2CB5F34517D5233A006187AB /* bridge.h */,
2CB5F34617D5233A006187AB /* bridge.m */,
);
path = Classes;
sourceTree = "<group>";
};
19C28FACFE9D520D11CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
1D6058910D05DD3D006BFB54 /* {{ cookiecutter.project_name }}.app */,
);
name = Products;
sourceTree = "<group>";
};
29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
isa = PBXGroup;
children = (
080E96DDFE201D6D7F000001 /* Classes */,
29B97315FDCFA39411CA2CEA /* Sources */,
29B97317FDCFA39411CA2CEA /* Resources */,
29B97323FDCFA39411CA2CEA /* Frameworks */,
19C28FACFE9D520D11CA2CBB /* Products */,
);
name = CustomTemplate;
sourceTree = "<group>";
};
29B97315FDCFA39411CA2CEA /* Sources */ = {
isa = PBXGroup;
children = (
29B97316FDCFA39411CA2CEA /* main.m */,
59994E3A148E85C800863906 /* YourApp */,
);
name = "Sources";
sourceTree = "<group>";
};
29B97317FDCFA39411CA2CEA /* Resources */ = {
isa = PBXGroup;
children = (
59738ABA1A8E19AA001B2C0C /* Images.xcassets */,
59738AB61A8BB71F001B2C0C /* include */,
59738AB41A8BB5D8001B2C0C /* lib */,
01532DA9137C099F0076F6BF /* icon.png */,
8D1107310486CEB800E47090 /* {{ cookiecutter.project_name }}-Info.plist */,
59738AD01A8E62D6001B2C0C /* Default-568h@2x.png */,
59738AD11A8E62D6001B2C0C /* Default-667h@2x.png */,
59738AD21A8E62D6001B2C0C /* Default-763h@3x.png */,
59738AD31A8E62D6001B2C0C /* Default-Landscape.png */,
59738AD41A8E62D6001B2C0C /* Default-Landscape@2x.png */,
59738AD51A8E62D6001B2C0C /* Default-Portrait.png */,
59738AD61A8E62D6001B2C0C /* Default-Portrait@2x~ipad.png */,
59738AD71A8E62D6001B2C0C /* Default-Portrait@3x~ipad.png */,
59738AD81A8E62D6001B2C0C /* Default.png */,
59738AD91A8E62D6001B2C0C /* Default@2x.png */,
59738ADA1A8E62D6001B2C0C /* Default@3x.png */,
);
name = Resources;
sourceTree = "<group>";
};
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
isa = PBXGroup;
children = (
5973605B1A8A7ABD001B2C0C /* libkivy.a */,
5973605C1A8A7ABD001B2C0C /* libpython.a */,
5973605D1A8A7ABD001B2C0C /* libsdl2_mixer.a */,
5973605E1A8A7ABD001B2C0C /* libsdl2_ttf.a */,
5973605F1A8A7ABD001B2C0C /* libsdl2_image.a */,
597360601A8A7ABD001B2C0C /* libsdl2.a */,
597360611A8A7ABD001B2C0C /* libffi.a */,
597360621A8A7ABD001B2C0C /* libfreetype.a */,
59738AB81A8C1C82001B2C0C /* libios.a */,
5983EC96163CB90D00475EFB /* libsqlite3.dylib */,
59994D8F148D686900863906 /* libbz2.dylib */,
59738AAF1A8AF5B7001B2C0C /* libc++.dylib */,
59994D9D148E352F00863906 /* libz.dylib */,
59738AAD1A8AE57F001B2C0C /* libgcc_s.1.dylib */,
59738AAB1A8AE4DB001B2C0C /* Accelerate.framework */,
59ED7D0A150E325100A92BEE /* MessageUI.framework */,
010731C1137F20B800A8D3A0 /* AudioToolbox.framework */,
010731C3137F20C300A8D3A0 /* QuartzCore.framework */,
01790B7A137E5ED900E037D1 /* OpenGLES.framework */,
1D30AB110D05D00D00671497 /* Foundation.framework */,
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
59738AB11A8AF870001B2C0C /* MobileCoreServices.framework */,
288765FC0DF74451002DB57D /* CoreGraphics.framework */,
2CB5F34317D51580006187AB /* CoreMotion.framework */,
59994D8C148D48E300863906 /* ImageIO.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
1D6058900D05DD3D006BFB54 /* {{ cookiecutter.project_name }} */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "{{ cookiecutter.project_name }}" */;
buildPhases = (
113D17E2153E3DB5001310A5 /* ShellScript */,
113D17E2153E3DB5001310A6 /* ShellScript */,
113D17E2153E3DB5001310A7 /* ShellScript */,
1D60588D0D05DD3D006BFB54 /* Resources */,
1D60588E0D05DD3D006BFB54 /* Sources */,
1D60588F0D05DD3D006BFB54 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = {{ cookiecutter.project_name }};
productName = {{ cookiecutter.project_name }};
productReference = 1D6058910D05DD3D006BFB54 /* {{ cookiecutter.project_name }}.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0610;
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "{{ cookiecutter.project_name }}" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,
Japanese,
French,
German,
);
mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
projectDirPath = "";
projectRoot = "";
targets = (
1D6058900D05DD3D006BFB54 /* {{ cookiecutter.project_name }} */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
1D60588D0D05DD3D006BFB54 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
59738AE41A8E62D6001B2C0C /* Default@2x.png in Resources */,
59738AB51A8BB5D8001B2C0C /* lib in Resources */,
59738ABB1A8E19AA001B2C0C /* Images.xcassets in Resources */,
59738ADE1A8E62D6001B2C0C /* Default-Landscape.png in Resources */,
59738AE31A8E62D6001B2C0C /* Default.png in Resources */,
01532DAA137C099F0076F6BF /* icon.png in Resources */,
59994E3B148E85C800863906 /* YourApp in Resources */,
59738AE11A8E62D6001B2C0C /* Default-Portrait@2x~ipad.png in Resources */,
59738AE01A8E62D6001B2C0C /* Default-Portrait.png in Resources */,
59738ADC1A8E62D6001B2C0C /* Default-667h@2x.png in Resources */,
59738ADB1A8E62D6001B2C0C /* Default-568h@2x.png in Resources */,
59738ADD1A8E62D6001B2C0C /* Default-763h@3x.png in Resources */,
59738AE21A8E62D6001B2C0C /* Default-Portrait@3x~ipad.png in Resources */,
59738AB71A8BB71F001B2C0C /* include in Resources */,
59738AE51A8E62D6001B2C0C /* Default@3x.png in Resources */,
59738ADF1A8E62D6001B2C0C /* Default-Landscape@2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
113D17E2153E3DB5001310A5 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 12;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/bash;
shellScript = "rsync -av --delete \"{{ cookiecutter.project_dir }}\"/ \"$PROJECT_DIR\"/YourApp";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
113D17E2153E3DB5001310A6 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 12;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/bash;
shellScript = "{{ cookiecutter.dist_dir }}/hostpython/bin/python -OO -m compileall \"$PROJECT_DIR\"/YourApp";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
113D17E2153E3DB5001310A7 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 12;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/bash;
shellScript = "find \"$PROJECT_DIR\"/YourApp/ -iname '*.py' -exec rm {} \\; -or -iname '*.pyc' -exec rm {} \\;";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
1D60588E0D05DD3D006BFB54 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1D60589B0D05DD56006BFB54 /* main.m in Sources */,
2CB5F34717D5233A006187AB /* bridge.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
1D6058940D05DD3E006BFB54 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "";
GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = (
"{{ cookiecutter.dist_dir }}/root/python/include",
"{{ cookiecutter.dist_dir }}/include/common/sdl2",
);
INFOPLIST_FILE = "{{ cookiecutter.project_name }}-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"{{ cookiecutter.dist_dir }}/lib"
);
ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = "-all_load";
PRODUCT_NAME = {{ cookiecutter.project_name }};
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
SDKROOT = iphoneos;
STRIP_INSTALLED_PRODUCT = NO;
TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "";
};
name = Debug;
};
1D6058950D05DD3E006BFB54 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "";
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = (
"\"$(PROJECT_DIR)/../build/include\"",
"\"$(PROJECT_DIR)/../build/python/include\"",
);
INFOPLIST_FILE = "{{ cookiecutter.project_name }}-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(PROJECT_DIR)/../build/lib\"",
"/Users/tito/code/ios/kivy-ios/dist/lib",
"/Users/tito/code/ios/kivy-ios/dist/root/python/lib",
"/Users/tito/code/ios/kivy-ios/dist/root/python/lib/python2.7/config",
);
OTHER_LDFLAGS = "-all_load";
PRODUCT_NAME = {{ cookiecutter.project_name }};
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
SDKROOT = iphoneos;
SKIP_INSTALL = NO;
STRIP_INSTALLED_PRODUCT = NO;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
C01FCF4F08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEAD_CODE_STRIPPING = NO;
USER_HEADER_SEARCH_PATHS = {{ cookiecutter.dist_dir }}/root/include/;
};
name = Debug;
};
C01FCF5008A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEAD_CODE_STRIPPING = NO;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
USER_HEADER_SEARCH_PATHS = {{ cookiecutter.dist_dir }}/root/include/;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "{{ cookiecutter.project_name }}" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1D6058940D05DD3E006BFB54 /* Debug */,
1D6058950D05DD3E006BFB54 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "{{ cookiecutter.project_name }}" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C01FCF4F08A954540054247B /* Debug */,
C01FCF5008A954540054247B /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
}

View file

@ -2,6 +2,6 @@
<Workspace <Workspace
version = "1.0"> version = "1.0">
<FileRef <FileRef
location = "self:##APPID##.xcodeproj"> location = "self:{{ cookiecutter.project_name }}.xcodeproj">
</FileRef> </FileRef>
</Workspace> </Workspace>

View file

@ -0,0 +1,28 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}