22import importlib
33import zipfile
44import glob
5+ from six import PY2
6+
57import sh
68import shutil
79from os import listdir , unlink , environ , mkdir
1315from pythonforandroid .logger import (logger , info , warning , shprint , info_main )
1416from pythonforandroid .util import (urlretrieve , current_directory , ensure_dir )
1517
18+ import pythonforandroid .recipes
19+
20+
21+ if PY2 :
22+ import imp
23+ import_recipe = imp .load_source
24+ else :
25+ import importlib .util
26+ if hasattr (importlib .util , 'module_from_spec' ):
27+ def import_recipe (module , filename ):
28+ spec = importlib .util .spec_from_file_location (module , filename )
29+ mod = importlib .util .module_from_spec (spec )
30+ spec .loader .exec_module (mod )
31+ return mod
32+ else :
33+ from importlib .machinery import SourceFileLoader
34+
35+ def import_recipe (module , filename ):
36+ return SourceFileLoader (module , filename ).load_module ()
37+
1638
1739class Recipe (object ):
1840 url = None
@@ -512,15 +534,22 @@ def clean_build(self, arch=None):
512534 'did not exist' ).format (self .name ))
513535
514536 @classmethod
515- def list_recipes (cls ):
537+ def recipe_dirs (cls , ctx ):
538+ return [ctx .local_recipes ,
539+ join (ctx .storage_dir , 'recipes' ),
540+ join (ctx .root_dir , "recipes" )]
541+
542+ @classmethod
543+ def list_recipes (cls , ctx ):
516544 forbidden_dirs = ('__pycache__' , )
517- recipes_dir = join (dirname (__file__ ), "recipes" )
518- for name in listdir (recipes_dir ):
519- if name in forbidden_dirs :
520- continue
521- fn = join (recipes_dir , name )
522- if isdir (fn ):
523- yield name
545+ for recipes_dir in cls .recipe_dirs (ctx ):
546+ if recipes_dir and exists (recipes_dir ):
547+ for name in listdir (recipes_dir ):
548+ if name in forbidden_dirs :
549+ continue
550+ fn = join (recipes_dir , name )
551+ if isdir (fn ):
552+ yield name
524553
525554 @classmethod
526555 def get_recipe (cls , name , ctx ):
@@ -529,16 +558,22 @@ def get_recipe(cls, name, ctx):
529558 cls .recipes = {}
530559 if name in cls .recipes :
531560 return cls .recipes [name ]
532- recipe_dir = join (ctx .root_dir , 'recipes' , name )
533- if not exists (recipe_dir ): # AND: This will need modifying
534- # for user-supplied recipes
561+
562+ recipe_file = None
563+ for recipes_dir in cls .recipe_dirs (ctx ):
564+ recipe_file = join (recipes_dir , name , '__init__.py' )
565+ if exists (recipe_file ):
566+ break
567+ recipe_file = None
568+
569+ if not recipe_file :
535570 raise IOError ('Recipe folder does not exist' )
536- mod = importlib . import_module (
537- " pythonforandroid.recipes.{}" .format (name ))
571+
572+ mod = import_recipe ( ' pythonforandroid.recipes.{}' .format (name ), recipe_file )
538573 if len (logger .handlers ) > 1 :
539574 logger .removeHandler (logger .handlers [1 ])
540575 recipe = mod .recipe
541- recipe .recipe_dir = recipe_dir
576+ recipe .recipe_dir = dirname ( recipe_file )
542577 recipe .ctx = ctx
543578 return recipe
544579
0 commit comments