From e607bd7283024bd0ab81fab8057bf8dd07eca0f5 Mon Sep 17 00:00:00 2001 From: Daniel Hershcovich Date: Wed, 16 Aug 2017 09:35:07 +0300 Subject: [PATCH] Pass variables from CMake to setup.py as command line arguments Apparently `cmake -E env` is only available from version 3.1. --- python/CMakeLists.txt | 4 ++-- setup.py | 47 ++++++++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index b9f23188d..17182c664 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -65,8 +65,8 @@ if(PYTHON) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/timestamp - COMMAND ${CMAKE_COMMAND} -E env ${EnvVars} ${PYTHON} - ARGS ${CMAKE_SOURCE_DIR}/setup.py build_ext --inplace + COMMAND ${PYTHON} + ARGS ${CMAKE_SOURCE_DIR}/setup.py ${EnvVars} build_ext --inplace COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/timestamp DEPENDS ${DepFiles}) diff --git a/setup.py b/setup.py index d95342f0c..31a9ec4f2 100644 --- a/setup.py +++ b/setup.py @@ -39,6 +39,17 @@ def strip_lib(filename): return re.sub(r"^(?:(?:lib)?(.*)\.(?:so|a|dylib)|(.*)\.lib)$", r"\1\2", filename) +# In addition to environment variables, read variables passed on the command line as "VARIABLE=VALUE" arguments +ENV = dict(os.environ) +for i, arg in enumerate(sys.argv[1:]): + try: + key, value = arg.split("=", 1) + except ValueError: + break + ENV[key] = value + +del sys.argv[1:i+1] + log.basicConfig(stream=sys.stdout, level=log.INFO) # For build @@ -50,19 +61,19 @@ def strip_lib(filename): SCRIPT_DIR = os.path.dirname(os.path.abspath(this_file)) BUILD_DIR = "build" BUILT_EXTENSIONS = False -CMAKE_PATH = os.environ.get("CMAKE", find_executable("cmake")) +CMAKE_PATH = ENV.get("CMAKE", find_executable("cmake")) if CMAKE_PATH is None: raise DistutilsSetupError("`cmake` not found, and `CMAKE` is not set.") -MAKE_PATH = os.environ.get("MAKE", find_executable("make")) +MAKE_PATH = ENV.get("MAKE", find_executable("make")) if MAKE_PATH is None: raise DistutilsSetupError("`make` not found, and `MAKE` is not set.") -MAKE_FLAGS = os.environ.get("MAKE_FLAGS", "-j %d" % cpu_count()).split() -EIGEN3_INCLUDE_DIR = os.environ.get("EIGEN3_INCLUDE_DIR") # directory where eigen is saved +MAKE_FLAGS = ENV.get("MAKE_FLAGS", "-j %d" % cpu_count()).split() +EIGEN3_INCLUDE_DIR = ENV.get("EIGEN3_INCLUDE_DIR") # directory where eigen is saved HG_PATH = find_executable("hg") -CC_PATH = os.environ.get("CC", find_executable("gcc")) +CC_PATH = ENV.get("CC", find_executable("gcc")) if CC_PATH is None: raise DistutilsSetupError("`gcc` not found, and `CC` is not set.") -CXX_PATH = os.environ.get("CXX", find_executable("g++")) +CXX_PATH = ENV.get("CXX", find_executable("g++")) if CXX_PATH is None: raise DistutilsSetupError("`g++` not found, and `CXX` is not set.") INSTALL_PREFIX = os.path.join(get_python_lib(), os.pardir, os.pardir, os.pardir) @@ -85,24 +96,24 @@ def strip_lib(filename): INCLUDE_DIRS = [] # Add all environment variables from CMake for Cython extensions -append_cmake_lib_list(GPULIBRARIES, os.environ.get("CUDA_CUBLAS_FILES")) -append_cmake_list(GPULIBRARY_DIRS, os.environ.get("CUDA_CUBLAS_DIRS")) -CMAKE_INSTALL_PREFIX = os.environ.get("CMAKE_INSTALL_PREFIX", INSTALL_PREFIX) +append_cmake_lib_list(GPULIBRARIES, ENV.get("CUDA_CUBLAS_FILES")) +append_cmake_list(GPULIBRARY_DIRS, ENV.get("CUDA_CUBLAS_DIRS")) +CMAKE_INSTALL_PREFIX = ENV.get("CMAKE_INSTALL_PREFIX", INSTALL_PREFIX) LIBS_INSTALL_DIR = CMAKE_INSTALL_PREFIX + "/lib/" -PROJECT_SOURCE_DIR = os.environ.get("PROJECT_SOURCE_DIR", SCRIPT_DIR) # location of the main dynet directory -PROJECT_BINARY_DIR = os.environ.get("PROJECT_BINARY_DIR", BUILD_DIR) # path where dynet is built +PROJECT_SOURCE_DIR = ENV.get("PROJECT_SOURCE_DIR", SCRIPT_DIR) # location of the main dynet directory +PROJECT_BINARY_DIR = ENV.get("PROJECT_BINARY_DIR", BUILD_DIR) # path where dynet is built DYNET_LIB_DIR = PROJECT_BINARY_DIR + "/dynet/" -if os.environ.get("MSVC") == "1": +if ENV.get("MSVC") == "1": COMPILER_ARGS[:] = ["-DNOMINMAX", "/EHsc"] DYNET_LIB_DIR += "/Release/" # For MSVC, we compile dynet as a static lib, so we need to also link in the # other libraries it depends on: - append_cmake_lib_list(LIBRARIES, os.environ.get("LIBS")) - append_cmake_lib_list(GPULIBRARIES, os.environ.get("LIBS")) - append_cmake_list(LIBRARY_DIRS, os.environ.get("MKL_LINK_DIRS")) # Add the MKL dirs, if MKL is being used - append_cmake_lib_list(GPULIBRARIES, os.environ.get("CUDA_RT_FILES")) - append_cmake_list(GPULIBRARY_DIRS, os.environ.get("CUDA_RT_DIRS")) + append_cmake_lib_list(LIBRARIES, ENV.get("LIBS")) + append_cmake_lib_list(GPULIBRARIES, ENV.get("LIBS")) + append_cmake_list(LIBRARY_DIRS, ENV.get("MKL_LINK_DIRS")) # Add the MKL dirs, if MKL is being used + append_cmake_lib_list(GPULIBRARIES, ENV.get("CUDA_RT_FILES")) + append_cmake_list(GPULIBRARY_DIRS, ENV.get("CUDA_RT_DIRS")) else: COMPILER_ARGS[:] = ["-std=c++11"] RUNTIME_LIB_DIRS.extend([DYNET_LIB_DIR, LIBS_INSTALL_DIR]) @@ -130,7 +141,7 @@ def strip_lib(filename): runtime_library_dirs=RUNTIME_LIB_DIRS, )] -if os.environ.get("WITH_CUDA_BACKEND") == "1": # if cuda requested +if ENV.get("WITH_CUDA_BACKEND") == "1": # if cuda requested TARGET.append(Extension( "_gdynet", # name of extension ["_gdynet.pyx"], # filename of our Pyrex/Cython source