Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/srcdirs #3857

Merged
merged 4 commits into from Oct 28, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 5 additions & 3 deletions conans/client/generators/cmake.py
@@ -1,15 +1,16 @@
from conans.model import Generator
from conans.paths import BUILD_INFO_CMAKE
from conans.client.generators.cmake_common import cmake_dependency_vars,\
cmake_macros, generate_targets_section, cmake_dependencies, cmake_package_info,\
cmake_global_vars, cmake_user_info_vars, cmake_settings_info
from conans.model import Generator
from conans.paths import BUILD_INFO_CMAKE


class DepsCppCmake(object):
def __init__(self, cpp_info):
def join_paths(paths):
# Paths are doubled quoted, and escaped (but spaces)
return "\n\t\t\t".join('"%s"' % p.replace('\\', '/').replace('$', '\\$').replace('"', '\\"')
return "\n\t\t\t".join('"%s"'
% p.replace('\\', '/').replace('$', '\\$').replace('"', '\\"')
for p in paths)

def join_flags(separator, values):
Expand All @@ -28,6 +29,7 @@ def join_defines(values, prefix=""):
self.res_paths = join_paths(cpp_info.res_paths)
self.bin_paths = join_paths(cpp_info.bin_paths)
self.build_paths = join_paths(cpp_info.build_paths)
self.src_paths = join_paths(cpp_info.src_paths)

self.libs = join_flags(" ", cpp_info.libs)
self.defines = join_defines(cpp_info.defines, "-D")
Expand Down
7 changes: 5 additions & 2 deletions conans/client/generators/cmake_common.py
Expand Up @@ -3,6 +3,7 @@
set(CONAN_LIB_DIRS_{dep}{build_type} {deps.lib_paths})
set(CONAN_BIN_DIRS_{dep}{build_type} {deps.bin_paths})
set(CONAN_RES_DIRS_{dep}{build_type} {deps.res_paths})
set(CONAN_SRC_DIRS_{dep}{build_type} {deps.src_paths})
set(CONAN_BUILD_DIRS_{dep}{build_type} {deps.build_paths})
set(CONAN_LIBS_{dep}{build_type} {deps.libs})
set(CONAN_DEFINES_{dep}{build_type} {deps.defines})
Expand Down Expand Up @@ -41,7 +42,8 @@ def cmake_user_info_vars(deps_user_info):
lines = []
for dep, the_vars in deps_user_info.items():
for name, value in the_vars.vars.items():
lines.append('set(CONAN_USER_%s_%s %s)' % (dep.upper(), name, _cmake_string_representation(value)))
lines.append('set(CONAN_USER_%s_%s %s)'
% (dep.upper(), name, _cmake_string_representation(value)))
return "\n".join(lines)


Expand All @@ -64,7 +66,8 @@ def cmake_settings_info(settings):
for item in settings.items():
key, value = item
name = "CONAN_SETTINGS_%s" % key.upper().replace(".", "_")
settings_info += "set({key} {value})\n".format(key=name, value=_cmake_string_representation(value))
settings_info += "set({key} {value})\n".format(key=name,
value=_cmake_string_representation(value))
return settings_info


Expand Down
13 changes: 13 additions & 0 deletions conans/model/build_info.py
Expand Up @@ -16,6 +16,7 @@ class _CppInfo(object):
"""
def __init__(self):
self.includedirs = [] # Ordered list of include paths
self.srcdirs = [] # Ordered list of source paths
self.libdirs = [] # Directories to find libraries
self.resdirs = [] # Directories to find resources, data, etc
self.bindirs = [] # Directories to find executables and shared libs
Expand All @@ -34,6 +35,7 @@ def __init__(self):
self._bin_paths = None
self._build_paths = None
self._res_paths = None
self._src_paths = None
self.version = None # Version of the conan package
self.description = None # Description of the conan package

Expand All @@ -54,6 +56,12 @@ def lib_paths(self):
self._lib_paths = self._filter_paths(self.libdirs)
return self._lib_paths

@property
def src_paths(self):
if self._src_paths is None:
self._src_paths = self._filter_paths(self.srcdirs)
return self._src_paths

@property
def bin_paths(self):
if self._bin_paths is None:
Expand Down Expand Up @@ -117,6 +125,7 @@ def merge_lists(seq1, seq2):
return [s for s in seq1 if s not in seq2] + seq2

self.includedirs = merge_lists(self.includedirs, dep_cpp_info.include_paths)
self.srcdirs = merge_lists(self.srcdirs, dep_cpp_info.src_paths)
self.libdirs = merge_lists(self.libdirs, dep_cpp_info.lib_paths)
self.bindirs = merge_lists(self.bindirs, dep_cpp_info.bin_paths)
self.resdirs = merge_lists(self.resdirs, dep_cpp_info.res_paths)
Expand All @@ -142,6 +151,10 @@ def include_paths(self):
def lib_paths(self):
return self.libdirs

@property
def src_paths(self):
return self.srcdirs

@property
def bin_paths(self):
return self.bindirs
Expand Down
19 changes: 9 additions & 10 deletions conans/test/generators/cmake_test.py
@@ -1,18 +1,18 @@
import os
import re
import unittest
from collections import namedtuple

from conans.client.generators.cmake_multi import CMakeMultiGenerator
from conans.model.settings import Settings
from conans.model.conan_file import ConanFile
from collections import namedtuple
from conans.client.conf import default_settings_yml
from conans.client.generators.cmake import CMakeGenerator
from conans.client.generators.cmake_multi import CMakeMultiGenerator
from conans.model.build_info import CppInfo
from conans.model.conan_file import ConanFile
from conans.model.env_info import EnvValues
from conans.model.ref import ConanFileReference
from conans.client.conf import default_settings_yml
from conans.model.settings import Settings
from conans.test.utils.test_files import temp_folder
from conans.util.files import save
import os
from conans.model.env_info import EnvValues


class CMakeGeneratorTest(unittest.TestCase):
Expand Down Expand Up @@ -70,9 +70,8 @@ def paths_cmake_multi_user_vars_test(self):
def paths_cmake_test(self):
settings_mock = namedtuple("Settings", "build_type, os, os_build, constraint, items")
conanfile = ConanFile(None, None)
conanfile.initialize(settings_mock(None, None, None,
lambda x, raise_undefined_field: x,
lambda: {}), EnvValues())
conanfile.initialize(settings_mock(None, None, None, lambda x, raise_undefined_field: x,
lambda: {}), EnvValues())
ref = ConanFileReference.loads("MyPkg/0.1@lasote/stables")
tmp_folder = temp_folder()
save(os.path.join(tmp_folder, "lib", "mylib.lib"), "")
Expand Down
32 changes: 28 additions & 4 deletions conans/test/generators/generators_test.py
@@ -1,8 +1,11 @@
import os
import platform
import unittest

from conans.test.utils.tools import TestClient
from conans.util.files import load
from conans.model.ref import ConanFileReference
import re


class GeneratorsTest(unittest.TestCase):
Expand Down Expand Up @@ -38,18 +41,39 @@ def test_base(self):
client.save(files)
client.run("install . --build")

virtualenvFiles = ["activate.sh", "deactivate.sh"]
venv_files = ["activate.sh", "deactivate.sh"]
if platform.system() == "Windows":
virtualenvFiles.extend(["activate.bat", "deactivate.bat", "activate.ps1",
"deactivate.ps1"])
venv_files.extend(["activate.bat", "deactivate.bat", "activate.ps1",
"deactivate.ps1"])

self.assertEqual(sorted(['conanfile.txt', 'conaninfo.txt', 'conanbuildinfo.cmake',
'conanbuildinfo.gcc', 'conanbuildinfo.qbs', 'conanbuildinfo.pri',
'SConscript_conan', 'conanbuildinfo.txt', 'conanbuildinfo.props',
'conanbuildinfo.vsprops', 'conanbuildinfo.xcconfig',
'conan_ycm_flags.json', 'conan_ycm_extra_conf.py'] + virtualenvFiles),
'conan_ycm_flags.json', 'conan_ycm_extra_conf.py'] + venv_files),
sorted(os.listdir(client.current_folder)))

def test_srcdirs(self):
client = TestClient()
conanfile = """from conans import ConanFile
from conans.tools import save
import os
class TestConan(ConanFile):
def package(self):
save(os.path.join(self.package_folder, "src/file.h"), "//header")
def package_info(self):
self.cpp_info.srcdirs = ["src"]
"""

client.save({"conanfile.py": conanfile})
client.run("create . mysrc/0.1@user/testing")
client.run("install mysrc/0.1@user/testing -g cmake")

cmake = load(os.path.join(client.current_folder, "conanbuildinfo.cmake"))
src_dirs = re.search('set\(CONAN_SRC_DIRS_MYSRC "(.*)"\)', cmake).group(1)
self.assertIn("mysrc/0.1/user/testing/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/src",
src_dirs)

def test_qmake(self):
client = TestClient()
dep = """
Expand Down
5 changes: 3 additions & 2 deletions conans/test/integration/cmake_flags_test.py
@@ -1,11 +1,12 @@
import os
import platform
import unittest
import os

from nose.plugins.attrib import attr
from parameterized.parameterized import parameterized

from conans.model.version import Version
from conans.client.build.cmake import CMake
from conans.model.version import Version
from conans.test.utils.tools import TestClient


Expand Down