1- import os
2- import subprocess
3- import sys
4- from pathlib import Path
5-
6- from setuptools import Extension , setup
7- from setuptools .command .build_ext import build_ext
8-
9-
10- class CMakeExtension (Extension ):
11- def __init__ (self , name : str , source_dir : Path ) -> None :
12- super ().__init__ (name , sources = [])
13- self .source_dir = source_dir .resolve ()
14-
15-
16- class CMakeBuild (build_ext ):
17- def conan_profile (self ) -> str :
18- subprocess .run (["conan" , "profile" , "detect" , "-e" ], check = True )
19-
20- default_path = Path .home () / ".conan2" / "profiles" / "default"
21-
22- with open (default_path , "r" ) as f :
23- default_profile = f .read ()
24- default_profile = default_profile .replace ("compiler.cppstd=gnu14" , "compiler.cppstd=gnu20" )
25- with open (default_path , "w" ) as f :
26- f .write (default_profile )
27-
28- def conan_remote (self ) -> str :
29- conan_odr_remote = (
30- "https://artifactory.opendocument.app/artifactory/api/conan/conan"
31- )
32-
33- result = subprocess .run (
34- ["conan" , "remote" , "list" ], check = True , capture_output = True , text = True
35- )
36- if conan_odr_remote not in result .stdout :
37- print (f"Adding Conan remote { conan_odr_remote } " )
38- subprocess .run (
39- [
40- "conan" ,
41- "remote" ,
42- "add" ,
43- "odr" ,
44- conan_odr_remote ,
45- ],
46- check = True ,
47- )
48-
49- def conan_install (self , source_dir : Path , build_dir : Path ) -> None :
50- subprocess .run (
51- [
52- "conan" ,
53- "install" ,
54- str (source_dir ),
55- f"--output-folder={ str (build_dir )} " ,
56- "--build=missing" ,
57- "-s" ,
58- "build_type=Release" ,
59- ],
60- check = True ,
61- )
62-
63- def cmake_configure (self , source_dir : Path , build_dir : Path , install_dir : Path ) -> None :
64- subprocess .run (
65- [
66- "cmake" ,
67- "-S" ,
68- str (source_dir ),
69- "-B" ,
70- str (build_dir ),
71- "-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake" ,
72- f"-DCMAKE_INSTALL_PREFIX={ str (install_dir )} " ,
73- f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={ str (install_dir )} " ,
74- "-DCMAKE_BUILD_TYPE=Release" ,
75- f"-DPYTHON_EXECUTABLE={ sys .executable } " ,
76- ],
77- check = True ,
78- )
79-
80- def cmake_build (self , build_dir : Path ) -> None :
81- subprocess .run (
82- [
83- "cmake" ,
84- "--build" ,
85- str (build_dir ),
86- "--config" ,
87- "Release" ,
88- ],
89- check = True ,
90- )
91-
92- def cmake_install (self , build_dir : Path ) -> None :
93- subprocess .run (
94- [
95- "cmake" ,
96- "--install" ,
97- str (build_dir ),
98- "--config" ,
99- "Release" ,
100- ],
101- check = True ,
102- )
103-
104- def build_extension (self , ext : CMakeExtension ) -> None :
105- source_dir = Path (ext .source_dir )
106-
107- build_temp = Path (self .build_temp ) / ext .name
108- build_temp .mkdir (parents = True , exist_ok = True )
109-
110- ext_fullpath = Path (self .get_ext_fullpath (ext .name ))
111- install_dir = ext_fullpath .parent
112-
113- self .conan_profile ()
114- self .conan_remote ()
115- self .conan_install (source_dir , build_temp )
116-
117- self .cmake_configure (source_dir , build_temp , install_dir )
118- self .cmake_build (build_temp )
119- self .cmake_install (build_temp )
120-
121- # list build directory for debugging purposes
122- print (f"Build directory: { build_temp } " )
123- subprocess .run (["ls" , "-la" , str (build_temp )], check = True )
124-
125- print (f"Install directory: { install_dir } " )
126- subprocess .run (["ls" , "-la" , str (install_dir )], check = True )
1+ from skbuild_conan import setup
2+ from setuptools import find_packages
1273
1284
1295setup (
@@ -133,13 +9,14 @@ def build_extension(self, ext: CMakeExtension) -> None:
1339 author_email = "stefl.andreas@gmail.com" ,
13410 description = "It's Android's first OpenOffice Document Reader for Python!" ,
13511 long_description = "" ,
136- ext_modules = [CMakeExtension ("pyodr" , Path ("src/cpp" ))],
137- cmdclass = {"build_ext" : CMakeBuild },
138- zip_safe = False ,
12+ python_requires = ">=3.7" ,
13+ cmake_minimum_required_version = "3.12" ,
14+ packages = find_packages ("src" ),
15+ package_dir = {"" : "src" },
13916 install_requires = [],
14017 extras_require = {
14118 "dev" : ["black" ],
14219 "test" : ["pytest>=6.0" ],
14320 },
144- python_requires = ">=3.7 " ,
21+ conanfile = "src/cpp/conanfile.txt " ,
14522)
0 commit comments