@@ -1164,3 +1164,85 @@ def generate(self):
1164
1164
preset = "conan-default" if platform .system () == "Windows" else "conan-release"
1165
1165
c .run_command (f"cmake --preset { preset } " )
1166
1166
assert "Performing Test IT_COMPILES - Success" in c .out
1167
+
1168
+
1169
+ class TestCMakeComponents :
1170
+
1171
+ @pytest .mark .tool ("cmake" )
1172
+ @pytest .mark .parametrize ("components, found" , [("comp1" , True ), ("compX" , False )])
1173
+ def test_components (self , components , found ):
1174
+ c = TestClient ()
1175
+ dep = textwrap .dedent ("""
1176
+ from conan import ConanFile
1177
+ class Pkg(ConanFile):
1178
+ name = "dep"
1179
+ version = "0.1"
1180
+ def package_info(self):
1181
+ self.cpp_info.set_property("cmake_components", ["comp1", "comp2"])
1182
+ """ )
1183
+ c .save ({"conanfile.py" : dep })
1184
+ c .run ("create ." )
1185
+
1186
+ consumer = textwrap .dedent ("""
1187
+ from conan import ConanFile
1188
+ from conan.tools.cmake import CMake
1189
+ class PkgConan(ConanFile):
1190
+ settings = "os", "arch", "compiler", "build_type"
1191
+ requires = "dep/0.1"
1192
+ generators = "CMakeToolchain", "CMakeDeps"
1193
+ def build(self):
1194
+ deps = CMake(self)
1195
+ deps.configure()
1196
+ """ )
1197
+
1198
+ cmakelist = textwrap .dedent (f"""\
1199
+ cmake_minimum_required(VERSION 3.15)
1200
+ project(Hello LANGUAGES NONE)
1201
+
1202
+ find_package(dep CONFIG REQUIRED COMPONENTS { components } )
1203
+ """ )
1204
+
1205
+ c .save ({"conanfile.py" : consumer ,
1206
+ "CMakeLists.txt" : cmakelist }, clean_first = True )
1207
+ c .run (f"build . -c tools.cmake.cmakedeps:new={ new_value } " , assert_error = not found )
1208
+ if not found :
1209
+ assert f"Conan: Error: 'dep' required COMPONENT '{ components } ' not found" in c .out
1210
+
1211
+ def test_components_default_definition (self ):
1212
+ c = TestClient ()
1213
+ dep = textwrap .dedent ("""
1214
+ from conan import ConanFile
1215
+ class Pkg(ConanFile):
1216
+ name = "dep"
1217
+ version = "0.1"
1218
+ def package_info(self):
1219
+ # private component that should be skipped
1220
+ self.cpp_info.components["_private"].includedirs = ["include"]
1221
+ self.cpp_info.components["c1"].set_property("cmake_target_name", "MyC1")
1222
+ self.cpp_info.components["c2"].set_property("cmake_target_name", "Dep::MyC2")
1223
+ self.cpp_info.components["c3"].includedirs = ["include"]
1224
+ """ )
1225
+ c .save ({"conanfile.py" : dep })
1226
+ c .run ("create ." )
1227
+ c .run (f"install --requires=dep/0.1 -g CMakeDeps -c tools.cmake.cmakedeps:new={ new_value } " )
1228
+ cmake = c .load ("dep-config.cmake" )
1229
+ assert 'set(dep_PACKAGE_PROVIDED_COMPONENTS MyC1 MyC2 c3)' in cmake
1230
+
1231
+ def test_components_individual_names (self ):
1232
+ c = TestClient ()
1233
+ dep = textwrap .dedent ("""
1234
+ from conan import ConanFile
1235
+ class Pkg(ConanFile):
1236
+ name = "dep"
1237
+ version = "0.1"
1238
+ def package_info(self):
1239
+ self.cpp_info.components["c1"].set_property("cmake_target_name", "MyC1")
1240
+ self.cpp_info.components["c1"].set_property("cmake_components", ["MyCompC1"])
1241
+ self.cpp_info.components["c2"].set_property("cmake_target_name", "Dep::MyC2")
1242
+ self.cpp_info.components["c3"].includedirs = ["include"]
1243
+ """ )
1244
+ c .save ({"conanfile.py" : dep })
1245
+ c .run ("create ." )
1246
+ c .run (f"install --requires=dep/0.1 -g CMakeDeps -c tools.cmake.cmakedeps:new={ new_value } " )
1247
+ cmake = c .load ("dep-config.cmake" )
1248
+ assert 'set(dep_PACKAGE_PROVIDED_COMPONENTS MyCompC1 MyC2 c3)' in cmake
0 commit comments