File size: 4,214 Bytes
26225c5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# -------------------------------------------------------------------- #
# Distutils setup script for compiling python extensions #
# -------------------------------------------------------------------- #
"""
Compilation command: `python scripts/setup_dependencies.py build_ext`
Camille Baudoin and Hugo Raguet (2019), adapted by Loic Landrieu (2020), and Damien Robert (2022)
Source: https://github.com/loicland/img2svg
"""
from distutils.core import setup, Extension
from distutils.command.build import build
import numpy
import shutil
import os
import os.path as osp
import re
########################################################################
# Targets and compile options #
########################################################################
# Keep track of directories of interest
WORK_DIR = osp.realpath(os.curdir)
PROJECT_DIR = osp.realpath(osp.dirname(osp.dirname(__file__)))
DEPENDENCIES_DIR = osp.join(PROJECT_DIR, 'src', 'dependencies')
# Find the Numpy headers
include_dirs = [numpy.get_include(), "../include"]
# Compilation and linkage options
# MIN_OPS_PER_THREAD roughly controls parallelization, see doc in README.md
# COMP_T_ON_32_BITS for components identifiers on 32 bits rather than 16
if os.name == 'nt': # windows
extra_compile_args = ["/std:c++11", "/openmp",
"-DMIN_OPS_PER_THREAD=10000", "-DCOMP_T_ON_32_BITS"]
extra_link_args = ["/lgomp"]
elif os.name == 'posix': # linux
extra_compile_args = ["-std=c++11", "-fopenmp",
"-DMIN_OPS_PER_THREAD=10000", "-DCOMP_T_ON_32_BITS"]
extra_link_args = ["-lgomp"]
else:
raise NotImplementedError('OS not supported yet.')
########################################################################
# Auxiliary functions #
########################################################################
class build_class(build):
def initialize_options(self):
build.initialize_options(self)
self.build_lib = "bin"
def run(self):
build_path = self.build_lib
def purge(dir, pattern):
for f in os.listdir(dir):
if re.search(pattern, f):
os.remove(osp.join(dir, f))
########################################################################
# Grid graph #
########################################################################
# Move to the appropriate working directory
os.chdir(osp.join(DEPENDENCIES_DIR, 'grid_graph/python'))
name = "grid_graph"
if not osp.exists("bin"):
os.mkdir("bin")
# Remove previously compiled lib
purge("bin/", name)
# Compilation
mod = Extension(
name,
# list source files
["cpython/grid_graph_cpy.cpp",
"../src/edge_list_to_forward_star.cpp",
"../src/grid_to_graph.cpp"],
include_dirs=include_dirs,
extra_compile_args=extra_compile_args,
extra_link_args=extra_link_args)
setup(name=name, ext_modules=[mod], cmdclass=dict(build=build_class))
# Postprocessing
try:
# remove temporary compilation products
shutil.rmtree("build")
except FileNotFoundError:
pass
########################################################################
# Parallel cut-pursuit #
########################################################################
# Move to the appropriate working directory
os.chdir(osp.join(DEPENDENCIES_DIR, 'parallel_cut_pursuit/python'))
name = "cp_d0_dist_cpy"
if not osp.exists("bin"):
os.mkdir("bin")
# Remove previously compiled lib
purge("bin/", name)
# Compilation
mod = Extension(
name,
# list source files
["cpython/cp_d0_dist_cpy.cpp", "../src/cp_d0_dist.cpp",
"../src/cut_pursuit_d0.cpp", "../src/cut_pursuit.cpp",
"../src/maxflow.cpp"],
include_dirs=include_dirs,
extra_compile_args=extra_compile_args,
extra_link_args=extra_link_args)
setup(name=name, ext_modules=[mod], cmdclass=dict(build=build_class))
# Postprocessing
try:
# remove temporary compilation products
shutil.rmtree("build")
except FileNotFoundError:
pass
# Restore the initial working directory
os.chdir(WORK_DIR) |