1212DIR = os .path .abspath (os .path .dirname (__file__ ))
1313MAIN_DIR = os .path .dirname (os .path .dirname (DIR ))
1414
15+ PKGCONFIG = """\
16+ prefix=${{pcfiledir}}/../../
17+ includedir=${{prefix}}/include
18+
19+ Name: pybind11
20+ Description: Seamless operability between C++11 and Python
21+ Version: {VERSION}
22+ Cflags: -I${{includedir}}
23+ """
24+
1525
1626main_headers = {
1727 "include/pybind11/attr.h" ,
5969 "share/cmake/pybind11/pybind11Tools.cmake" ,
6070}
6171
72+ pkgconfig_files = {
73+ "share/pkgconfig/pybind11.pc" ,
74+ }
75+
6276py_files = {
6377 "__init__.py" ,
6478 "__main__.py" ,
6983}
7084
7185headers = main_headers | detail_headers | stl_headers
72- src_files = headers | cmake_files
86+ src_files = headers | cmake_files | pkgconfig_files
7387all_files = src_files | py_files
7488
7589
8296 "pybind11/share" ,
8397 "pybind11/share/cmake" ,
8498 "pybind11/share/cmake/pybind11" ,
99+ "pybind11/share/pkgconfig" ,
85100 "pyproject.toml" ,
86101 "setup.cfg" ,
87102 "setup.py" ,
101116}
102117
103118
119+ def read_tz_file (tar : tarfile .TarFile , name : str ) -> bytes :
120+ start = tar .getnames ()[0 ] + "/"
121+ inner_file = tar .extractfile (tar .getmember (f"{ start } { name } " ))
122+ assert inner_file
123+ with contextlib .closing (inner_file ) as f :
124+ return f .read ()
125+
126+
127+ def normalize_line_endings (value : bytes ) -> bytes :
128+ return value .replace (os .linesep .encode ("utf-8" ), b"\n " )
129+
130+
104131def test_build_sdist (monkeypatch , tmpdir ):
105132
106133 monkeypatch .chdir (MAIN_DIR )
107134
108- out = subprocess .check_output (
109- [
110- sys .executable ,
111- "-m" ,
112- "build" ,
113- "--sdist" ,
114- "--outdir" ,
115- str (tmpdir ),
116- ]
135+ subprocess .run (
136+ [sys .executable , "-m" , "build" , "--sdist" , f"--outdir={ tmpdir } " ], check = True
117137 )
118- if hasattr (out , "decode" ):
119- out = out .decode ()
120138
121139 (sdist ,) = tmpdir .visit ("*.tar.gz" )
122140
@@ -125,25 +143,17 @@ def test_build_sdist(monkeypatch, tmpdir):
125143 version = start [9 :- 1 ]
126144 simpler = {n .split ("/" , 1 )[- 1 ] for n in tar .getnames ()[1 :]}
127145
128- with contextlib .closing (
129- tar .extractfile (tar .getmember (start + "setup.py" ))
130- ) as f :
131- setup_py = f .read ()
132-
133- with contextlib .closing (
134- tar .extractfile (tar .getmember (start + "pyproject.toml" ))
135- ) as f :
136- pyproject_toml = f .read ()
137-
138- with contextlib .closing (
139- tar .extractfile (
140- tar .getmember (
141- start + "pybind11/share/cmake/pybind11/pybind11Config.cmake"
142- )
143- )
144- ) as f :
145- contents = f .read ().decode ("utf8" )
146- assert 'set(pybind11_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include")' in contents
146+ setup_py = read_tz_file (tar , "setup.py" )
147+ pyproject_toml = read_tz_file (tar , "pyproject.toml" )
148+ pkgconfig = read_tz_file (tar , "pybind11/share/pkgconfig/pybind11.pc" )
149+ cmake_cfg = read_tz_file (
150+ tar , "pybind11/share/cmake/pybind11/pybind11Config.cmake"
151+ )
152+
153+ assert (
154+ 'set(pybind11_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include")'
155+ in cmake_cfg .decode ("utf-8" )
156+ )
147157
148158 files = {f"pybind11/{ n } " for n in all_files }
149159 files |= sdist_files
@@ -154,51 +164,47 @@ def test_build_sdist(monkeypatch, tmpdir):
154164
155165 with open (os .path .join (MAIN_DIR , "tools" , "setup_main.py.in" ), "rb" ) as f :
156166 contents = (
157- string .Template (f .read ().decode ())
167+ string .Template (f .read ().decode ("utf-8" ))
158168 .substitute (version = version , extra_cmd = "" )
159- .encode ()
169+ .encode ("utf-8" )
160170 )
161171 assert setup_py == contents
162172
163173 with open (os .path .join (MAIN_DIR , "tools" , "pyproject.toml" ), "rb" ) as f :
164174 contents = f .read ()
165175 assert pyproject_toml == contents
166176
177+ simple_version = "." .join (version .split ("." )[:3 ])
178+ pkgconfig_expected = PKGCONFIG .format (VERSION = simple_version ).encode ("utf-8" )
179+ assert normalize_line_endings (pkgconfig ) == pkgconfig_expected
180+
167181
168182def test_build_global_dist (monkeypatch , tmpdir ):
169183
170184 monkeypatch .chdir (MAIN_DIR )
171185 monkeypatch .setenv ("PYBIND11_GLOBAL_SDIST" , "1" )
172- out = subprocess .check_output (
173- [
174- sys .executable ,
175- "-m" ,
176- "build" ,
177- "--sdist" ,
178- "--outdir" ,
179- str (tmpdir ),
180- ]
186+ subprocess .run (
187+ [sys .executable , "-m" , "build" , "--sdist" , "--outdir" , str (tmpdir )], check = True
181188 )
182189
183- if hasattr (out , "decode" ):
184- out = out .decode ()
185-
186190 (sdist ,) = tmpdir .visit ("*.tar.gz" )
187191
188192 with tarfile .open (str (sdist ), "r:gz" ) as tar :
189193 start = tar .getnames ()[0 ] + "/"
190194 version = start [16 :- 1 ]
191195 simpler = {n .split ("/" , 1 )[- 1 ] for n in tar .getnames ()[1 :]}
192196
193- with contextlib .closing (
194- tar .extractfile (tar .getmember (start + "setup.py" ))
195- ) as f :
196- setup_py = f .read ()
197+ setup_py = read_tz_file (tar , "setup.py" )
198+ pyproject_toml = read_tz_file (tar , "pyproject.toml" )
199+ pkgconfig = read_tz_file (tar , "pybind11/share/pkgconfig/pybind11.pc" )
200+ cmake_cfg = read_tz_file (
201+ tar , "pybind11/share/cmake/pybind11/pybind11Config.cmake"
202+ )
197203
198- with contextlib . closing (
199- tar . extractfile ( tar . getmember ( start + "pyproject.toml" ))
200- ) as f :
201- pyproject_toml = f . read ( )
204+ assert (
205+ 'set(pybind11_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include")'
206+ in cmake_cfg . decode ( "utf-8" )
207+ )
202208
203209 files = {f"pybind11/{ n } " for n in all_files }
204210 files |= sdist_files
@@ -209,20 +215,24 @@ def test_build_global_dist(monkeypatch, tmpdir):
209215 contents = (
210216 string .Template (f .read ().decode ())
211217 .substitute (version = version , extra_cmd = "" )
212- .encode ()
218+ .encode ("utf-8" )
213219 )
214220 assert setup_py == contents
215221
216222 with open (os .path .join (MAIN_DIR , "tools" , "pyproject.toml" ), "rb" ) as f :
217223 contents = f .read ()
218224 assert pyproject_toml == contents
219225
226+ simple_version = "." .join (version .split ("." )[:3 ])
227+ pkgconfig_expected = PKGCONFIG .format (VERSION = simple_version ).encode ("utf-8" )
228+ assert normalize_line_endings (pkgconfig ) == pkgconfig_expected
229+
220230
221231def tests_build_wheel (monkeypatch , tmpdir ):
222232 monkeypatch .chdir (MAIN_DIR )
223233
224- subprocess .check_output (
225- [sys .executable , "-m" , "pip" , "wheel" , "." , "-w" , str (tmpdir )]
234+ subprocess .run (
235+ [sys .executable , "-m" , "pip" , "wheel" , "." , "-w" , str (tmpdir )], check = True
226236 )
227237
228238 (wheel ,) = tmpdir .visit ("*.whl" )
@@ -249,8 +259,8 @@ def tests_build_global_wheel(monkeypatch, tmpdir):
249259 monkeypatch .chdir (MAIN_DIR )
250260 monkeypatch .setenv ("PYBIND11_GLOBAL_SDIST" , "1" )
251261
252- subprocess .check_output (
253- [sys .executable , "-m" , "pip" , "wheel" , "." , "-w" , str (tmpdir )]
262+ subprocess .run (
263+ [sys .executable , "-m" , "pip" , "wheel" , "." , "-w" , str (tmpdir )], check = True
254264 )
255265
256266 (wheel ,) = tmpdir .visit ("*.whl" )
0 commit comments