def test_bazeldeps_dependency_transitive(): # Create main ConanFile conanfile = ConanFile(Mock(), None) cpp_info = CppInfo("mypkg", "dummy_root_folder1") cpp_info.defines = ["DUMMY_DEFINE=\"string/value\""] cpp_info.system_libs = ["system_lib1"] cpp_info.libs = ["lib1"] # Create a ConanFile for a direct dependency conanfile_dep = ConanFile(Mock(), None) conanfile_dep.cpp_info = cpp_info conanfile_dep._conan_node = Mock() conanfile_dep._conan_node.ref = ConanFileReference.loads( "OriginalDepName/1.0") package_folder = temp_folder() save(os.path.join(package_folder, "lib", "liblib1.a"), "") conanfile_dep.folders.set_base_package(package_folder) # Add dependency on the direct dependency req = Requirement(ConanFileReference.loads("OriginalDepName/1.0")) conanfile._conan_dependencies = ConanFileDependencies( {req: ConanFileInterface(conanfile_dep)}) cpp_info_transitive = CppInfo("mypkg_t", "dummy_root_folder1") cpp_info_transitive.defines = ["DUMMY_DEFINE=\"string/value\""] cpp_info_transitive.system_libs = ["system_lib1"] cpp_info_transitive.libs = ["lib_t1"] # Create a ConanFile for a transitive dependency conanfile_dep_transitive = ConanFile(Mock(), None) conanfile_dep_transitive.cpp_info = cpp_info_transitive conanfile_dep_transitive._conan_node = Mock() conanfile_dep_transitive._conan_node.ref = ConanFileReference.loads( "TransitiveDepName/1.0") conanfile_dep_transitive.folders.set_base_package("/path/to/folder_dep_t") # Add dependency from the direct dependency to the transitive dependency req = Requirement(ConanFileReference.loads("TransitiveDepName/1.0")) conanfile_dep._conan_dependencies = ConanFileDependencies( {req: ConanFileInterface(conanfile_dep_transitive)}) bazeldeps = BazelDeps(conanfile) for dependency in bazeldeps._conanfile.dependencies.host.values(): dependency_content = bazeldeps._get_dependency_buildfile_content( dependency) assert 'cc_library(\n name = "OriginalDepName",' in dependency_content assert 'defines = ["DUMMY_DEFINE=\\\\\\"string/value\\\\\\""],' in dependency_content if platform.system() == "Windows": assert 'linkopts = ["/DEFAULTLIB:system_lib1"],' in dependency_content else: assert 'linkopts = ["-lsystem_lib1"],' in dependency_content # Ensure that transitive dependency is referenced by the 'deps' attribute of the direct # dependency assert re.search( r'deps =\s*\[\s*":lib1_precompiled",\s*"@TransitiveDepName"', dependency_content)
def cpp_info_system_libs_test(self): info1 = CppInfo("folder1") info1.system_libs = ["sysdep1"] info2 = CppInfo("folder2") info2.system_libs = ["sysdep2", "sysdep3"] deps_cpp_info = DepsCppInfo() deps_cpp_info.update(info1, "dep1") deps_cpp_info.update(info2, "dep2") self.assertEqual(["sysdep1", "sysdep2", "sysdep3"], deps_cpp_info.system_libs) self.assertEqual(["sysdep1"], deps_cpp_info["dep1"].system_libs) self.assertEqual(["sysdep2", "sysdep3"], deps_cpp_info["dep2"].system_libs)
def cpp_info_system_libs_test(self): info1 = CppInfo("dep1", "folder1") info1.system_libs = ["sysdep1"] info2 = CppInfo("dep2", "folder2") info2.system_libs = ["sysdep2", "sysdep3"] deps_cpp_info = DepsCppInfo() deps_cpp_info.add("dep1", DepCppInfo(info1)) deps_cpp_info.add("dep2", DepCppInfo(info2)) self.assertListEqual(["sysdep1", "sysdep2", "sysdep3"], list(deps_cpp_info.system_libs)) self.assertListEqual(["sysdep1"], list(deps_cpp_info["dep1"].system_libs)) self.assertListEqual(["sysdep2", "sysdep3"], list(deps_cpp_info["dep2"].system_libs))
def extend(cpp_info, config): """ adds the specific config configuration to the common one """ config_info = cpp_info.configs.get(config) if config_info: def add_lists(seq1, seq2): return seq1 + [s for s in seq2 if s not in seq1] result = CppInfo(str(config_info), config_info.rootpath) result.filter_empty = cpp_info.filter_empty result.includedirs = add_lists(cpp_info.includedirs, config_info.includedirs) result.libdirs = add_lists(cpp_info.libdirs, config_info.libdirs) result.bindirs = add_lists(cpp_info.bindirs, config_info.bindirs) result.resdirs = add_lists(cpp_info.resdirs, config_info.resdirs) result.builddirs = add_lists(cpp_info.builddirs, config_info.builddirs) result.libs = cpp_info.libs + config_info.libs result.defines = cpp_info.defines + config_info.defines result.cflags = cpp_info.cflags + config_info.cflags result.cxxflags = cpp_info.cxxflags + config_info.cxxflags result.sharedlinkflags = cpp_info.sharedlinkflags + config_info.sharedlinkflags result.exelinkflags = cpp_info.exelinkflags + config_info.exelinkflags result.system_libs = add_lists(cpp_info.system_libs, config_info.system_libs) result.build_modules = merge_dicts(cpp_info.build_modules, config_info.build_modules) return result return cpp_info
def test_bazeldeps_dependency_buildfiles(): conanfile = ConanFile(Mock(), None) cpp_info = CppInfo("mypkg", "dummy_root_folder1") cpp_info.defines = ["DUMMY_DEFINE=\"string/value\""] cpp_info.system_libs = ["system_lib1"] cpp_info.libs = ["lib1"] conanfile_dep = ConanFile(Mock(), None) conanfile_dep.cpp_info = cpp_info conanfile_dep._conan_node = Mock() conanfile_dep._conan_node.ref = ConanFileReference.loads( "OriginalDepName/1.0") conanfile_dep.package_folder = "/path/to/folder_dep" with mock.patch('conans.ConanFile.dependencies', new_callable=mock.PropertyMock) as mock_deps: req = Requirement(ConanFileReference.loads("OriginalDepName/1.0")) mock_deps.return_value = ConanFileDependencies( {req: ConanFileInterface(conanfile_dep)}) bazeldeps = BazelDeps(conanfile) for dependency in bazeldeps._conanfile.dependencies.host.values(): dependency_content = bazeldeps._get_dependency_buildfile_content( dependency) assert 'cc_library(\n name = "OriginalDepName",' in dependency_content assert 'defines = ["DUMMY_DEFINE=\'string/value\'"],' in dependency_content assert 'linkopts = ["-lsystem_lib1"],' in dependency_content assert 'deps = [\n \n ":lib1_precompiled",' in dependency_content
def system_frameworks_libs_test(self): # https://github.com/conan-io/conan/issues/7301 conanfile = ConanFile(TestBufferConanOutput(), None) conanfile.initialize(Settings({}), EnvValues()) cpp_info = CppInfo("MyPkg", "/rootpath") cpp_info.version = "0.1" cpp_info.libs = ["mypkg"] cpp_info.system_libs = ["pthread"] cpp_info.frameworks = ["cocoa"] cpp_info.frameworkdirs = ["frameworks"] cpp_info.filter_empty = False conanfile.deps_cpp_info.add("MyPkg", DepCppInfo(cpp_info)) generator = SConsGenerator(conanfile) content = generator.content scons_lines = content.splitlines() self.assertIn(' "LIBS" : [\'mypkg\', \'pthread\'],', scons_lines) self.assertIn(' "FRAMEWORKS" : [\'cocoa\'],', scons_lines) if platform.system() == "Windows": self.assertIn( ' "FRAMEWORKPATH" : [\'/rootpath\\\\frameworks\'],', scons_lines) else: self.assertIn( ' "FRAMEWORKPATH" : [\'/rootpath/frameworks\'],', scons_lines) self.assertIn(' "MyPkg_version" : "0.1",', scons_lines)
def get_cpp_info(name): cppinfo = CppInfo("{}/1.0".format(name), "/tmp/root") cppinfo.includedirs = [] cppinfo.includedirs.append("path/includes/{}".format(name)) cppinfo.includedirs.append("other\\include\\path\\{}".format(name)) # To test some path in win, to be used with MinGW make or MSYS etc cppinfo.libdirs = [] cppinfo.libdirs.append("one\\lib\\path\\{}".format(name)) cppinfo.libs = [] cppinfo.libs.append("{}_onelib".format(name)) cppinfo.libs.append("{}_twolib".format(name)) cppinfo.defines = [] cppinfo.defines.append("{}_onedefinition".format(name)) cppinfo.defines.append("{}_twodefinition".format(name)) cppinfo.cflags = ["{}_a_c_flag".format(name)] cppinfo.cxxflags = ["{}_a_cxx_flag".format(name)] cppinfo.sharedlinkflags = ["{}_shared_link_flag".format(name)] cppinfo.exelinkflags = ["{}_exe_link_flag".format(name)] cppinfo.sysroot = "/path/to/folder/{}".format(name) cppinfo.frameworks = [] cppinfo.frameworks.append("{}_oneframework".format(name)) cppinfo.frameworks.append("{}_twoframework".format(name)) cppinfo.system_libs = [] cppinfo.system_libs.append("{}_onesystemlib".format(name)) cppinfo.system_libs.append("{}_twosystemlib".format(name)) cppinfo.frameworkdirs = [] cppinfo.frameworkdirs.append("one/framework/path/{}".format(name)) return cppinfo
def setUp(self): self.tmp_folder1 = temp_folder() self.tmp_folder2 = temp_folder() save(os.path.join(self.tmp_folder1, "include1", "file.h"), "") save(os.path.join(self.tmp_folder2, "include2", "file.h"), "") save(os.path.join(self.tmp_folder1, "lib1", "file.a"), "") save(os.path.join(self.tmp_folder2, "lib2", "file.a"), "") save(os.path.join(self.tmp_folder1, "bin1", "file.bin"), "") save(os.path.join(self.tmp_folder2, "bin2", "file.bin"), "") self.conanfile = ConanFile(TestBufferConanOutput(), None) self.conanfile.initialize(Settings({}), EnvValues()) ref = ConanFileReference.loads("MyPkg1/0.1@lasote/stables") cpp_info = CppInfo(self.tmp_folder1) cpp_info.defines = ["MYDEFINE1"] cpp_info.includedirs = ['include1'] cpp_info.libdirs = ['lib1'] cpp_info.libs = ['libfoo'] cpp_info.system_libs = ['syslib1'] cpp_info.bindirs = ['bin1'] cpp_info.version = "0.1" cpp_info.cflags = ['-fPIC'] cpp_info.cxxflags = ['-fPIE'] cpp_info.sharedlinkflags = ['-framework Cocoa'] cpp_info.exelinkflags = ['-framework QuartzCore'] self.conanfile.deps_cpp_info.update(cpp_info, ref.name) ref = ConanFileReference.loads("MyPkg2/3.2.3@lasote/stables") cpp_info = CppInfo(self.tmp_folder2) cpp_info.defines = ["MYDEFINE2"] cpp_info.includedirs = ['include2'] cpp_info.libdirs = ['lib2'] cpp_info.libs = ['libbar'] cpp_info.system_libs = ['syslib2'] cpp_info.bindirs = ['bin2'] cpp_info.version = "3.2.3" cpp_info.cflags = ['-mtune=native'] cpp_info.cxxflags = ['-march=native'] cpp_info.sharedlinkflags = [ '-framework AudioFoundation', '-framework "Some Spaced Framework"' ] cpp_info.exelinkflags = [ '-framework VideoToolbox', '-framework "Other Spaced Framework"' ] self.conanfile.deps_cpp_info.update(cpp_info, ref.name)
def test_system_libs(self): # https://github.com/conan-io/conan/issues/7558 conanfile = ConanFile(TestBufferConanOutput(), None) conanfile.initialize(Settings({}), EnvValues()) cpp_info = CppInfo("MyPkg", "/rootpath") cpp_info.libs = ["mypkg"] cpp_info.system_libs = ["pthread"] conanfile.deps_cpp_info.add("MyPkg", DepCppInfo(cpp_info)) generator = QmakeGenerator(conanfile) content = generator.content qmake_lines = content.splitlines() self.assertIn('CONAN_LIBS += -lmypkg', qmake_lines) self.assertIn('CONAN_SYSTEMLIBS += -lpthread', qmake_lines)
def test_bazeldeps_get_lib_file_path_by_basename(): conanfile = ConanFile(Mock(), None) cpp_info = CppInfo("mypkg", "dummy_root_folder1") cpp_info.defines = ["DUMMY_DEFINE=\"string/value\""] cpp_info.system_libs = ["system_lib1"] cpp_info.libs = ["liblib1.a"] conanfile_dep = ConanFile(Mock(), None) conanfile_dep.cpp_info = cpp_info conanfile_dep._conan_node = Mock() conanfile_dep._conan_node.ref = ConanFileReference.loads( "OriginalDepName/1.0") package_folder = temp_folder() save(os.path.join(package_folder, "lib", "liblib1.a"), "") conanfile_dep.folders.set_base_package(package_folder) # FIXME: This will run infinite loop if conanfile.dependencies.host.topological_sort. # Move to integration test with mock.patch('conans.ConanFile.dependencies', new_callable=mock.PropertyMock) as mock_deps: req = Requirement(ConanFileReference.loads("OriginalDepName/1.0")) mock_deps.return_value = ConanFileDependencies( {req: ConanFileInterface(conanfile_dep)}) bazeldeps = BazelDeps(conanfile) for dependency in bazeldeps._conanfile.dependencies.host.values(): dependency_content = bazeldeps._get_dependency_buildfile_content( dependency) assert 'cc_library(\n name = "OriginalDepName",' in dependency_content assert """defines = ["DUMMY_DEFINE=\\\\\\"string/value\\\\\\""]""" in dependency_content if platform.system() == "Windows": assert 'linkopts = ["/DEFAULTLIB:system_lib1"]' in dependency_content else: assert 'linkopts = ["-lsystem_lib1"],' in dependency_content assert 'deps = [\n \n ":liblib1.a_precompiled",' in dependency_content
def variables_setup_test(self): tmp_folder1 = temp_folder() tmp_folder2 = temp_folder() save(os.path.join(tmp_folder1, "include1", "file.h"), "") save(os.path.join(tmp_folder2, "include2", "file.h"), "") save(os.path.join(tmp_folder1, "lib1", "file.a"), "") save(os.path.join(tmp_folder2, "lib2", "file.a"), "") save(os.path.join(tmp_folder1, "bin1", "file.bin"), "") save(os.path.join(tmp_folder2, "bin2", "file.bin"), "") save(os.path.join(tmp_folder1, "SystemFrameworks", "file.bin"), "") conanfile = ConanFile(TestBufferConanOutput(), None) conanfile.initialize(Settings({}), EnvValues()) ref = ConanFileReference.loads("MyPkg1/0.1@lasote/stables") cpp_info = CppInfo(ref.name, tmp_folder1) cpp_info.defines = ["MYDEFINE1"] cpp_info.includedirs = ['include1'] cpp_info.libdirs = ['lib1'] cpp_info.libs = ['libfoo'] cpp_info.bindirs = ['bin1'] cpp_info.version = "0.1" cpp_info.cflags = ['-fgimple'] cpp_info.cxxflags = ['-fdollars-in-identifiers'] cpp_info.sharedlinkflags = ['-framework Cocoa'] cpp_info.exelinkflags = ['-framework QuartzCore'] cpp_info.frameworks = ['AudioUnit'] cpp_info.frameworkdirs = ['SystemFrameworks'] cpp_info.system_libs = ["system_lib1"] conanfile.deps_cpp_info.add(ref.name, cpp_info) ref = ConanFileReference.loads("MyPkg2/3.2.3@lasote/stables") cpp_info = CppInfo(ref.name, tmp_folder2) cpp_info.defines = ["MYDEFINE2"] cpp_info.includedirs = ['include2'] cpp_info.libdirs = ['lib2'] cpp_info.libs = ['libbar'] cpp_info.bindirs = ['bin2'] cpp_info.version = "3.2.3" cpp_info.cflags = ['-fno-asm'] cpp_info.cxxflags = ['-pthread'] cpp_info.sharedlinkflags = ['-framework AudioFoundation'] cpp_info.exelinkflags = ['-framework VideoToolbox'] cpp_info.system_libs = ["system_lib2"] conanfile.deps_cpp_info.add(ref.name, cpp_info) generator = MakeGenerator(conanfile) content = generator.content content_template = """ CONAN_ROOT_MYPKG1 ?= \\ {conan_root_mypkg1} CONAN_SYSROOT_MYPKG1 ?= \\ CONAN_INCLUDE_DIRS_MYPKG1 += \\ {conan_include_dirs_mypkg1} CONAN_LIB_DIRS_MYPKG1 += \\ {conan_lib_dirs_mypkg1} CONAN_BIN_DIRS_MYPKG1 += \\ {conan_bin_dirs_mypkg1} CONAN_BUILD_DIRS_MYPKG1 += \\ {conan_build_dirs_mypkg1} CONAN_RES_DIRS_MYPKG1 += \\ CONAN_LIBS_MYPKG1 += \\ libfoo CONAN_SYSTEM_LIBS_MYPKG1 += \\ system_lib1 CONAN_DEFINES_MYPKG1 += \\ MYDEFINE1 CONAN_CFLAGS_MYPKG1 += \\ -fgimple CONAN_CXXFLAGS_MYPKG1 += \\ -fdollars-in-identifiers CONAN_SHAREDLINKFLAGS_MYPKG1 += \\ -framework Cocoa CONAN_EXELINKFLAGS_MYPKG1 += \\ -framework QuartzCore CONAN_FRAMEWORKS_MYPKG1 += \\ AudioUnit CONAN_FRAMEWORK_PATHS_MYPKG1 += \\ {conan_framework_dirs_mypkg1} CONAN_ROOT_MYPKG2 ?= \\ {conan_root_mypkg2} CONAN_SYSROOT_MYPKG2 ?= \\ CONAN_INCLUDE_DIRS_MYPKG2 += \\ {conan_include_dirs_mypkg2} CONAN_LIB_DIRS_MYPKG2 += \\ {conan_lib_dirs_mypkg2} CONAN_BIN_DIRS_MYPKG2 += \\ {conan_bin_dirs_mypkg2} CONAN_BUILD_DIRS_MYPKG2 += \\ {conan_build_dirs_mypkg2} CONAN_RES_DIRS_MYPKG2 += \\ CONAN_LIBS_MYPKG2 += \\ libbar CONAN_SYSTEM_LIBS_MYPKG2 += \\ system_lib2 CONAN_DEFINES_MYPKG2 += \\ MYDEFINE2 CONAN_CFLAGS_MYPKG2 += \\ -fno-asm CONAN_CXXFLAGS_MYPKG2 += \\ -pthread CONAN_SHAREDLINKFLAGS_MYPKG2 += \\ -framework AudioFoundation CONAN_EXELINKFLAGS_MYPKG2 += \\ -framework VideoToolbox CONAN_FRAMEWORKS_MYPKG2 += \\ CONAN_FRAMEWORK_PATHS_MYPKG2 += \\ CONAN_ROOTPATH += \\ $(CONAN_ROOTPATH_MYPKG1) \\ $(CONAN_ROOTPATH_MYPKG2) CONAN_SYSROOT += \\ $(CONAN_SYSROOT_MYPKG1) \\ $(CONAN_SYSROOT_MYPKG2) CONAN_INCLUDE_DIRS += \\ $(CONAN_INCLUDE_DIRS_MYPKG1) \\ $(CONAN_INCLUDE_DIRS_MYPKG2) CONAN_LIB_DIRS += \\ $(CONAN_LIB_DIRS_MYPKG1) \\ $(CONAN_LIB_DIRS_MYPKG2) CONAN_BIN_DIRS += \\ $(CONAN_BIN_DIRS_MYPKG1) \\ $(CONAN_BIN_DIRS_MYPKG2) CONAN_BUILD_DIRS += \\ $(CONAN_BUILD_DIRS_MYPKG1) \\ $(CONAN_BUILD_DIRS_MYPKG2) CONAN_RES_DIRS += \\ $(CONAN_RES_DIRS_MYPKG1) \\ $(CONAN_RES_DIRS_MYPKG2) CONAN_LIBS += \\ $(CONAN_LIBS_MYPKG1) \\ $(CONAN_LIBS_MYPKG2) CONAN_DEFINES += \\ $(CONAN_DEFINES_MYPKG1) \\ $(CONAN_DEFINES_MYPKG2) CONAN_CFLAGS += \\ $(CONAN_CFLAGS_MYPKG1) \\ $(CONAN_CFLAGS_MYPKG2) CONAN_CXXFLAGS += \\ $(CONAN_CXXFLAGS_MYPKG1) \\ $(CONAN_CXXFLAGS_MYPKG2) CONAN_SHAREDLINKFLAGS += \\ $(CONAN_SHAREDLINKFLAGS_MYPKG1) \\ $(CONAN_SHAREDLINKFLAGS_MYPKG2) CONAN_EXELINKFLAGS += \\ $(CONAN_EXELINKFLAGS_MYPKG1) \\ $(CONAN_EXELINKFLAGS_MYPKG2) CONAN_FRAMEWORKS += \\ $(CONAN_FRAMEWORKS_MYPKG1) \\ $(CONAN_FRAMEWORKS_MYPKG2) CONAN_FRAMEWORK_PATHS += \\ $(CONAN_FRAMEWORK_PATHS_MYPKG1) \\ $(CONAN_FRAMEWORK_PATHS_MYPKG2) """ root1 = tmp_folder1.replace('\\', '/') root2 = tmp_folder2.replace('\\', '/') inc1 = os.path.join(tmp_folder1, 'include1').replace('\\', '/') inc2 = os.path.join(tmp_folder2, 'include2').replace('\\', '/') lib1 = os.path.join(tmp_folder1, 'lib1').replace('\\', '/') lib2 = os.path.join(tmp_folder2, 'lib2').replace('\\', '/') bin1 = os.path.join(tmp_folder1, 'bin1').replace('\\', '/') bin2 = os.path.join(tmp_folder2, 'bin2').replace('\\', '/') expected_content = content_template.format( conan_root_mypkg1=root1, conan_include_dirs_mypkg1=inc1, conan_lib_dirs_mypkg1=lib1, conan_bin_dirs_mypkg1=bin1, conan_build_dirs_mypkg1=root1 + "/", conan_root_mypkg2=root2, conan_include_dirs_mypkg2=inc2, conan_lib_dirs_mypkg2=lib2, conan_bin_dirs_mypkg2=bin2, conan_build_dirs_mypkg2=root2 + "/", conan_framework_dirs_mypkg1=root1 + "/SystemFrameworks") self.maxDiff = None self.assertIn(expected_content, content)