def user_profile_test(self): conanfile = ConanFile(TestBufferConanOutput(), None) conanfile.initialize(Settings({}), EnvValues()) ref = ConanFileReference.loads("MyPkg/0.1@user/testing") tmp_folder = temp_folder() pkg1 = os.path.join(tmp_folder, "pkg1") cpp_info = CppInfo(pkg1) cpp_info.includedirs = ["include"] save(os.path.join(pkg1, "include", "file.h"), "") conanfile.deps_cpp_info.update(cpp_info, ref.name) ref = ConanFileReference.loads("My.Fancy-Pkg_2/0.1@user/testing") pkg2 = os.path.join(tmp_folder, "pkg2") cpp_info = CppInfo(pkg2) cpp_info.includedirs = ["include"] save(os.path.join(pkg2, "include", "file.h"), "") conanfile.deps_cpp_info.update(cpp_info, ref.name) generator = VisualStudioGenerator(conanfile) path1 = os.path.join("$(USERPROFILE)", "pkg1", "include") path2 = os.path.join("$(USERPROFILE)", "pkg2", "include") expected1 = "<ConanIncludeDirectories>%s;%s;" % (path1, path2) expected2 = "<AdditionalIncludeDirectories>$(ConanIncludeDirectories)%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>" with tools.environment_append({"USERPROFILE": tmp_folder}): content = generator.content xml.etree.ElementTree.fromstring(content) self.assertIn(expected1, content) self.assertIn(expected2, content) with tools.environment_append({"USERPROFILE": tmp_folder.upper()}): content = generator.content xml.etree.ElementTree.fromstring(content) self.assertIn(expected1, content) self.assertIn(expected2, content)
def user_profile_test(self): conanfile = ConanFile(None, None) conanfile.initialize(Settings({}), EnvValues()) ref = ConanFileReference.loads("MyPkg/0.1@user/testing") tmp_folder = temp_folder() pkg1 = os.path.join(tmp_folder, "pkg1") cpp_info = CppInfo(pkg1) cpp_info.includedirs = ["include"] save(os.path.join(pkg1, "include/file.h"), "") conanfile.deps_cpp_info.update(cpp_info, ref.name) ref = ConanFileReference.loads("My.Fancy-Pkg_2/0.1@user/testing") pkg2 = os.path.join(tmp_folder, "pkg2") cpp_info = CppInfo(pkg2) cpp_info.includedirs = ["include"] save(os.path.join(pkg2, "include/file.h"), "") conanfile.deps_cpp_info.update(cpp_info, ref.name) generator = VisualStudioGenerator(conanfile) with tools.environment_append({"USERPROFILE": tmp_folder}): content = generator.content xml.etree.ElementTree.fromstring(content) self.assertIn("<AdditionalIncludeDirectories>$(USERPROFILE)/pkg1/include;" "$(USERPROFILE)/pkg2/include;", content) with tools.environment_append({"USERPROFILE": tmp_folder.upper()}): content = generator.content xml.etree.ElementTree.fromstring(content) self.assertIn("<AdditionalIncludeDirectories>$(USERPROFILE)/pkg1/include;" "$(USERPROFILE)/pkg2/include;", content)
def content(self): vs_settings = _VSSettings(self.conanfile.settings) condition = vs_settings.condition name_current = vs_settings.filename name_multi = "conanbuildinfo_multi.props" # read the exising mult_filename or use the template if it doesn't exist multi_path = os.path.join(self.output_path, name_multi) if os.path.isfile(multi_path): content_multi = load(multi_path) else: content_multi = self.multi_content_template # parse the multi_file and add a new import statement if needed dom = minidom.parseString(content_multi) import_group = dom.getElementsByTagName('ImportGroup')[0] children = import_group.getElementsByTagName("Import") for node in children: if name_current == node.getAttribute("Project") and condition == node.getAttribute("Condition"): # the import statement already exists break else: # create a new import statement import_node = dom.createElement('Import') import_node.setAttribute('Condition', condition) import_node.setAttribute('Project', name_current) # add it to the import group import_group.appendChild(import_node) content_multi = dom.toprettyxml() content_multi = "\n".join(line for line in content_multi.splitlines() if line.strip()) return {name_multi: content_multi, vs_settings.filename: VisualStudioGenerator(self.conanfile).content}
def _createInfo(self): conanfile = ConanFile(None, None, Settings({}), None) ref = ConanFileReference.loads("MyPkg/0.1@user/testing") cpp_info = CppInfo("dummy_root_folder1") conanfile.deps_cpp_info.update(cpp_info, ref) ref = ConanFileReference.loads("MyPkg2/0.1@user/testing") cpp_info = CppInfo("dummy_root_folder2") conanfile.deps_cpp_info.update(cpp_info, ref) generator = VisualStudioGenerator(conanfile) return generator.content
def validate_additional_dependencies(lib, additional_dep): conanfile = ConanFile(TestBufferConanOutput(), None) conanfile.initialize(Settings({}), EnvValues()) ref = ConanFileReference.loads("MyPkg/0.1@user/testing") cpp_info = CppInfo("dummy_root_folder1") cpp_info.libs = [lib] conanfile.deps_cpp_info.update(cpp_info, ref.name) generator = VisualStudioGenerator(conanfile) self.assertIn( "<AdditionalDependencies>" "{};%(AdditionalDependencies)" "</AdditionalDependencies>".format(additional_dep), generator.content)
def validate_additional_dependencies(lib, additional_dep): conanfile = ConanFile(Mock(), None) conanfile.initialize(Settings({}), EnvValues()) ref = ConanFileReference.loads("MyPkg/0.1@user/testing") cpp_info = CppInfo(ref.name, "dummy_root_folder1") cpp_info.libs = [lib] conanfile.deps_cpp_info.add(ref.name, cpp_info) generator = VisualStudioGenerator(conanfile) content = generator.content self.assertIn( "<ConanLibraries>%s;</ConanLibraries>" % additional_dep, content) self.assertIn( "<AdditionalDependencies>" "$(ConanLibraries)%(AdditionalDependencies)" "</AdditionalDependencies>", content)
def valid_xml_test(self): conanfile = ConanFile(None, None) conanfile.initialize(Settings({}), EnvValues()) ref = ConanFileReference.loads("MyPkg/0.1@user/testing") cpp_info = CppInfo("dummy_root_folder1") conanfile.deps_cpp_info.update(cpp_info, ref.name) ref = ConanFileReference.loads("My.Fancy-Pkg_2/0.1@user/testing") cpp_info = CppInfo("dummy_root_folder2") conanfile.deps_cpp_info.update(cpp_info, ref.name) generator = VisualStudioGenerator(conanfile) content = generator.content xml.etree.ElementTree.fromstring(content) self.assertIn('<PropertyGroup Label="Conan-RootDirs">', content) self.assertIn("<Conan-MyPkg-Root>dummy_root_folder1</Conan-MyPkg-Root>", content) self.assertIn("<Conan-My-Fancy-Pkg_2-Root>dummy_root_folder2</Conan-My-Fancy-Pkg_2-Root>", content)
def content(self): configuration = str(self.conanfile.settings.build_type) platform = { 'x86': 'Win32', 'x86_64': 'x64' }.get(str(self.conanfile.settings.arch)) vsversion = str(self.settings.compiler.version) # there is also ClCompile.RuntimeLibrary, but it's handling is a bit complicated, so skipping for now condition = " '$(Configuration)' == '%s' And '$(Platform)' == '%s' And '$(VisualStudioVersion)' == '%s' "\ % (configuration, platform, vsversion + '.0') name_multi = 'conanbuildinfo_multi.props' name_current = ('conanbuildinfo_%s_%s_%s.props' % (configuration, platform, vsversion)).lower() multi_path = os.path.join(self.output_path, name_multi) if os.path.isfile(multi_path): content_multi = load(multi_path) else: content_multi = self.template dom = minidom.parseString(content_multi) import_node = dom.createElement('Import') import_node.setAttribute('Condition', condition) import_node.setAttribute('Project', name_current) import_group = dom.getElementsByTagName('ImportGroup')[0] children = import_group.getElementsByTagName("Import") for node in children: if name_current == node.getAttribute( "Project") and condition == node.getAttribute("Condition"): break else: import_group.appendChild(import_node) content_multi = dom.toprettyxml() content_multi = "\n".join(line for line in content_multi.splitlines() if line.strip()) vs_generator = VisualStudioGenerator(self.conanfile) content_current = vs_generator.content return {name_multi: content_multi, name_current: content_current}
def multi_config_test(self): tmp_folder = temp_folder() ref = ConanFileReference.loads("MyPkg/0.1@lasote/stables") conanfile = ConanFile(TestBufferConanOutput(), None) conanfile.initialize(Settings({}), EnvValues()) cpp_info = CppInfo(tmp_folder) cpp_info.defines = ["_WIN32_WINNT=x0501"] cpp_info.debug.defines = ["_DEBUG", "DEBUG"] cpp_info.release.defines = ["NDEBUG"] cpp_info.custom.defines = ["CUSTOM_BUILD"] conanfile.deps_cpp_info.update(cpp_info, ref.name) generator = VisualStudioGenerator(conanfile) content = generator.content defines_common = "<ConanPreprocessorDefinitions>" \ "_WIN32_WINNT=x0501;" \ "</ConanPreprocessorDefinitions>" defines_debug = "<ConanPreprocessorDefinitions>" \ "_DEBUG;DEBUG;" \ "</ConanPreprocessorDefinitions>" defines_release = "<ConanPreprocessorDefinitions>" \ "NDEBUG;" \ "</ConanPreprocessorDefinitions>" defines_custom = "<ConanPreprocessorDefinitions>" \ "CUSTOM_BUILD;" \ "</ConanPreprocessorDefinitions>" defines_always = "<PreprocessorDefinitions>$(ConanPreprocessorDefinitions)%(PreprocessorDefinitions)</PreprocessorDefinitions>" self.assertIn(defines_common, content) self.assertIn(defines_debug, content) self.assertIn(defines_release, content) self.assertIn(defines_custom, content) self.assertIn(defines_always, content) condition_debug = "<ItemDefinitionGroup Condition=\"'$(Configuration)' == 'debug'\">" condition_release = "<ItemDefinitionGroup Condition=\"'$(Configuration)' == 'release'\">" condition_custom = "<ItemDefinitionGroup Condition=\"'$(Configuration)' == 'custom'\">" self.assertIn(condition_debug, content) self.assertIn(condition_release, content) self.assertIn(condition_custom, content)