toolchain: create new Xcode template, based on cookie cutter tempting system.
20
toolchain.py
|
@ -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()
|
||||||
|
|
|
@ -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
16
tools/external/cookiecutter/__init__.py
vendored
Executable 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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
2352
tools/external/sh.py
vendored
Normal 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."
|
|
1
tools/templates/cookiecutter.json
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{}
|
|
@ -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 */;
|
|
||||||
}
|
|
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 7.9 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 9 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 9 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 526 B |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 4 KiB |
|
@ -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/
|
|
@ -0,0 +1,3 @@
|
||||||
|
title=Pictures
|
||||||
|
author=Kivy team
|
||||||
|
orientation=landscape
|
After Width: | Height: | Size: 321 KiB |
After Width: | Height: | Size: 428 KiB |
After Width: | Height: | Size: 220 KiB |
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 9.9 KiB |
|
@ -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" \
|
|
@ -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>
|
|
@ -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 */;
|
||||||
|
}
|
|
@ -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>
|
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|