Source code for jacinle.jit.cext.travis
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File : travis.py
# Author : Jiayuan Mao
# Email : maojiayuan@gmail.com
# Date : 02/04/2018
#
# This file is part of Jacinle.
# Distributed under terms of the MIT license.
import sys
import os.path as osp
import glob
import subprocess
from typing import Optional, Sequence
from jacinle.logging import get_logger
logger = get_logger(__file__)
__all__ = ['auto_travis']
[docs]
def auto_travis(filename: str, required_files: Optional[Sequence[str]] = None, required_imports: Optional[Sequence[str]] = None, use_glob: bool = True, force_recompile: bool = False):
"""A simple function to automatically run the ``./travis.sh`` script in the
current directory. The most common usage is to put the following code in
your ``__init__.py`` file and add ``auto_travis(__file__)`` to the end of
the file.
Args:
filename: the ``__file__`` variable of the current module.
required_files: a list of required files to check. If not provided, use ``['**/*.so']``.
required_imports: a list of required modules to import. If not provided, use required_files to check.
use_glob: whether to use glob to check the required files.
"""
compiled = True
dirname = osp.dirname(filename)
if required_imports is not None:
sys.path.insert(0, dirname)
if isinstance(required_imports, str):
required_imports = [required_imports]
for module in required_imports:
try:
__import__(module)
except ImportError:
compiled = False
break
sys.path.pop(0)
else:
# Use required_files to check.
if required_files is None:
required_files = ['**/*.so']
for fname in required_files:
fname = osp.join(dirname, fname)
if not osp.exists(fname):
if not use_glob or len(glob.glob(osp.join(dirname, fname), recursive=True)) == 0:
compiled = False
if compiled and not force_recompile:
logger.critical('Loading c extension from: "{}".'.format(osp.realpath(dirname)))
else:
logger.critical('Compiling c extension at: "{}".'.format(osp.realpath(dirname)))
subprocess.check_call(['./travis.sh'], cwd=dirname)