diff --git a/cibuildwheel/__main__.py b/cibuildwheel/__main__.py index f8b7631e..db5c7c23 100644 --- a/cibuildwheel/__main__.py +++ b/cibuildwheel/__main__.py @@ -60,10 +60,10 @@ def main(): parser.add_argument('--output-dir', default=os.environ.get('CIBW_OUTPUT_DIR', 'wheelhouse'), help='Destination folder for the wheels.') - parser.add_argument('project_dir', + parser.add_argument('package_dir', default='.', nargs='?', - help=('Path to the project that you want wheels for. Default: the current ' + help=('Path to the package that you want wheels for. Default: the current ' 'directory.')) parser.add_argument('--print-build-identifiers', @@ -101,7 +101,7 @@ def main(): test_command = get_option_from_environment('CIBW_TEST_COMMAND', platform=platform) test_requires = get_option_from_environment('CIBW_TEST_REQUIRES', platform=platform, default='').split() test_extras = get_option_from_environment('CIBW_TEST_EXTRAS', platform=platform, default='') - project_dir = args.project_dir + package_dir = args.package_dir before_build = get_option_from_environment('CIBW_BEFORE_BUILD', platform=platform) build_verbosity = get_option_from_environment('CIBW_BUILD_VERBOSITY', platform=platform, default='') build_config, skip_config = os.environ.get('CIBW_BUILD', '*'), os.environ.get('CIBW_SKIP', '') @@ -136,8 +136,8 @@ def main(): # This needs to be passed on to the docker container in linux.py os.environ['CIBUILDWHEEL'] = '1' - if not os.path.exists(os.path.join(project_dir, 'setup.py')): - print('cibuildwheel: Could not find setup.py at root of project', file=sys.stderr) + if not os.path.exists(os.path.join(package_dir, 'setup.py')): + print('cibuildwheel: Could not find setup.py at root of package', file=sys.stderr) exit(2) if args.print_build_identifiers: @@ -145,7 +145,8 @@ def main(): exit(0) build_options = dict( - project_dir=project_dir, + project_dir='.', + package_dir=package_dir, output_dir=output_dir, test_command=test_command, test_requires=test_requires, diff --git a/cibuildwheel/linux.py b/cibuildwheel/linux.py index 3113f309..4d2d4de6 100644 --- a/cibuildwheel/linux.py +++ b/cibuildwheel/linux.py @@ -88,6 +88,12 @@ def build(project_dir, output_dir, test_command, before_test, test_requires, tes ('pp', 'manylinux_x86_64', manylinux_images['pypy_x86_64']), ] + abs_project_dir = os.path.abspath(project_dir) + abs_package_dir = os.path.abspath(package_dir) + + container_project_dir = '/project' + container_package_dir = os.path.join(container_project_dir, os.path.relpath(abs_package_dir, os.path.commonprefix([abs_project_dir, abs_package_dir]))), + for implementation, platform_tag, docker_image in platforms: platform_configs = [c for c in python_configurations if c.identifier.startswith(implementation) and c.identifier.endswith(platform_tag)] if not platform_configs: @@ -122,7 +128,7 @@ def build(project_dir, output_dir, test_command, before_test, test_requires, tes # Build the wheel rm -rf /tmp/built_wheel mkdir /tmp/built_wheel - pip wheel . -w /tmp/built_wheel --no-deps {build_verbosity_flag} + pip wheel {package_dir} -w /tmp/built_wheel --no-deps {build_verbosity_flag} built_wheel=(/tmp/built_wheel/*.whl) # repair the wheel @@ -191,13 +197,14 @@ def build(project_dir, output_dir, test_command, before_test, test_requires, tes ) done '''.format( pybin_paths=' '.join(c.path + '/bin' for c in platform_configs), + package_dir=container_package_dir, test_requires=' '.join(test_requires), test_extras=test_extras, test_command=shlex.quote( - prepare_command(test_command, project='/project') if test_command else '' + prepare_command(test_command, project=container_project_dir, package=container_package_dir) if test_command else '' ), before_build=shlex.quote( - prepare_command(before_build, project='/project') if before_build else '' + prepare_command(before_build, project=container_project_dir, package=container_package_dir) if before_build else '' ), build_verbosity_flag=' '.join(get_build_verbosity_extra_flags(build_verbosity)), repair_command=shlex.quote( @@ -207,7 +214,7 @@ def build(project_dir, output_dir, test_command, before_test, test_requires, tes uid=os.getuid(), gid=os.getgid(), before_test=shlex.quote( - prepare_command(before_test, project='/project') if before_test else '' + prepare_command(before_test, project=container_project_dir, package=container_package_dir) if before_test else '' ), ) diff --git a/cibuildwheel/macos.py b/cibuildwheel/macos.py index 59106262..329102b7 100644 --- a/cibuildwheel/macos.py +++ b/cibuildwheel/macos.py @@ -105,8 +105,9 @@ def install_pypy(version, url): return installation_bin_path -def build(project_dir, output_dir, test_command, before_test, test_requires, test_extras, before_build, build_verbosity, build_selector, repair_command, environment): +def build(project_dir, package_dir, output_dir, test_command, before_test, test_requires, test_extras, before_build, build_verbosity, build_selector, repair_command, environment): abs_project_dir = os.path.abspath(project_dir) + abs_package_dir = os.path.abspath(package_dir) temp_dir = tempfile.mkdtemp(prefix='cibuildwheel') built_wheel_dir = os.path.join(temp_dir, 'built_wheel') repaired_wheel_dir = os.path.join(temp_dir, 'repaired_wheel') @@ -175,14 +176,14 @@ def build(project_dir, output_dir, test_command, before_test, test_requires, tes # run the before_build command if before_build: - before_build_prepared = prepare_command(before_build, project=abs_project_dir) + before_build_prepared = prepare_command(before_build, project=abs_project_dir, package=abs_package_dir) call(before_build_prepared, env=env, shell=True) # build the wheel if os.path.exists(built_wheel_dir): shutil.rmtree(built_wheel_dir) os.makedirs(built_wheel_dir) - call(['pip', 'wheel', abs_project_dir, '-w', built_wheel_dir, '--no-deps'] + get_build_verbosity_extra_flags(build_verbosity), env=env) + call(['pip', 'wheel', abs_package_dir, '-w', built_wheel_dir, '--no-deps'] + get_build_verbosity_extra_flags(build_verbosity), env=env) built_wheel = glob(os.path.join(built_wheel_dir, '*.whl'))[0] # repair the wheel @@ -215,7 +216,7 @@ def build(project_dir, output_dir, test_command, before_test, test_requires, tes call(['which', 'python'], env=virtualenv_env) if before_test: - before_test_prepared = prepare_command(before_test, project=abs_project_dir) + before_test_prepared = prepare_command(before_test, project=abs_project_dir, package=abs_package_dir) call(before_test_prepared, env=virtualenv_env, shell=True) # install the wheel @@ -228,7 +229,7 @@ def build(project_dir, output_dir, test_command, before_test, test_requires, tes # run the tests from $HOME, with an absolute path in the command # (this ensures that Python runs the tests against the installed wheel # and not the repo code) - test_command_prepared = prepare_command(test_command, project=abs_project_dir) + test_command_prepared = prepare_command(test_command, project=abs_project_dir, package=abs_package_dir) call(test_command_prepared, cwd=os.environ['HOME'], env=virtualenv_env, shell=True) # clean up diff --git a/cibuildwheel/windows.py b/cibuildwheel/windows.py index 8030cf31..9ff642e3 100644 --- a/cibuildwheel/windows.py +++ b/cibuildwheel/windows.py @@ -86,8 +86,9 @@ def install_pypy(version, arch, url): return installation_path -def build(project_dir, output_dir, test_command, before_test, test_requires, test_extras, before_build, build_verbosity, build_selector, repair_command, environment): +def build(project_dir, package_dir, output_dir, test_command, before_test, test_requires, test_extras, before_build, build_verbosity, build_selector, repair_command, environment): abs_project_dir = os.path.abspath(project_dir) + abs_package_dir = os.path.abspath(package_dir) temp_dir = tempfile.mkdtemp(prefix='cibuildwheel') built_wheel_dir = os.path.join(temp_dir, 'built_wheel') repaired_wheel_dir = os.path.join(temp_dir, 'repaired_wheel') @@ -148,14 +149,14 @@ def build(project_dir, output_dir, test_command, before_test, test_requires, tes # run the before_build command if before_build: - before_build_prepared = prepare_command(before_build, project=abs_project_dir) + before_build_prepared = prepare_command(before_build, project=abs_project_dir, package=abs_package_dir) shell([before_build_prepared], env=env) # build the wheel if os.path.exists(built_wheel_dir): shutil.rmtree(built_wheel_dir) os.makedirs(built_wheel_dir) - shell(['pip', 'wheel', abs_project_dir, '-w', built_wheel_dir, '--no-deps'] + get_build_verbosity_extra_flags(build_verbosity), env=env) + shell(['pip', 'wheel', abs_package_dir, '-w', built_wheel_dir, '--no-deps'] + get_build_verbosity_extra_flags(build_verbosity), env=env) built_wheel = glob(os.path.join(built_wheel_dir, '*.whl'))[0] # repair the wheel @@ -193,7 +194,7 @@ def build(project_dir, output_dir, test_command, before_test, test_requires, tes shell(['which', 'python'], env=virtualenv_env) if before_test: - before_test_prepared = prepare_command(before_test, project=abs_project_dir) + before_test_prepared = prepare_command(before_test, project=abs_project_dir, package=abs_package_dir) shell([before_test_prepared], env=virtualenv_env) # install the wheel @@ -206,7 +207,7 @@ def build(project_dir, output_dir, test_command, before_test, test_requires, tes # run the tests from c:\, with an absolute path in the command # (this ensures that Python runs the tests against the installed wheel # and not the repo code) - test_command_prepared = prepare_command(test_command, project=abs_project_dir) + test_command_prepared = prepare_command(test_command, project=abs_project_dir, package=abs_package_dir) shell([test_command_prepared], cwd='c:\\', env=virtualenv_env) # clean up