From 65b337e46d50fd9422d89fcc7b4fb31ceaa1207a Mon Sep 17 00:00:00 2001 From: jgsogo Date: Fri, 4 Dec 2020 15:17:37 +0100 Subject: [PATCH 001/681] add known-bug --- creating_packages/define_abi_compatibility.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/creating_packages/define_abi_compatibility.rst b/creating_packages/define_abi_compatibility.rst index bf4424b3e9f8..2f5295274956 100644 --- a/creating_packages/define_abi_compatibility.rst +++ b/creating_packages/define_abi_compatibility.rst @@ -486,6 +486,14 @@ All the modes can be applied to all dependencies, or to individual ones: ``my_lib/1.4.5`` will still produce ``my_lib/1.Y.Z`` and thus the same package-id. The indirect, transitive dependency doesn't affect the package-id at all. +.. important:: + + **Known-bug**: Package ID mode ``semver_direct_mode`` takes into account the options of transitive requirements. + It means that modifying the options of any transitive requirement will modify the computed package ID, and also + adding/removing a transitive requirement will modify the computed package ID (this happens even if the added/removed + requirement doesn't have any option). + + - ``semver_mode()``: In this mode, only a major release version (starting from **1.0.0**) changes the package ID. Every version change prior to 1.0.0 changes the package ID, but only major changes after 1.0.0 will be applied. From 707c019366f0609e9c129eadb994ad576ee5cfc8 Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 15 Dec 2020 12:37:44 +0100 Subject: [PATCH 002/681] release 1.32.1 --- .ci/publish.jenkins | 2 +- changelog.rst | 9 +++++++++ conf.py | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index 0f6df9906fb9..e87f3f2413fa 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,7 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ - 'release/1.32.0': '1.32', + 'release/1.32.1': '1.32', 'release/1.31.4': '1.31', 'release/1.30.2': '1.30', 'release/1.29.2': '1.29', diff --git a/changelog.rst b/changelog.rst index 861aa98cd6b2..647eea201410 100644 --- a/changelog.rst +++ b/changelog.rst @@ -21,6 +21,15 @@ Check https://github.com/conan-io/conan for issues and more details about develo Conan 1.32 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.32.1 (15-Dec-2020) +-------------------- + +- Bugfix: Avoid conflict of user custom generators names with new generators. `#8183 `_ +- Bugfix: Fix errors when using ``conan info --paths`` and ``short_paths=True`` in Windows, due to creation of empty folders in the short-paths storage. `#8181 `_ +- Bugfix: ``conan new /version -t`` wrong include when not using ``-s`` (using the hardcoded git repo). `#8175 `_ +- Bugfix: Fix ``excludes`` pattern case-insensitive in non Windows platforms. `#8155 `_ +- Bugfix: Enabling set_name, set_version for lockfile roo not location. `#8151 `_ + 1.32.0 (03-Dec-2020) -------------------- diff --git a/conf.py b/conf.py index 38b21a23c587..da40c22875f0 100644 --- a/conf.py +++ b/conf.py @@ -43,7 +43,7 @@ # The short X.Y version. version = "1.32" # The full version, including alpha/beta/rc tags. -release = u'1.32.0' +release = u'1.32.1' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): From 889b2c426f1d852c469418b933680e6a00b27e86 Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Sun, 20 Dec 2020 02:20:50 +0100 Subject: [PATCH 003/681] Docs for strip_root (#1967) --- reference/tools.rst | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/reference/tools.rst b/reference/tools.rst index 19bdd71a4e87..9e50d3c64d33 100644 --- a/reference/tools.rst +++ b/reference/tools.rst @@ -218,7 +218,7 @@ tools.unzip() .. code-block:: python - def unzip(filename, destination=".", keep_permissions=False, pattern=None) + def unzip(filename, destination=".", keep_permissions=False, pattern=None, strip_root=False) Function mainly used in ``source()``, but could be used in ``build()`` in special cases, as when retrieving pre-built binaries from the Internet. @@ -264,6 +264,9 @@ Parameters: the zip was created correctly. - **pattern** (Optional, Defaulted to ``None``): Extract from the archive only paths matching the pattern. This should be a Unix shell-style wildcard. See `fnmatch `_ documentation for more details. + - **strip_root** (Optional, Defaulted to ``False``): When ``True`` and the ZIP file contains one folder containing all the contents, + it will strip the root folder moving all its contents to the root. E.g: *mylib-1.2.8/main.c* will be extracted as *main.c*. If the compressed + file contains more than one folder or only a file it will raise a ``ConanException``. .. _tools_untargz: @@ -272,7 +275,7 @@ tools.untargz() .. code-block:: python - def untargz(filename, destination=".", pattern=None) + def untargz(filename, destination=".", pattern=None, strip_root=False) Extract *.tar.gz* files (or in the family). This is the function called by the previous ``unzip()`` for the matching extensions, so generally not needed to be called directly, call ``unzip()`` instead unless the file had a different extension. @@ -292,6 +295,10 @@ Parameters: - **destination** (Optional, Defaulted to ``"."``): Destination folder for *untargzed* files. - **pattern** (Optional, Defaulted to ``None``): Extract from the archive only paths matching the pattern. This should be a Unix shell-style wildcard. See `fnmatch `_ documentation for more details. + - **strip_root** (Optional, Defaulted to ``False``): When ``True`` and the ``tar.gz`` file contains one folder containing all the contents, + it will strip the root folder moving all its contents to the root. E.g: *mylib-1.2.8/main.c* will be extracted as *main.c*. If the compressed + file contains more than one folder or only a file it will raise a ``ConanException``. + .. _tools_get: @@ -302,7 +309,7 @@ tools.get() def get(url, md5='', sha1='', sha256='', destination=".", filename="", keep_permissions=False, pattern=None, requester=None, output=None, verify=True, retry=None, retry_wait=None, - overwrite=False, auth=None, headers=None) + overwrite=False, auth=None, headers=None, strip_root=False) Just a high level wrapper for download, unzip, and remove the temporary zip file once unzipped. You can pass hash checking parameters: ``md5``, ``sha1``, ``sha256``. All the specified algorithms will be checked. If any of them doesn't match, it will raise a @@ -338,6 +345,9 @@ Parameters: directly to the ``requests`` Python library. Check here other uses of the **auth** parameter: https://requests.readthedocs.io/en/master/user/authentication/#basic-authentication - **headers** (Optional, Defaulted to ``None``): A dictionary with additional headers. + - **strip_root** (Optional, Defaulted to ``False``): When ``True`` and the compressed file contains one folder containing all the contents, + it will strip the root folder moving all its contents to the root. E.g: *mylib-1.2.8/main.c* will be extracted as *main.c*. If the compressed + file contains more than one folder or only a file it will raise a ``ConanException``. .. _tools_get_env: From 0f993e9d10eafa2926b5f4e42a5a7e648ceb2065 Mon Sep 17 00:00:00 2001 From: memsharded Date: Mon, 21 Dec 2020 23:41:13 +0100 Subject: [PATCH 004/681] change boolean cmake.definitions --- howtos/cmake_install.rst | 2 +- reference/build_helpers/cmake.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/howtos/cmake_install.rst b/howtos/cmake_install.rst index e5352c029967..3ea3099741a2 100644 --- a/howtos/cmake_install.rst +++ b/howtos/cmake_install.rst @@ -18,7 +18,7 @@ in ``package()``, since these methods are called independently. def _configure_cmake(self): cmake = CMake(self) - cmake.definitions["SOME_DEFINITION"] = True + cmake.definitions["SOME_DEFINITION"] = "VALUE" cmake.configure() return cmake diff --git a/reference/build_helpers/cmake.rst b/reference/build_helpers/cmake.rst index f8d1a7a94bfe..ba8512759a63 100644 --- a/reference/build_helpers/cmake.rst +++ b/reference/build_helpers/cmake.rst @@ -271,7 +271,7 @@ ones: def build(self): cmake = CMake(self) cmake.definitions["CMAKE_SYSTEM_NAME"] = "Generic" - cmake.definitions["MY_CUSTOM_DEFINITION"] = True + cmake.definitions["MY_CUSTOM_DEFINITION"] = "OFF" cmake.configure() cmake.build() cmake.install() # Build --target=install From 294ee012ae0cf548e3446f9b31e1a6b85bb56ece Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 22 Dec 2020 22:55:38 +0100 Subject: [PATCH 005/681] fix docs about running from sources --- installation.rst | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/installation.rst b/installation.rst index 0f9042044ec3..8ae93cdac559 100644 --- a/installation.rst +++ b/installation.rst @@ -132,29 +132,16 @@ Install from source You can run Conan directly from source code. First, you need to install Python and pip. -Clone (or download and unzip) the git repository and install its requirements: +Clone (or download and unzip) the git repository and install it with: .. code-block:: bash - $ git clone https://github.com/conan-io/conan.git - $ cd conan - $ pip install -r conans/requirements.txt + # clone folder name matters, to avoid imports issues + $ git clone https://github.com/conan-io/conan.git conan_src + $ cd conan_src + $ pip install -e . -Create a script to run Conan and add it to your ``PATH``. - -.. code-block:: text - - #!/usr/bin/env python - - import sys - - conan_repo_path = "/home/your_user/conan" # ABSOLUTE PATH TO CONAN REPOSITORY FOLDER - - sys.path.append(conan_repo_path) - from conans.client.command import main - main(sys.argv[1:]) - -Test your ``conan`` script. +Test your ``conan`` installation. .. code-block:: bash From 74a7bb48bfff17901b973f67d5b37af9c8a11162 Mon Sep 17 00:00:00 2001 From: Florian Berchtold Date: Sun, 27 Dec 2020 12:37:27 +0100 Subject: [PATCH 006/681] Update check_conan_version_in_conanfile.rst (#1972) * Update check_conan_version_in_conanfile.rst * Apply suggestions from code review * Apply suggestions from code review --- howtos/check_conan_version_in_conanfile.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/howtos/check_conan_version_in_conanfile.rst b/howtos/check_conan_version_in_conanfile.rst index 28470c73cb40..1583394aebde 100644 --- a/howtos/check_conan_version_in_conanfile.rst +++ b/howtos/check_conan_version_in_conanfile.rst @@ -12,7 +12,7 @@ Let's have a look at a basic example of this: :caption: conanfile.py from conans import ConanFile, CMake, __version__ as conan_version - from conans.model.version import Version + from conans.tools import Version class MyLibraryConan(ConanFile): @@ -36,7 +36,7 @@ example: .. code-block:: python from conans import ConanFile, tools, __version__ as conan_version - from conans.model.version import Version + from conans.tools import Version class MyPackage(ConanFile): name = "package" From 47ca24b8e72e63a3e065428067e8f0d8b1cf0452 Mon Sep 17 00:00:00 2001 From: gerben90 Date: Thu, 7 Jan 2021 03:53:28 -0800 Subject: [PATCH 007/681] Change duplicate entry in cmake.rst (#1976) (#1977) --- reference/generators/cmake.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/generators/cmake.rst b/reference/generators/cmake.rst index 28747362d122..0db99db3a0fc 100644 --- a/reference/generators/cmake.rst +++ b/reference/generators/cmake.rst @@ -205,7 +205,7 @@ on your build environment (eg Linux vs Windows). conan_set_find_library_paths() ++++++++++++++++++++++++++++++ -Sets ``CMAKE_INCLUDE_PATH`` and ``CMAKE_INCLUDE_PATH``. +Sets ``CMAKE_INCLUDE_PATH`` and ``CMAKE_LIBRARY_PATH``. conan_global_flags() ++++++++++++++++++++ From 77804266c803286f0078c075efd75ef25a351c29 Mon Sep 17 00:00:00 2001 From: jgsogo Date: Tue, 12 Jan 2021 18:32:47 +0100 Subject: [PATCH 008/681] tools.download - file is removed if checksum doesn't match --- reference/tools.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/tools.rst b/reference/tools.rst index 9e50d3c64d33..b7a5a985e0c6 100644 --- a/reference/tools.rst +++ b/reference/tools.rst @@ -399,7 +399,7 @@ Retrieves a file from a given URL into a file with a given filename. It uses cer downloads, but this can be optionally disabled. You can pass hash checking parameters: ``md5``, ``sha1``, ``sha256``. All the specified algorithms will be checked. -If any of them doesn't match, it will raise a ``ConanException``. +If any of them doesn't match, the downloaded file will be removed and it will raise a ``ConanException``. .. code-block:: python From 08873fedd988f857305c149977d52a481603fb1d Mon Sep 17 00:00:00 2001 From: SSE4 Date: Wed, 13 Jan 2021 01:17:09 +0700 Subject: [PATCH 009/681] - docs for os.sdk (apple) Signed-off-by: SSE4 --- reference/config_files/settings.yml.rst | 4 ++++ reference/tools.rst | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index f46483075882..b761f332318c 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -31,14 +31,18 @@ are possible. These are the **default** values, but it is possible to customize Linux: Macos: version: [None, "10.6", "10.7", "10.8", "10.9", "10.10", "10.11", "10.12", "10.13", "10.14", "10.15", "11.0"] + sdk: [None, "MacOSX"] Android: api_level: ANY iOS: version: ["7.0", "7.1", "8.0", "8.1", "8.2", "8.3", "9.0", "9.1", "9.2", "9.3", "10.0", "10.1", "10.2", "10.3", "11.0", "11.1", "11.2", "11.3", "11.4", "12.0", "12.1", "12.2", "12.3", "12.4", "13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6"] + sdk: [None, "iPhoneOS", "iPhoneSimulator"] watchOS: version: ["4.0", "4.1", "4.2", "4.3", "5.0", "5.1", "5.2", "5.3", "6.0", "6.1"] + sdk: [None, "watchOS", "watchSimulator"] tvOS: version: ["11.0", "11.1", "11.2", "11.3", "11.4", "12.0", "12.1", "12.2", "12.3", "12.4", "13.0"] + sdk: [None, "AppleTVOS", "AppleTVSimulator"] FreeBSD: SunOS: AIX: diff --git a/reference/tools.rst b/reference/tools.rst index 9e50d3c64d33..1f9947ea823c 100644 --- a/reference/tools.rst +++ b/reference/tools.rst @@ -1595,6 +1595,8 @@ tools.apple_sdk_name() def apple_sdk_name(settings) Returns proper SDK name suitable for OS and architecture you are building for (considering simulators). +If ``self.settings.os.sdk`` setting is defined, it is used, otherwise the function tries to auto-detect based on +``self.settings.os`` and ``self.settings.arch``. Parameters: - **settings** (Required): Conanfile settings. @@ -1623,13 +1625,15 @@ tools.apple_deployment_target_flag() .. code-block:: python - def apple_deployment_target_flag(os_, os_version) + def apple_deployment_target_flag(os_, os_version, os_sdk=None, arch=None) Compiler flag name which controls deployment target. For example: ``-mappletvos-version-min=9.0`` Parameters: - **os_** (Required): OS of the settings. Usually ``self.settings.os``. - - **os_version** (Required): OS version. + - **os_version** (Required): OS version. Usually ``self.settings.os.version``. + - **os_sdk** (Optional, Defaulted to ``None``): OS SDK. Usually ``self.settings.os.sdk``. Otherwise, check :command:`xcodebuild -sdk -version`. for available SDKs. + - **arch** (Optional, Defaulted to ``None``): Architecture of the settings. Usually ``self.settings.arch``. .. _tools_xcrun: From 01d54ba8074bdd90b11b2a15ada4f97e7f805e73 Mon Sep 17 00:00:00 2001 From: SSE4 Date: Wed, 13 Jan 2021 01:28:40 +0700 Subject: [PATCH 010/681] - add e2k (Elbrus) architectures Signed-off-by: SSE4 --- reference/config_files/settings.yml.rst | 26 ++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index f46483075882..edf035d94c34 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -10,12 +10,12 @@ are possible. These are the **default** values, but it is possible to customize # Only for cross building, 'os_build/arch_build' is the system that runs Conan os_build: [Windows, WindowsStore, Linux, Macos, FreeBSD, SunOS, AIX] - arch_build: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, sh4le] + arch_build: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, sh4le, e2k-v2, e2k-v3, e2k-v4, e2k-v5, e2k-v6, e2k-v7] # Only for building cross compilation tools, 'os_target/arch_target' is the system for # which the tools generate code os_target: [Windows, Linux, Macos, Android, iOS, watchOS, tvOS, FreeBSD, SunOS, AIX, Arduino, Neutrino] - arch_target: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, asm.js, wasm, sh4le] + arch_target: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, asm.js, wasm, sh4le, e2k-v2, e2k-v3, e2k-v4, e2k-v5, e2k-v6, e2k-v7] # Rest of the settings are "host" settings: # - For native building/cross building: Where the library/program will run. @@ -47,7 +47,7 @@ are possible. These are the **default** values, but it is possible to customize Emscripten: Neutrino: version: ["6.4", "6.5", "6.6", "7.0"] - arch: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv4, armv4i, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, asm.js, wasm, sh4le] + arch: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv4, armv4i, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, asm.js, wasm, sh4le, e2k-v2, e2k-v3, e2k-v4, e2k-v5, e2k-v6, e2k-v7] compiler: sun-cc: version: ["5.10", "5.11", "5.12", "5.13", "5.14"] @@ -99,6 +99,13 @@ are possible. These are the **default** values, but it is possible to customize qcc: version: ["4.4", "5.4"] libcxx: [cxx, gpp, cpp, cpp-ne, accp, acpp-ne, ecpp, ecpp-ne] + mcst-lcc: + version: ["1.19", "1.20", "1.21", "1.22", "1.23", "1.24", "1.25"] + base: + gcc: + <<: *gcc + threads: [None] + exceptions: [None] build_type: [None, Debug, Release, RelWithDebInfo, MinSizeRel] cppstd: [None, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20] # Deprecated, use compiler.cppstd @@ -182,6 +189,19 @@ Here you can find a brief explanation of each of the architectures defined as `` - **sh4le**: The Hitachi SH-4 SuperH architecture. +- **e2k-v2**: The Elbrus 2000 v2 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 2CM, Elbrus 2C+ CPUs) originally developed by MCST (Moscow Center of SPARC Technologies). + +- **e2k-v3**: The Elbrus 2000 v3 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 2S (aka Elbrus 4C) CPU) originally developed by MCST (Moscow Center of SPARC Technologies). + +- **e2k-v4**: The Elbrus 2000 v4 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 8C, Elbrus 8C1, Elbrus 1C+ and Elbrus 1CK CPUs) originally developed by MCST (Moscow Center of SPARC Technologies). + +- **e2k-v5**: The Elbrus 2000 v5 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 8C2 (aka Elbrus 8CB) CPU) originally developed by MCST (Moscow Center of SPARC Technologies). + +- **e2k-v6**: The Elbrus 2000 v6 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 2C3, Elbrus 12C, Elbrus 16C CPUs) originally developed by MCST (Moscow Center of SPARC Technologies). + +- **e2k-v7**: The Elbrus 2000 v7 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 32C CPU) originally developed by MCST (Moscow Center of SPARC Technologies). + + C++ standard libraries (aka compiler.libcxx) -------------------------------------------- From 920214ecee2374eb62d6a2953a51c6bd0195bd4f Mon Sep 17 00:00:00 2001 From: SSE4 Date: Wed, 13 Jan 2021 01:44:39 +0700 Subject: [PATCH 011/681] Update reference/config_files/settings.yml.rst Co-authored-by: Carlos Zoido --- reference/config_files/settings.yml.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index edf035d94c34..8e08b147b186 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -197,7 +197,7 @@ Here you can find a brief explanation of each of the architectures defined as `` - **e2k-v5**: The Elbrus 2000 v5 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 8C2 (aka Elbrus 8CB) CPU) originally developed by MCST (Moscow Center of SPARC Technologies). -- **e2k-v6**: The Elbrus 2000 v6 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 2C3, Elbrus 12C, Elbrus 16C CPUs) originally developed by MCST (Moscow Center of SPARC Technologies). +- **e2k-v6**: The Elbrus 2000 v6 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 2C3, Elbrus 12C and Elbrus 16C CPUs) originally developed by MCST (Moscow Center of SPARC Technologies). - **e2k-v7**: The Elbrus 2000 v7 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 32C CPU) originally developed by MCST (Moscow Center of SPARC Technologies). From 635e47a4504d862f746dfb476941e54552ea4f6a Mon Sep 17 00:00:00 2001 From: SSE4 Date: Wed, 13 Jan 2021 01:44:49 +0700 Subject: [PATCH 012/681] Update reference/config_files/settings.yml.rst Co-authored-by: Carlos Zoido --- reference/config_files/settings.yml.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index 8e08b147b186..438b2b815992 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -195,7 +195,7 @@ Here you can find a brief explanation of each of the architectures defined as `` - **e2k-v4**: The Elbrus 2000 v4 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 8C, Elbrus 8C1, Elbrus 1C+ and Elbrus 1CK CPUs) originally developed by MCST (Moscow Center of SPARC Technologies). -- **e2k-v5**: The Elbrus 2000 v5 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 8C2 (aka Elbrus 8CB) CPU) originally developed by MCST (Moscow Center of SPARC Technologies). +- **e2k-v5**: The Elbrus 2000 v5 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 8C2 ,aka Elbrus 8CB, CPU) originally developed by MCST (Moscow Center of SPARC Technologies). - **e2k-v6**: The Elbrus 2000 v6 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 2C3, Elbrus 12C and Elbrus 16C CPUs) originally developed by MCST (Moscow Center of SPARC Technologies). From da22215bb843e5e87edea73bbfacc3df9b05a494 Mon Sep 17 00:00:00 2001 From: SSE4 Date: Wed, 13 Jan 2021 01:44:55 +0700 Subject: [PATCH 013/681] Update reference/config_files/settings.yml.rst Co-authored-by: Carlos Zoido --- reference/config_files/settings.yml.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index 438b2b815992..9e449098d228 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -191,7 +191,7 @@ Here you can find a brief explanation of each of the architectures defined as `` - **e2k-v2**: The Elbrus 2000 v2 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 2CM, Elbrus 2C+ CPUs) originally developed by MCST (Moscow Center of SPARC Technologies). -- **e2k-v3**: The Elbrus 2000 v3 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 2S (aka Elbrus 4C) CPU) originally developed by MCST (Moscow Center of SPARC Technologies). +- **e2k-v3**: The Elbrus 2000 v3 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 2S, aka Elbrus 4C, CPU) originally developed by MCST (Moscow Center of SPARC Technologies). - **e2k-v4**: The Elbrus 2000 v4 512 bit VLIW (Very Long Instruction Word) architecture (Elbrus 8C, Elbrus 8C1, Elbrus 1C+ and Elbrus 1CK CPUs) originally developed by MCST (Moscow Center of SPARC Technologies). From 9fbccc36e59b384dc66f3424fc7bb991089e7753 Mon Sep 17 00:00:00 2001 From: SSE4 Date: Wed, 13 Jan 2021 15:05:00 +0700 Subject: [PATCH 014/681] - update information about Android Signed-off-by: SSE4 --- systems_cross_building/cross_building.rst | 86 +++++------------------ 1 file changed, 16 insertions(+), 70 deletions(-) diff --git a/systems_cross_building/cross_building.rst b/systems_cross_building/cross_building.rst index db424188c0c2..1d7854d4efe3 100644 --- a/systems_cross_building/cross_building.rst +++ b/systems_cross_building/cross_building.rst @@ -551,95 +551,41 @@ Download the Android NDK `here `_ a If you are in Windows the process will be almost the same, but unzip the file in the root folder of your hard disk (``C:\``) to avoid issues with path lengths. -Now you have to build a `standalone toolchain `_. -We are going to target the "arm" architecture and the Android API level 21. Change the ``--install-dir`` to any other place that works -for you: - -.. code-block:: bash - - $ cd build/tools - $ python make_standalone_toolchain.py --arch=arm --api=21 --stl=libc++ --install-dir=/myfolder/arm_21_toolchain - - .. note:: - You can generate the standalone toolchain with several different options to target different architectures, API levels etc. - - Check the Android docs: `standalone toolchain `_ - + If you are using `Android Studio `_, you may use already available Android NDK To use the ``clang`` compiler, create a profile ``android_21_arm_clang``. Once again, the profile is very similar to the RPI one: .. code-block:: text - standalone_toolchain=/myfolder/arm_21_toolchain # Adjust this path - target_host=arm-linux-androideabi - cc_compiler=clang - cxx_compiler=clang++ - + include(default) + target_host=aarch64-linux-android + android_ndk=/Users/sse4/Library/Android/sdk/ndk-bundle # Adjust this path + api_level=21 [settings] + arch=armv8 + build_type=Release compiler=clang - compiler.version=5.0 compiler.libcxx=libc++ + compiler.version=9 os=Android - os.api_level=21 - arch=armv7 - build_type=Release - + os.api_level=$api_level + [build_requires] + [options] [env] - CONAN_CMAKE_FIND_ROOT_PATH=$standalone_toolchain - CONAN_CMAKE_SYSROOT=$standalone_toolchain/sysroot - PATH=[$standalone_toolchain/bin] + PATH=[$android_ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin] # Adjust this path CHOST=$target_host AR=$target_host-ar AS=$target_host-as RANLIB=$target_host-ranlib - CC=$target_host-$cc_compiler - CXX=$target_host-$cxx_compiler + CC=$target_host$api_level-clang + CXX=$target_host$api_level-clang++ LD=$target_host-ld STRIP=$target_host-strip - CFLAGS= -fPIE -fPIC -I$standalone_toolchain/include/c++/4.9.x - CXXFLAGS= -fPIE -fPIC -I$standalone_toolchain/include/c++/4.9.x - LDFLAGS= -pie - - -You could also use ``gcc`` using this profile ``arm_21_toolchain_gcc``, changing the ``cc_compiler`` and -``cxx_compiler`` variables, removing ``-fPIE`` flag and, of course, changing the ``[settings]`` to -match the gcc toolchain compiler: - - -.. code-block:: text + CONAN_CMAKE_TOOLCHAIN_FILE=$android_ndk/build/cmake/android.toolchain.cmake - standalone_toolchain=/myfolder/arm_21_toolchain - target_host=arm-linux-androideabi - cc_compiler=gcc - cxx_compiler=g++ - - [settings] - compiler=gcc - compiler.version=4.9 - compiler.libcxx=libstdc++ - os=Android - os.api_level=21 - arch=armv7 - build_type=Release - - [env] - CONAN_CMAKE_FIND_ROOT_PATH=$standalone_toolchain - CONAN_CMAKE_SYSROOT=$standalone_toolchain/sysroot - PATH=[$standalone_toolchain/bin] - CHOST=$target_host - AR=$target_host-ar - AS=$target_host-as - RANLIB=$target_host-ranlib - CC=$target_host-$cc_compiler - CXX=$target_host-$cxx_compiler - LD=$target_host-ld - STRIP=$target_host-strip - CFLAGS= -fPIC -I$standalone_toolchain/include/c++/4.9.x - CXXFLAGS= -fPIC -I$standalone_toolchain/include/c++/4.9.x - LDFLAGS= - Clone, for example, the zlib library to try to build it to Android @@ -651,7 +597,7 @@ match the gcc toolchain compiler: .. code-block:: bash - $ cd conan-zlib && conan create . --profile=../android_21_arm_clang + $ cd conan-zlib && conan create . -pr:h ../android_21_arm_clang -pr:b default ... -- Build files have been written to: /tmp/conan-zlib/test_package/build/ba0b9dbae0576b9a23ce7005180b00e4fdef1198 From 7969a3dd2032352aaa2f50469f4f518eeb514396 Mon Sep 17 00:00:00 2001 From: SSE4 Date: Wed, 13 Jan 2021 19:58:28 +0700 Subject: [PATCH 015/681] Update settings.yml.rst --- reference/config_files/settings.yml.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index b761f332318c..6c1b690c6cd2 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -31,18 +31,18 @@ are possible. These are the **default** values, but it is possible to customize Linux: Macos: version: [None, "10.6", "10.7", "10.8", "10.9", "10.10", "10.11", "10.12", "10.13", "10.14", "10.15", "11.0"] - sdk: [None, "MacOSX"] + sdk: [None, "macosx"] Android: api_level: ANY iOS: version: ["7.0", "7.1", "8.0", "8.1", "8.2", "8.3", "9.0", "9.1", "9.2", "9.3", "10.0", "10.1", "10.2", "10.3", "11.0", "11.1", "11.2", "11.3", "11.4", "12.0", "12.1", "12.2", "12.3", "12.4", "13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6"] - sdk: [None, "iPhoneOS", "iPhoneSimulator"] + sdk: [None, "iphoneos", "iphonesimulator"] watchOS: version: ["4.0", "4.1", "4.2", "4.3", "5.0", "5.1", "5.2", "5.3", "6.0", "6.1"] - sdk: [None, "watchOS", "watchSimulator"] + sdk: [None, "watchos", "watchsimulator"] tvOS: version: ["11.0", "11.1", "11.2", "11.3", "11.4", "12.0", "12.1", "12.2", "12.3", "12.4", "13.0"] - sdk: [None, "AppleTVOS", "AppleTVSimulator"] + sdk: [None, "appletvos", "appletvsimulator"] FreeBSD: SunOS: AIX: From d86750f3acdaa83e6f8513b753c74a25461dea7a Mon Sep 17 00:00:00 2001 From: SSE4 Date: Wed, 13 Jan 2021 14:34:27 +0700 Subject: [PATCH 016/681] - add Apple Catalyst Signed-off-by: SSE4 --- reference/config_files/settings.yml.rst | 5 +++++ reference/tools.rst | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index 6c1b690c6cd2..a734ccd322bb 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -31,7 +31,12 @@ are possible. These are the **default** values, but it is possible to customize Linux: Macos: version: [None, "10.6", "10.7", "10.8", "10.9", "10.10", "10.11", "10.12", "10.13", "10.14", "10.15", "11.0"] +<<<<<<< HEAD sdk: [None, "macosx"] +======= + sdk: [None, "MacOSX"] + subsystem: [None, "Catalyst"] +>>>>>>> 145c153cf... - add Apple Catalyst Android: api_level: ANY iOS: diff --git a/reference/tools.rst b/reference/tools.rst index 1f9947ea823c..df9e8f7bd1dc 100644 --- a/reference/tools.rst +++ b/reference/tools.rst @@ -1625,7 +1625,7 @@ tools.apple_deployment_target_flag() .. code-block:: python - def apple_deployment_target_flag(os_, os_version, os_sdk=None, arch=None) + def apple_deployment_target_flag(os_, os_version, os_sdk=None, os_subsystem=None, arch=None) Compiler flag name which controls deployment target. For example: ``-mappletvos-version-min=9.0`` @@ -1633,6 +1633,7 @@ Parameters: - **os_** (Required): OS of the settings. Usually ``self.settings.os``. - **os_version** (Required): OS version. Usually ``self.settings.os.version``. - **os_sdk** (Optional, Defaulted to ``None``): OS SDK. Usually ``self.settings.os.sdk``. Otherwise, check :command:`xcodebuild -sdk -version`. for available SDKs. + - **os_subsystem** Optional, Defaulted to ``None``): OS sybsystem. Usually ``self.settings.os.subsystem``. The only subsystem supported right now is Catalyst. - **arch** (Optional, Defaulted to ``None``): Architecture of the settings. Usually ``self.settings.arch``. .. _tools_xcrun: From cdbc575f506c538039fd8b93e4411a83001290ba Mon Sep 17 00:00:00 2001 From: SSE4 Date: Thu, 14 Jan 2021 12:21:35 +0700 Subject: [PATCH 017/681] Update settings.yml.rst --- reference/config_files/settings.yml.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index a734ccd322bb..56666d5036ce 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -31,12 +31,8 @@ are possible. These are the **default** values, but it is possible to customize Linux: Macos: version: [None, "10.6", "10.7", "10.8", "10.9", "10.10", "10.11", "10.12", "10.13", "10.14", "10.15", "11.0"] -<<<<<<< HEAD sdk: [None, "macosx"] -======= - sdk: [None, "MacOSX"] subsystem: [None, "Catalyst"] ->>>>>>> 145c153cf... - add Apple Catalyst Android: api_level: ANY iOS: From 39a83a0a5d5a66b3079be0ec21232ae3727b4378 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 14 Jan 2021 12:59:45 +0100 Subject: [PATCH 018/681] CMake build modules are injected right after the targets are created (#1944) --- reference/generators/cmake_find_package.rst | 5 +++-- reference/generators/cmake_find_package_multi.rst | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/reference/generators/cmake_find_package.rst b/reference/generators/cmake_find_package.rst index 66f15590940e..d4273a9cbd06 100644 --- a/reference/generators/cmake_find_package.rst +++ b/reference/generators/cmake_find_package.rst @@ -49,8 +49,9 @@ Being ```` the package name used in the reference (by default) or the | _FRAMEWORK_DIRS | Framework directories to perform the `find_library()` of _FRAMEWORKS | +------------------------------------+-----------------------------------------------------------------------------------------------------+ -This file uses `_BUILD_MODULES` values to include the files using the `include(...)` CMake directive. This makes functions or -utilities exported by the package available for consumers just by setting `find_package()` in the *CMakeLists.txt*. +This file uses `_BUILD_MODULES` values to include the files using the `include(...)` CMake directive after the targets are +created. This makes functions or utilities exported by the package available for consumers just by setting `find_package()` in the +*CMakeLists.txt*. Moreover, this also adjusts `CMAKE_MODULE_PATH` and `CMAKE_PREFIX_PATH` to the values declared by the package in ``cpp_info.buildirs``, so modules in those directories can be found. diff --git a/reference/generators/cmake_find_package_multi.rst b/reference/generators/cmake_find_package_multi.rst index 0d85dca924ef..3d7da21a838c 100644 --- a/reference/generators/cmake_find_package_multi.rst +++ b/reference/generators/cmake_find_package_multi.rst @@ -78,8 +78,8 @@ the ``Config.cmake``/``-config.cmake`` files: The ``CMAKE_PR ``CMAKE_MODULE_PATH`` is used by the ``find_dependency`` calls that locates the transitive dependencies. The *Targets-.cmake* files use `_BUILD_MODULES_` values to include the files using the `include(...)` CMake -directive. This makes functions or utilities exported by the package available for consumers just by setting `find_package()` in -the *CMakeLists.txt*. +directive after the targets are created. This makes functions or utilities exported by the package available for consumers just by setting +`find_package()` in the *CMakeLists.txt*. Moreover, this also adjusts `CMAKE_MODULE_PATH` and `CMAKE_PREFIX_PATH` to the values declared by the package in ``cpp_info.buildirs``, so modules in those directories can be found. From 935681d3d5362b666dd0a3fded0e342ad773ee90 Mon Sep 17 00:00:00 2001 From: danimtb Date: Mon, 18 Jan 2021 09:54:41 +0100 Subject: [PATCH 019/681] Update commands reference section --- commands_help_update.py | 26 +++++++++++------------ reference/commands/consumer/config.rst | 4 ++-- reference/commands/consumer/info.rst | 24 +++++++++++---------- reference/commands/consumer/install.rst | 21 +++++++++--------- reference/commands/creator/create.rst | 10 +++++---- reference/commands/creator/export-pkg.rst | 21 +++++++++--------- reference/commands/creator/export.rst | 13 ++++++------ reference/commands/creator/new.rst | 3 +-- reference/commands/creator/test.rst | 20 +++++++++-------- reference/commands/misc/lock.rst | 14 +++++++----- reference/commands/misc/remove.rst | 2 +- 11 files changed, 85 insertions(+), 73 deletions(-) diff --git a/commands_help_update.py b/commands_help_update.py index 835f06c67ebe..4cf63c196319 100644 --- a/commands_help_update.py +++ b/commands_help_update.py @@ -4,37 +4,37 @@ import sys folder = { + "install": "consumer", "config": "consumer", "get": "consumer", "info": "consumer", - "install": "consumer", "search": "consumer", + "new": "creator", "create": "creator", - "export-pkg": "creator", + "upload": "creator", "export": "creator", - "new": "creator", + "export-pkg": "creator", "test": "creator", - "upload": "creator", + "source": "development", "build": "development", "package": "development", - "source": "development", "editable": "development", "workspace": "development", - "alias": "misc", - "copy": "misc", - "download": "misc", - "help": "misc", - "imports": "misc", - "inspect": "misc", "profile": "misc", "remote": "misc", - "remove": "misc", "user": "misc", - "graph": "misc", + "imports": "misc", + "copy": "misc", + "remove": "misc", + "alias": "misc", + "download": "misc", + "inspect": "misc", + "help": "misc", + "lock": "misc", } experimental = ["inspect"] diff --git a/reference/commands/consumer/config.rst b/reference/commands/consumer/config.rst index dbcd7ecb4a71..8957d3879903 100644 --- a/reference/commands/consumer/config.rst +++ b/reference/commands/consumer/config.rst @@ -10,7 +10,7 @@ conan config .. code-block:: bash - $ conan config [-h] {get,home,install,rm,set} ... + $ conan config [-h] {get,home,install,rm,set,init} ... Manages Conan configuration. @@ -19,7 +19,7 @@ Used to edit conan.conf, or install config files. .. code-block:: text positional arguments: - {get,home,install,rm,set} + {get,home,install,rm,set,init} sub-command help get Get the value of configuration item home Retrieve the Conan home directory diff --git a/reference/commands/consumer/info.rst b/reference/commands/consumer/info.rst index f2b40c17ef60..c1372a55b58e 100644 --- a/reference/commands/consumer/info.rst +++ b/reference/commands/consumer/info.rst @@ -9,12 +9,12 @@ conan info $ conan info [-h] [--paths] [-bo BUILD_ORDER] [-g GRAPH] [-if INSTALL_FOLDER] [-j [JSON]] [-n ONLY] [--package-filter [PACKAGE_FILTER]] [-db [DRY_BUILD]] - [-b [BUILD]] [-r REMOTE] [-u] [-l [LOCKFILE]] [-e ENV_HOST] - [-e:b ENV_BUILD] [-e:h ENV_HOST] [-o OPTIONS_HOST] - [-o:b OPTIONS_BUILD] [-o:h OPTIONS_HOST] [-pr PROFILE_HOST] - [-pr:b PROFILE_BUILD] [-pr:h PROFILE_HOST] - [-s SETTINGS_HOST] [-s:b SETTINGS_BUILD] - [-s:h SETTINGS_HOST] + [-b [BUILD]] [-r REMOTE] [-u] [-l LOCKFILE] + [--lockfile-out LOCKFILE_OUT] [-e ENV_HOST] [-e:b ENV_BUILD] + [-e:h ENV_HOST] [-o OPTIONS_HOST] [-o:b OPTIONS_BUILD] + [-o:h OPTIONS_HOST] [-pr PROFILE_HOST] [-pr:b PROFILE_BUILD] + [-pr:h PROFILE_HOST] [-s SETTINGS_HOST] + [-s:b SETTINGS_BUILD] [-s:h SETTINGS_HOST] path_or_reference Gets information about the dependency graph of a recipe. @@ -53,8 +53,9 @@ your local cache. written -n ONLY, --only ONLY Show only the specified fields: "id", "build_id", "remote", "url", "license", "requires", "update", - "required", "date", "author", "description", "None". ' - --paths' information can also be filtered with options + "required", "date", "author", "description", + "provides", "deprecated", "None". '--paths' + information can also be filtered with options "export_folder", "build_folder", "package_folder", "source_folder". Use '--only None' to show only references. @@ -75,9 +76,10 @@ your local cache. remotes (a new version that satisfies a version range, a new revision or a newer recipe if not using revisions). - -l [LOCKFILE], --lockfile [LOCKFILE] - Path to a lockfile or folder containing 'conan.lock' - file. Lockfile can be updated if packages change + -l LOCKFILE, --lockfile LOCKFILE + Path to a lockfile + --lockfile-out LOCKFILE_OUT + Filename of the updated lockfile -e ENV_HOST, --env ENV_HOST Environment variables that will be set during the package build (host machine). e.g.: -e diff --git a/reference/commands/consumer/install.rst b/reference/commands/consumer/install.rst index a6b7a7f786ad..840c6adfb20c 100644 --- a/reference/commands/consumer/install.rst +++ b/reference/commands/consumer/install.rst @@ -9,12 +9,12 @@ conan install $ conan install [-h] [-g GENERATOR] [-if INSTALL_FOLDER] [-m [MANIFESTS]] [-mi [MANIFESTS_INTERACTIVE]] [-v [VERIFY]] [--no-imports] [-j JSON] [-b [BUILD]] [-r REMOTE] [-u] - [-l [LOCKFILE]] [--lockfile-out LOCKFILE_OUT] [-e ENV_HOST] [-e:b ENV_BUILD] - [-e:h ENV_HOST] [-o OPTIONS_HOST] [-o:b OPTIONS_BUILD] - [-o:h OPTIONS_HOST] [-pr PROFILE_HOST] - [-pr:b PROFILE_BUILD] [-pr:h PROFILE_HOST] - [-s SETTINGS_HOST] [-s:b SETTINGS_BUILD] - [-s:h SETTINGS_HOST] + [-l LOCKFILE] [--lockfile-out LOCKFILE_OUT] [-e ENV_HOST] + [-e:b ENV_BUILD] [-e:h ENV_HOST] [-o OPTIONS_HOST] + [-o:b OPTIONS_BUILD] [-o:h OPTIONS_HOST] + [-pr PROFILE_HOST] [-pr:b PROFILE_BUILD] + [-pr:h PROFILE_HOST] [-s SETTINGS_HOST] + [-s:b SETTINGS_BUILD] [-s:h SETTINGS_HOST] [--lockfile-node-id LOCKFILE_NODE_ID] path_or_reference [reference] @@ -94,9 +94,10 @@ generators. that satisfies the range. Also, if using revisions, it will update to the latest revision for the resolved version range. - -l [LOCKFILE], --lockfile [LOCKFILE] - Path to a lockfile or folder containing 'conan.lock' - file. Lockfile can be updated if packages change + -l LOCKFILE, --lockfile LOCKFILE + Path to a lockfile + --lockfile-out LOCKFILE_OUT + Filename of the updated lockfile -e ENV_HOST, --env ENV_HOST Environment variables that will be set during the package build (host machine). e.g.: -e @@ -134,7 +135,7 @@ generators. Settings to build the package, overwriting the defaults (host machine). e.g.: -s:h compiler=gcc --lockfile-node-id LOCKFILE_NODE_ID - NodeID of the referenced package in the lockfile + NodeID of the referenced package in the lockfile :command:`conan install` executes methods of a *conanfile.py* in the following order: diff --git a/reference/commands/creator/create.rst b/reference/commands/creator/create.rst index 61ef973461cc..c5f3428c2f00 100644 --- a/reference/commands/creator/create.rst +++ b/reference/commands/creator/create.rst @@ -13,7 +13,8 @@ conan create $ conan create [-h] [-j JSON] [-k] [-kb] [-ne] [-tbf TEST_BUILD_FOLDER] [-tf TEST_FOLDER] [--ignore-dirty] [-m [MANIFESTS]] [-mi [MANIFESTS_INTERACTIVE]] [-v [VERIFY]] [-b [BUILD]] - [-r REMOTE] [-u] [-l [LOCKFILE]] [-e ENV_HOST] + [-r REMOTE] [-u] [-l LOCKFILE] + [--lockfile-out LOCKFILE_OUT] [-e ENV_HOST] [-e:b ENV_BUILD] [-e:h ENV_HOST] [-o OPTIONS_HOST] [-o:b OPTIONS_BUILD] [-o:h OPTIONS_HOST] [-pr PROFILE_HOST] [-pr:b PROFILE_BUILD] @@ -99,9 +100,10 @@ to know more about 'test_folder' project. that satisfies the range. Also, if using revisions, it will update to the latest revision for the resolved version range. - -l [LOCKFILE], --lockfile [LOCKFILE] - Path to a lockfile or folder containing 'conan.lock' - file. Lockfile can be updated if packages change + -l LOCKFILE, --lockfile LOCKFILE + Path to a lockfile + --lockfile-out LOCKFILE_OUT + Filename of the updated lockfile -e ENV_HOST, --env ENV_HOST Environment variables that will be set during the package build (host machine). e.g.: -e diff --git a/reference/commands/creator/export-pkg.rst b/reference/commands/creator/export-pkg.rst index bae1e18519bb..a678c93f570a 100644 --- a/reference/commands/creator/export-pkg.rst +++ b/reference/commands/creator/export-pkg.rst @@ -8,12 +8,13 @@ conan export-pkg $ conan export-pkg [-h] [-bf BUILD_FOLDER] [-f] [-if INSTALL_FOLDER] [-pf PACKAGE_FOLDER] [-sf SOURCE_FOLDER] [-j JSON] - [-l [LOCKFILE]] [--ignore-dirty] [-e ENV_HOST] - [-e:b ENV_BUILD] [-e:h ENV_HOST] [-o OPTIONS_HOST] - [-o:b OPTIONS_BUILD] [-o:h OPTIONS_HOST] - [-pr PROFILE_HOST] [-pr:b PROFILE_BUILD] - [-pr:h PROFILE_HOST] [-s SETTINGS_HOST] - [-s:b SETTINGS_BUILD] [-s:h SETTINGS_HOST] + [-l LOCKFILE] [--lockfile-out LOCKFILE_OUT] + [--ignore-dirty] [-e ENV_HOST] [-e:b ENV_BUILD] + [-e:h ENV_HOST] [-o OPTIONS_HOST] [-o:b OPTIONS_BUILD] + [-o:h OPTIONS_HOST] [-pr PROFILE_HOST] + [-pr:b PROFILE_BUILD] [-pr:h PROFILE_HOST] + [-s SETTINGS_HOST] [-s:b SETTINGS_BUILD] + [-s:h SETTINGS_HOST] path [reference] Exports a recipe, then creates a package from local source and build folders. @@ -54,10 +55,10 @@ the binary package. directory can also be specified -j JSON, --json JSON Path to a json file where the install information will be written - -l [LOCKFILE], --lockfile [LOCKFILE] - Path to a lockfile or folder containing 'conan.lock' - file. Lockfile will be updated with the exported - package + -l LOCKFILE, --lockfile LOCKFILE + Path to a lockfile. + --lockfile-out LOCKFILE_OUT + Filename of the updated lockfile --ignore-dirty When using the "scm" feature with "auto" values, capture the revision and url even if there are uncommitted changes diff --git a/reference/commands/creator/export.rst b/reference/commands/creator/export.rst index c381a5f78c18..3c502e859655 100644 --- a/reference/commands/creator/export.rst +++ b/reference/commands/creator/export.rst @@ -6,7 +6,8 @@ conan export .. code-block:: bash - $ conan export [-h] [-k] [-l [LOCKFILE]] [--ignore-dirty] + $ conan export [-h] [-k] [-l LOCKFILE] [--lockfile-out LOCKFILE_OUT] + [--ignore-dirty] path [reference] Copies the recipe (conanfile.py & associated files) to your local cache. @@ -21,7 +22,7 @@ to any remote with the 'conan upload' command. path Path to a folder containing a conanfile.py or to a recipe file e.g., my_folder/conanfile.py reference user/channel, Pkg/version@user/channel (if name and - version are not declared in the conanfile.py) or + version are not declared in the conanfile.py) Pkg/version@ if user/channel is not relevant. optional arguments: @@ -30,10 +31,10 @@ to any remote with the 'conan upload' command. Do not remove the source folder in the local cache, even if the recipe changed. Use this for testing purposes only - -l [LOCKFILE], --lockfile [LOCKFILE] - Path to a lockfile or folder containing 'conan.lock' - file. Lockfile will be updated with the exported - package + -l LOCKFILE, --lockfile LOCKFILE + Path to a lockfile file. + --lockfile-out LOCKFILE_OUT + Filename of the updated lockfile --ignore-dirty When using the "scm" feature with "auto" values, capture the revision and url even if there are uncommitted changes diff --git a/reference/commands/creator/new.rst b/reference/commands/creator/new.rst index 2df442affc45..e8ba26bfde41 100644 --- a/reference/commands/creator/new.rst +++ b/reference/commands/creator/new.rst @@ -34,8 +34,7 @@ Creates a new package recipe template with a 'conanfile.py' and optionally, method. Useful in combination with "export-pkg" command -m TEMPLATE, --template TEMPLATE - Use the given template from the local cache for - conanfile.py + Use the given template to generate a conan project -cis, --ci-shared Package will have a "shared" option to be used in CI -cilg, --ci-travis-gcc Generate travis-ci files for linux gcc diff --git a/reference/commands/creator/test.rst b/reference/commands/creator/test.rst index 6b35f1cfc7e9..72f945c7b82e 100644 --- a/reference/commands/creator/test.rst +++ b/reference/commands/creator/test.rst @@ -7,11 +7,12 @@ conan test .. code-block:: bash $ conan test [-h] [-tbf TEST_BUILD_FOLDER] [-b [BUILD]] [-r REMOTE] [-u] - [-l [LOCKFILE]] [-e ENV_HOST] [-e:b ENV_BUILD] - [-e:h ENV_HOST] [-o OPTIONS_HOST] [-o:b OPTIONS_BUILD] - [-o:h OPTIONS_HOST] [-pr PROFILE_HOST] [-pr:b PROFILE_BUILD] - [-pr:h PROFILE_HOST] [-s SETTINGS_HOST] - [-s:b SETTINGS_BUILD] [-s:h SETTINGS_HOST] + [-l LOCKFILE] [--lockfile-out LOCKFILE_OUT] [-e ENV_HOST] + [-e:b ENV_BUILD] [-e:h ENV_HOST] [-o OPTIONS_HOST] + [-o:b OPTIONS_BUILD] [-o:h OPTIONS_HOST] [-pr PROFILE_HOST] + [-pr:b PROFILE_BUILD] [-pr:h PROFILE_HOST] + [-s SETTINGS_HOST] [-s:b SETTINGS_BUILD] + [-s:h SETTINGS_HOST] path reference Tests a package consuming it from a conanfile.py with a test() method. @@ -26,7 +27,7 @@ to be tested must exist in the local cache or any configured remote. positional arguments: path Path to the "testing" folder containing a conanfile.py - or to a recipe file with test() methode.g. conan + or to a recipe file with test() method e.g. conan test_package/conanfile.py pkg/version@user/channel reference pkg/version@user/channel of the package to be tested @@ -66,9 +67,10 @@ to be tested must exist in the local cache or any configured remote. that satisfies the range. Also, if using revisions, it will update to the latest revision for the resolved version range. - -l [LOCKFILE], --lockfile [LOCKFILE] - Path to a lockfile or folder containing 'conan.lock' - file. Lockfile can be updated if packages change + -l LOCKFILE, --lockfile LOCKFILE + Path to a lockfile + --lockfile-out LOCKFILE_OUT + Filename of the updated lockfile -e ENV_HOST, --env ENV_HOST Environment variables that will be set during the package build (host machine). e.g.: -e diff --git a/reference/commands/misc/lock.rst b/reference/commands/misc/lock.rst index fd49ff1b98b7..28daba64d6d7 100644 --- a/reference/commands/misc/lock.rst +++ b/reference/commands/misc/lock.rst @@ -1,7 +1,7 @@ .. _conan_lock: conan lock -=========== +========== .. code-block:: bash @@ -12,16 +12,20 @@ Generates and manipulates lock files. .. code-block:: text positional arguments: - {update,build-order,clean-modified,create} + {update,build-order,clean-modified,create} sub-command help - update Complete missing information in the first lockfile with information defined in the second lockfile. Both lockfiles must represent the same graph, - and have the same topology with the same identifiers, i.e. the second lockfile must be an evolution based on the first one + update Complete missing information in the first lockfile + with information defined in the second lockfile. Both + lockfiles must represent the same graph, and have the + same topology with the same identifiers, i.e. the + second lockfile must be an evolution based on the + first one build-order Returns build-order clean-modified Clean modified flags create Create a lockfile from a conanfile or a reference optional arguments: - -h, --help show this help message and exit + -h, --help show this help message and exit diff --git a/reference/commands/misc/remove.rst b/reference/commands/misc/remove.rst index 5ddff728d862..f95871f24759 100644 --- a/reference/commands/misc/remove.rst +++ b/reference/commands/misc/remove.rst @@ -31,7 +31,7 @@ by default in the local conan cache. -f, --force Remove without requesting a confirmation -l, --locks Remove locks -o, --outdated Remove only outdated from recipe packages. This flag - can only be used with a reference + can only be used with a pattern or a reference -p [PACKAGES [PACKAGES ...]], --packages [PACKAGES [PACKAGES ...]] Remove all packages of the specified reference if no specific package ID is provided From 73c22bd8b777a01a3c0288bdec3699a71875e87e Mon Sep 17 00:00:00 2001 From: Psy-Kai Date: Tue, 19 Jan 2021 10:15:12 +0100 Subject: [PATCH 020/681] Add documentation for qbs build helper and qbs toolchain (#1978) * Add documentation for qbs build helper * Add documentation for qbs toolchain * Add documentation for attributes of qbs build helper * Update reference/build_helpers/qbs.rst * Update reference/build_helpers/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Update creating_packages/toolchains/qbs.rst * Fixed copy & paste error * Removed project name to simplify line * Referenced rst files Co-authored-by: Daniel --- creating_packages/toolchains.rst | 1 + creating_packages/toolchains/qbs.rst | 66 +++++++++++ reference/build_helpers.rst | 3 +- reference/build_helpers/qbs.rst | 159 +++++++++++++++++++++++++++ 4 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 creating_packages/toolchains/qbs.rst create mode 100644 reference/build_helpers/qbs.rst diff --git a/creating_packages/toolchains.rst b/creating_packages/toolchains.rst index 43ebebcb4163..6fe7f0fb68b0 100644 --- a/creating_packages/toolchains.rst +++ b/creating_packages/toolchains.rst @@ -117,3 +117,4 @@ Built-in toolchains toolchains/make toolchains/meson toolchains/msbuild + toolchains/qbs diff --git a/creating_packages/toolchains/qbs.rst b/creating_packages/toolchains/qbs.rst new file mode 100644 index 000000000000..53a4e998bc12 --- /dev/null +++ b/creating_packages/toolchains/qbs.rst @@ -0,0 +1,66 @@ +.. _conan-qbs-toolchain: + +QbsToolchain +============== + +.. warning:: + + This is an **experimental** feature subject to breaking changes in future releases. + + +The ``QbsToolchain`` can be used in the ``generate()`` method: + + +.. code:: python + + from conans import ConanFile + from conan.tools.qbs import QbsToolchain + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + options = {"shared": [True, False]} + default_options = {"shared": False} + + def generate(self): + tc = QbsToolchain(self) + tc.generate() + + +The ``QbsToolchain`` will generate the following file during :command:`conan install` +command (or before calling the ``build()`` method when the package is being +built in the cache): *conan_toolchain.qbs*. This file will contain a qbs profile +named *conan_toolchain_profile*. + + +*conan_toolchain.qbs* will contain the definitions of all the Qbs properties +related to the Conan options and settings for the current package, platform, +etc. This includes the following: + + * Detection of compiler. + + * Based on the compiler set in environment variable ``CC``. + + * Uses detected system compiler based on Conan setting ``compiler`` if environment variable ``CC`` is not set. + +* Detection of compiler flags from environment (as defined at https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html): + + * ``ASFLAGS`` + + * ``CFLAGS`` + + * ``CPPFLAGS`` + + * ``CXXFLAGS`` + + * ``LDFLAGS`` + +* Detection of sysroot from environment. + +* Detection of ``build_type`` from Conan settings. + +* Detection of ``arch`` from Conan settings. + +* Detection of ``compiler.cxxstd`` from Conan settings. + +* Detection of ``fPIC`` based on the existence of such option in the recipe. diff --git a/reference/build_helpers.rst b/reference/build_helpers.rst index 4da2714a4908..db3340514ea8 100644 --- a/reference/build_helpers.rst +++ b/reference/build_helpers.rst @@ -16,8 +16,9 @@ Contents: build_helpers/visual_studio build_helpers/meson build_helpers/run_environment + build_helpers/qbs .. important:: If you need a build helper for any other tools, please check how you can create your own - :ref:`custom_build_helper`. \ No newline at end of file + :ref:`custom_build_helper`. diff --git a/reference/build_helpers/qbs.rst b/reference/build_helpers/qbs.rst new file mode 100644 index 000000000000..04e701faf9f9 --- /dev/null +++ b/reference/build_helpers/qbs.rst @@ -0,0 +1,159 @@ +.. _qbs_build_reference: + +Qbs +=== + +If you are using **Qbs** as your build system, you can use the **Qbs** build helper. + +.. code-block:: python + + from conans import ConanFile, tools, Qbs + import os + + class ConanFileToolsTest(ConanFile): + ... + + def build(self): + qbs = Qbs(self) + qbs.build() + +Constructor +----------- + +.. code-block:: python + + class Qbs(object): + + def __init__(self, conanfile, project_file=None) + +Parameters: + - **conanfile** (Required): Use ``self`` inside a ``conanfile.py``. + - **project_file** (Optional, Defaulted to ``None``): Path to the root project file. + +Attributes +---------- + +use_toolchain_profile ++++++++++++++++++++++ + +**Defaulted to**: ``conan_toolchain_profile`` + +Specifies the qbs profile to build the project for. + +jobs +++++ + +**Defaulted to**: ``tools.cpu_count()`` + +Specifies the number of concurrent build jobs. + +Methods +------- + +add_configuration() ++++++++++++++++++++ + +.. code-block:: python + + def add_configuration(self, name, values) + +Add a build configuration to use. + +Parameters: + - **name** (Required): Specifies build configuration name. + - **values** (Required): A dict of properties set for this build configuration. + + +build() ++++++++ + +.. code-block:: python + + def build(self, products=None) + +Build Qbs project. + +Parameters: + - **products** (Optional, Defaulted to ``None``): Specifies a list of products to build. If ``None`` build all products which have the qbs property ``buildByDefault`` set to ``true``. + + +build_all() ++++++++++++ + +.. code-block:: python + + def build_all(self) + +Build all products of Qbs project, even products which set the qbs property ``buildByDefault`` set to ``false`` + + +install() ++++++++++ + +.. code-block:: python + + def install(self) + +Install products. + + +Example +------- + +A typical usage of the Qbs build helper, if you want to be able to both execute :command:`conan create` and also build your package for a +library locally (in your user folder, not in the local cache), could be: + +.. code-block:: python + + from conans import ConanFile, Qbs + + class HelloConan(ConanFile): + name = "hello" + version = "0.1" + settings = "os", "compiler", "build_type", "arch" + generators = "qbs" + exports_sources = "src/*", "*.qbs" + no_copy_source = True + requires = "zlib/1.2.11" + + def build(self): + qbs = Qbs(self) + qbs.add_configuration("default", { + "project.conanBuildInfo", self.build_folder + "/conanbuildinfo.qbs" + }) + qbs.build() + + def package(self): + self.copy("*.h", dst="include", src="src") + self.copy("*.lib", dst="lib", keep_path=False) + self.copy("*.dll", dst="bin", keep_path=False) + self.copy("*.dylib*", dst="lib", keep_path=False) + self.copy("*.so", dst="lib", keep_path=False) + self.copy("*.a", dst="lib", keep_path=False) + + def package_info(self): + self.cpp_info.libs = ["hello"] + +Note the ``qbs`` generator, which generates the *conanbuildinfo.qbs* file, to process +dependencies information. Setting ``no_copy_source = True`` helps qbs to pick the right project file +and not get confused by the generated files. + +The *hello.qbs* could be as simple as: + +.. code-block:: text + + Project { + readonly property path conanBuildInfo + + references: conanBuildInfo + + DynamicLibrary { + name: "hello" + version: "0.1.0" + files: "src/hello.cpp" + cpp.cxxLanguageVersion: "c++11" + + Depends { name: "cpp" } + Depends { name: "zlib" } + } + } From 7a14d0e7644321b6048f53df6868a57f01a0e222 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 12:01:33 +0100 Subject: [PATCH 021/681] msvc --- integrations/build_system/cmake.rst | 8 +++++++- integrations/build_system/msbuild.rst | 21 +++++++-------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/integrations/build_system/cmake.rst b/integrations/build_system/cmake.rst index 58ad102a6d67..533274b8fb4b 100644 --- a/integrations/build_system/cmake.rst +++ b/integrations/build_system/cmake.rst @@ -1,10 +1,16 @@ -.. _cmake: +.. _cmake_integration: |cmake_logo| CMake ================== Conan can be integrated with CMake using generators, build helpers and custom *findXXX.cmake* files: +However, beware of some current CMake limitations, such as not dealing well with find-packages, because CMake doesn't know how to handle finding both debug and release packages. + +.. note:: + + If you want to use the Visual Studio 2017 + CMake integration, :ref:`check this how-to` + .. toctree:: :maxdepth: 2 diff --git a/integrations/build_system/msbuild.rst b/integrations/build_system/msbuild.rst index 8a89de4657a8..8b71b1ea2dcb 100644 --- a/integrations/build_system/msbuild.rst +++ b/integrations/build_system/msbuild.rst @@ -4,24 +4,17 @@ |visual_logo| MSBuild (Visual Studio) ===================================== -Conan can be integrated with **MSBuild**, the build system of Visual Studio in two different ways: +If you are using CMake to generate your Visual Studio projects, this is not the right section, go to :ref:`cmake_integration` instead. +This section is about native integration with Microsoft MSBuild, using properties files. -- Using the ``cmake`` generator to create a *conanbuildinfo.cmake* file. -- Using the ``visual_studio`` generator to create a *conanbuildinfo.props* file. +Conan can be integrated with **MSBuild** natively, the build system of Visual Studio in different ways: -With CMake ----------- -Use the ``cmake`` generator or ``cmake_multi`` if you are using CMake to machine-generate your Visual Studio projects. +- Using the ``conan.tools.microsoft`` tools: ``MSBuildDeps``, ``MSBuildToolchain`` and ``MSBuild`` helpers to generate properties + files for your project, containing information about the project dependencies and toolchain. This is the new integration that is + experimental but will become the standard one in Conan 2.0. Go to :ref:`conan.tools.microsoft` for more information. +- Using the ``visual_studio`` or ``visual_studio_multi`` generators to create a MSBuild properties *conanbuildinfo.props* file. -Check the :ref:`generators` section to read about the ``cmake`` generator. -Check the official `CMake docs`_ to find out more about generating Visual Studio projects with CMake. - -However, beware of some current CMake limitations, such as not dealing well with find-packages, because CMake doesn't know how to handle finding both debug and release packages. - -.. note:: - - If you want to use the Visual Studio 2017 + CMake integration, :ref:`check this how-to` With *visual_studio* generator ------------------------------ From 0fec635987ca39701f60c6ba98cea95c8d87b1d5 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 12:18:59 +0100 Subject: [PATCH 022/681] fixing qbs location --- creating_packages/toolchains/qbs.rst | 66 ----------- reference/build_helpers.rst | 1 - reference/conanfile/tools.rst | 1 + .../tools}/qbs.rst | 105 ++++++++++++++---- 4 files changed, 86 insertions(+), 87 deletions(-) delete mode 100644 creating_packages/toolchains/qbs.rst rename reference/{build_helpers => conanfile/tools}/qbs.rst (61%) diff --git a/creating_packages/toolchains/qbs.rst b/creating_packages/toolchains/qbs.rst deleted file mode 100644 index 53a4e998bc12..000000000000 --- a/creating_packages/toolchains/qbs.rst +++ /dev/null @@ -1,66 +0,0 @@ -.. _conan-qbs-toolchain: - -QbsToolchain -============== - -.. warning:: - - This is an **experimental** feature subject to breaking changes in future releases. - - -The ``QbsToolchain`` can be used in the ``generate()`` method: - - -.. code:: python - - from conans import ConanFile - from conan.tools.qbs import QbsToolchain - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - options = {"shared": [True, False]} - default_options = {"shared": False} - - def generate(self): - tc = QbsToolchain(self) - tc.generate() - - -The ``QbsToolchain`` will generate the following file during :command:`conan install` -command (or before calling the ``build()`` method when the package is being -built in the cache): *conan_toolchain.qbs*. This file will contain a qbs profile -named *conan_toolchain_profile*. - - -*conan_toolchain.qbs* will contain the definitions of all the Qbs properties -related to the Conan options and settings for the current package, platform, -etc. This includes the following: - - * Detection of compiler. - - * Based on the compiler set in environment variable ``CC``. - - * Uses detected system compiler based on Conan setting ``compiler`` if environment variable ``CC`` is not set. - -* Detection of compiler flags from environment (as defined at https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html): - - * ``ASFLAGS`` - - * ``CFLAGS`` - - * ``CPPFLAGS`` - - * ``CXXFLAGS`` - - * ``LDFLAGS`` - -* Detection of sysroot from environment. - -* Detection of ``build_type`` from Conan settings. - -* Detection of ``arch`` from Conan settings. - -* Detection of ``compiler.cxxstd`` from Conan settings. - -* Detection of ``fPIC`` based on the existence of such option in the recipe. diff --git a/reference/build_helpers.rst b/reference/build_helpers.rst index db3340514ea8..2f7e3a1c1618 100644 --- a/reference/build_helpers.rst +++ b/reference/build_helpers.rst @@ -16,7 +16,6 @@ Contents: build_helpers/visual_studio build_helpers/meson build_helpers/run_environment - build_helpers/qbs .. important:: diff --git a/reference/conanfile/tools.rst b/reference/conanfile/tools.rst index c7f009141862..ed78d1751b6f 100644 --- a/reference/conanfile/tools.rst +++ b/reference/conanfile/tools.rst @@ -37,4 +37,5 @@ Contents: tools/cmake tools/microsoft + tools/qbs diff --git a/reference/build_helpers/qbs.rst b/reference/conanfile/tools/qbs.rst similarity index 61% rename from reference/build_helpers/qbs.rst rename to reference/conanfile/tools/qbs.rst index 04e701faf9f9..447aeed1a945 100644 --- a/reference/build_helpers/qbs.rst +++ b/reference/conanfile/tools/qbs.rst @@ -1,14 +1,83 @@ -.. _qbs_build_reference: +.. _conan-qbs-toolchain: + +conan.tools.qbs +=============== + +QbsToolchain +------------ + +.. warning:: + + This is an **experimental** feature subject to breaking changes in future releases. + + +The ``QbsToolchain`` can be used in the ``generate()`` method: + + +.. code:: python + + from conans import ConanFile + from conan.tools.qbs import QbsToolchain + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + options = {"shared": [True, False]} + default_options = {"shared": False} + + def generate(self): + tc = QbsToolchain(self) + tc.generate() + + +The ``QbsToolchain`` will generate the following file during :command:`conan install` +command (or before calling the ``build()`` method when the package is being +built in the cache): *conan_toolchain.qbs*. This file will contain a qbs profile +named *conan_toolchain_profile*. + + +*conan_toolchain.qbs* will contain the definitions of all the Qbs properties +related to the Conan options and settings for the current package, platform, +etc. This includes the following: + + * Detection of compiler. + + * Based on the compiler set in environment variable ``CC``. + + * Uses detected system compiler based on Conan setting ``compiler`` if environment variable ``CC`` is not set. + +* Detection of compiler flags from environment (as defined at https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html): + + * ``ASFLAGS`` + + * ``CFLAGS`` + + * ``CPPFLAGS`` + + * ``CXXFLAGS`` + + * ``LDFLAGS`` + +* Detection of sysroot from environment. + +* Detection of ``build_type`` from Conan settings. + +* Detection of ``arch`` from Conan settings. + +* Detection of ``compiler.cxxstd`` from Conan settings. + +* Detection of ``fPIC`` based on the existence of such option in the recipe. + Qbs -=== +--- If you are using **Qbs** as your build system, you can use the **Qbs** build helper. .. code-block:: python - from conans import ConanFile, tools, Qbs - import os + from conans import ConanFile + from conan.tools.qbs import Qbs class ConanFileToolsTest(ConanFile): ... @@ -18,7 +87,7 @@ If you are using **Qbs** as your build system, you can use the **Qbs** build hel qbs.build() Constructor ------------ ++++++++++++ .. code-block:: python @@ -31,27 +100,21 @@ Parameters: - **project_file** (Optional, Defaulted to ``None``): Path to the root project file. Attributes ----------- +++++++++++ use_toolchain_profile -+++++++++++++++++++++ +********************* **Defaulted to**: ``conan_toolchain_profile`` Specifies the qbs profile to build the project for. -jobs -++++ - -**Defaulted to**: ``tools.cpu_count()`` - -Specifies the number of concurrent build jobs. Methods -------- ++++++++ add_configuration() -+++++++++++++++++++ +********************* .. code-block:: python @@ -65,7 +128,7 @@ Parameters: build() -+++++++ +********************* .. code-block:: python @@ -78,7 +141,7 @@ Parameters: build_all() -+++++++++++ +********************* .. code-block:: python @@ -88,7 +151,7 @@ Build all products of Qbs project, even products which set the qbs property ``bu install() -+++++++++ +********************* .. code-block:: python @@ -98,14 +161,16 @@ Install products. Example -------- +********************* A typical usage of the Qbs build helper, if you want to be able to both execute :command:`conan create` and also build your package for a library locally (in your user folder, not in the local cache), could be: .. code-block:: python - from conans import ConanFile, Qbs + from conans import ConanFile + from conan.tools.qbs import Qbs + class HelloConan(ConanFile): name = "hello" From e5a68fb458749dfd7f317d1ca4d464fced3af289 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 12:20:29 +0100 Subject: [PATCH 023/681] fix format --- reference/conanfile/tools/qbs.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reference/conanfile/tools/qbs.rst b/reference/conanfile/tools/qbs.rst index 447aeed1a945..cf3b4d526621 100644 --- a/reference/conanfile/tools/qbs.rst +++ b/reference/conanfile/tools/qbs.rst @@ -128,7 +128,7 @@ Parameters: build() -********************* +******* .. code-block:: python @@ -141,7 +141,7 @@ Parameters: build_all() -********************* +*********** .. code-block:: python @@ -151,7 +151,7 @@ Build all products of Qbs project, even products which set the qbs property ``bu install() -********************* +********* .. code-block:: python @@ -161,7 +161,7 @@ Install products. Example -********************* +******* A typical usage of the Qbs build helper, if you want to be able to both execute :command:`conan create` and also build your package for a library locally (in your user folder, not in the local cache), could be: From 1f8d89d5fe0c8ea5ac7cf89037d22874eb077e48 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 19 Jan 2021 12:50:04 +0100 Subject: [PATCH 024/681] fixing qbs location (#1990) * fixing qbs location * fix format --- creating_packages/toolchains/qbs.rst | 66 ----------- reference/build_helpers.rst | 1 - reference/conanfile/tools.rst | 1 + .../tools}/qbs.rst | 105 ++++++++++++++---- 4 files changed, 86 insertions(+), 87 deletions(-) delete mode 100644 creating_packages/toolchains/qbs.rst rename reference/{build_helpers => conanfile/tools}/qbs.rst (62%) diff --git a/creating_packages/toolchains/qbs.rst b/creating_packages/toolchains/qbs.rst deleted file mode 100644 index 53a4e998bc12..000000000000 --- a/creating_packages/toolchains/qbs.rst +++ /dev/null @@ -1,66 +0,0 @@ -.. _conan-qbs-toolchain: - -QbsToolchain -============== - -.. warning:: - - This is an **experimental** feature subject to breaking changes in future releases. - - -The ``QbsToolchain`` can be used in the ``generate()`` method: - - -.. code:: python - - from conans import ConanFile - from conan.tools.qbs import QbsToolchain - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - options = {"shared": [True, False]} - default_options = {"shared": False} - - def generate(self): - tc = QbsToolchain(self) - tc.generate() - - -The ``QbsToolchain`` will generate the following file during :command:`conan install` -command (or before calling the ``build()`` method when the package is being -built in the cache): *conan_toolchain.qbs*. This file will contain a qbs profile -named *conan_toolchain_profile*. - - -*conan_toolchain.qbs* will contain the definitions of all the Qbs properties -related to the Conan options and settings for the current package, platform, -etc. This includes the following: - - * Detection of compiler. - - * Based on the compiler set in environment variable ``CC``. - - * Uses detected system compiler based on Conan setting ``compiler`` if environment variable ``CC`` is not set. - -* Detection of compiler flags from environment (as defined at https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html): - - * ``ASFLAGS`` - - * ``CFLAGS`` - - * ``CPPFLAGS`` - - * ``CXXFLAGS`` - - * ``LDFLAGS`` - -* Detection of sysroot from environment. - -* Detection of ``build_type`` from Conan settings. - -* Detection of ``arch`` from Conan settings. - -* Detection of ``compiler.cxxstd`` from Conan settings. - -* Detection of ``fPIC`` based on the existence of such option in the recipe. diff --git a/reference/build_helpers.rst b/reference/build_helpers.rst index db3340514ea8..2f7e3a1c1618 100644 --- a/reference/build_helpers.rst +++ b/reference/build_helpers.rst @@ -16,7 +16,6 @@ Contents: build_helpers/visual_studio build_helpers/meson build_helpers/run_environment - build_helpers/qbs .. important:: diff --git a/reference/conanfile/tools.rst b/reference/conanfile/tools.rst index c7f009141862..ed78d1751b6f 100644 --- a/reference/conanfile/tools.rst +++ b/reference/conanfile/tools.rst @@ -37,4 +37,5 @@ Contents: tools/cmake tools/microsoft + tools/qbs diff --git a/reference/build_helpers/qbs.rst b/reference/conanfile/tools/qbs.rst similarity index 62% rename from reference/build_helpers/qbs.rst rename to reference/conanfile/tools/qbs.rst index 04e701faf9f9..cf3b4d526621 100644 --- a/reference/build_helpers/qbs.rst +++ b/reference/conanfile/tools/qbs.rst @@ -1,14 +1,83 @@ -.. _qbs_build_reference: +.. _conan-qbs-toolchain: + +conan.tools.qbs +=============== + +QbsToolchain +------------ + +.. warning:: + + This is an **experimental** feature subject to breaking changes in future releases. + + +The ``QbsToolchain`` can be used in the ``generate()`` method: + + +.. code:: python + + from conans import ConanFile + from conan.tools.qbs import QbsToolchain + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + options = {"shared": [True, False]} + default_options = {"shared": False} + + def generate(self): + tc = QbsToolchain(self) + tc.generate() + + +The ``QbsToolchain`` will generate the following file during :command:`conan install` +command (or before calling the ``build()`` method when the package is being +built in the cache): *conan_toolchain.qbs*. This file will contain a qbs profile +named *conan_toolchain_profile*. + + +*conan_toolchain.qbs* will contain the definitions of all the Qbs properties +related to the Conan options and settings for the current package, platform, +etc. This includes the following: + + * Detection of compiler. + + * Based on the compiler set in environment variable ``CC``. + + * Uses detected system compiler based on Conan setting ``compiler`` if environment variable ``CC`` is not set. + +* Detection of compiler flags from environment (as defined at https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html): + + * ``ASFLAGS`` + + * ``CFLAGS`` + + * ``CPPFLAGS`` + + * ``CXXFLAGS`` + + * ``LDFLAGS`` + +* Detection of sysroot from environment. + +* Detection of ``build_type`` from Conan settings. + +* Detection of ``arch`` from Conan settings. + +* Detection of ``compiler.cxxstd`` from Conan settings. + +* Detection of ``fPIC`` based on the existence of such option in the recipe. + Qbs -=== +--- If you are using **Qbs** as your build system, you can use the **Qbs** build helper. .. code-block:: python - from conans import ConanFile, tools, Qbs - import os + from conans import ConanFile + from conan.tools.qbs import Qbs class ConanFileToolsTest(ConanFile): ... @@ -18,7 +87,7 @@ If you are using **Qbs** as your build system, you can use the **Qbs** build hel qbs.build() Constructor ------------ ++++++++++++ .. code-block:: python @@ -31,27 +100,21 @@ Parameters: - **project_file** (Optional, Defaulted to ``None``): Path to the root project file. Attributes ----------- +++++++++++ use_toolchain_profile -+++++++++++++++++++++ +********************* **Defaulted to**: ``conan_toolchain_profile`` Specifies the qbs profile to build the project for. -jobs -++++ - -**Defaulted to**: ``tools.cpu_count()`` - -Specifies the number of concurrent build jobs. Methods -------- ++++++++ add_configuration() -+++++++++++++++++++ +********************* .. code-block:: python @@ -65,7 +128,7 @@ Parameters: build() -+++++++ +******* .. code-block:: python @@ -78,7 +141,7 @@ Parameters: build_all() -+++++++++++ +*********** .. code-block:: python @@ -88,7 +151,7 @@ Build all products of Qbs project, even products which set the qbs property ``bu install() -+++++++++ +********* .. code-block:: python @@ -98,14 +161,16 @@ Install products. Example -------- +******* A typical usage of the Qbs build helper, if you want to be able to both execute :command:`conan create` and also build your package for a library locally (in your user folder, not in the local cache), could be: .. code-block:: python - from conans import ConanFile, Qbs + from conans import ConanFile + from conan.tools.qbs import Qbs + class HelloConan(ConanFile): name = "hello" From cde6b45a5acff8c7a1d0d15f3be31751f1f3955b Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 12:50:28 +0100 Subject: [PATCH 025/681] working on docs --- integrations/build_system/cmake.rst | 16 +++++++++++----- integrations/build_system/msbuild.rst | 13 +++---------- reference/conanfile/tools/cmake.rst | 3 +++ reference/conanfile/tools/microsoft.rst | 3 +++ 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/integrations/build_system/cmake.rst b/integrations/build_system/cmake.rst index 533274b8fb4b..09109d045351 100644 --- a/integrations/build_system/cmake.rst +++ b/integrations/build_system/cmake.rst @@ -1,15 +1,15 @@ -.. _cmake_integration: +.. _cmake: |cmake_logo| CMake ================== -Conan can be integrated with CMake using generators, build helpers and custom *findXXX.cmake* files: +.. note:: -However, beware of some current CMake limitations, such as not dealing well with find-packages, because CMake doesn't know how to handle finding both debug and release packages. + The new, experimental integration with CMake can be found in :ref:`conan_tools_cmake`. This is the integration that will + become the standard one in Conan 2.0, and the below generators and integrations will be deprecated and removed. -.. note:: - If you want to use the Visual Studio 2017 + CMake integration, :ref:`check this how-to` +Conan can be integrated with CMake using different generators, build helpers and custom *findXXX.cmake* files: .. toctree:: @@ -24,4 +24,10 @@ However, beware of some current CMake limitations, such as not dealing well with cmake/find_packages +Other resources: + +- If you want to use the Visual Studio 2017 + CMake integration, :ref:`check this how-to` + + + .. |cmake_logo| image:: ../../images/conan-cmake_logo.png \ No newline at end of file diff --git a/integrations/build_system/msbuild.rst b/integrations/build_system/msbuild.rst index 8b71b1ea2dcb..683ab03af378 100644 --- a/integrations/build_system/msbuild.rst +++ b/integrations/build_system/msbuild.rst @@ -4,7 +4,7 @@ |visual_logo| MSBuild (Visual Studio) ===================================== -If you are using CMake to generate your Visual Studio projects, this is not the right section, go to :ref:`cmake_integration` instead. +If you are using CMake to generate your Visual Studio projects, this is not the right section, go to :ref:`cmake` instead. This section is about native integration with Microsoft MSBuild, using properties files. Conan can be integrated with **MSBuild** natively, the build system of Visual Studio in different ways: @@ -12,8 +12,9 @@ Conan can be integrated with **MSBuild** natively, the build system of Visual St - Using the ``conan.tools.microsoft`` tools: ``MSBuildDeps``, ``MSBuildToolchain`` and ``MSBuild`` helpers to generate properties files for your project, containing information about the project dependencies and toolchain. This is the new integration that is - experimental but will become the standard one in Conan 2.0. Go to :ref:`conan.tools.microsoft` for more information. + experimental but will become the standard one in Conan 2.0. Go to :ref:`conan_tools_microsoft` for more information. - Using the ``visual_studio`` or ``visual_studio_multi`` generators to create a MSBuild properties *conanbuildinfo.props* file. + This is the older integration, it is more stable now, but it wil be deprecated and removed in Conan 2.0. Keep reading this page for more information. With *visual_studio* generator @@ -63,14 +64,6 @@ Build your project as usual. Check :ref:`visualstudio_generator` for the complete reference. -Calling Visual Studio compiler ------------------------------- - -You can call the Visual Studio compiler from your ``build()`` method using the ``VisualStudioBuildEnvironment`` and the -:ref:`tools_vcvars_command`. - -Check the :ref:`msbuild` section for more info. - .. _building_visual_project: Build an existing Visual Studio project diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 8bea23d44064..d85ca79edfed 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -1,3 +1,5 @@ +.. _conan_tools_cmake: + conan.tools.cmake ================= @@ -5,6 +7,7 @@ conan.tools.cmake These tools are **experimental** and subject to breaking changes. + CMakeDeps --------- Not yet available diff --git a/reference/conanfile/tools/microsoft.rst b/reference/conanfile/tools/microsoft.rst index ac1108a71ed1..a65bfc75cc47 100644 --- a/reference/conanfile/tools/microsoft.rst +++ b/reference/conanfile/tools/microsoft.rst @@ -1,3 +1,6 @@ +.. _conan_tools_microsoft: + + conan.tools.microsoft ===================== From 5d8b0580687c32a3a13c12ca5d74f82ffa507e9f Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 13:03:41 +0100 Subject: [PATCH 026/681] working --- reference/config_files/settings.yml.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index f46483075882..64ba3bf69349 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -74,6 +74,13 @@ are possible. These are the **default** values, but it is possible to customize LLVM-vs2017, LLVM-vs2017_xp, v141, v141_xp, v141_clang_c2, v142, llvm, ClangCL] cppstd: [None, 14, 17, 20] + msvc: + version: ["19.0", + "19.1", "19.10", "19.11", "19.12", "19.13", "19.14", "19.15", "19.16", + "19.2", "19.20", "19.21", "19.22", "19.23", "19.24", "19.25", "19.26", "19.27", "19.28"] + runtime: [static, dynamic] + runtime_type: [Debug, Release] + cppstd: [14, 17, 20] clang: version: ["3.3", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9", "4.0", "5.0", "6.0", "7.0", "7.1", @@ -119,6 +126,22 @@ to distribute a unified *settings.yml* file you can use the :ref:`conan config i To force the creation of the *settings.yml* the command ``conan config init`` is available. +Compilers +--------- + +Some notes about different compilers: + +msvc +++++ + +The new ``msvc`` compiler is a new, **experimental** one, that is intended to deprecate the ``Visual Studio`` one in Conan 2.0: + +- It uses the compiler version, that is 19.0, 19.1, etc, instead of the Visual Studio IDE (15, 16, etc). +- It is only used by the new build integrations in :ref:`conan_tools_cmake` and :ref:`conan_tools_microsoft`, but not the previous ones. +- At the moment it implements a ``compatible_packages`` fallback to Visual Studio compiled packages, that is, previous existing binaries + compiled with ``settings.compiler="Visual Studio"`` can be used for the ``msvc`` compiler if no binaries exist for it yet. +- It is not detected by the profile auto-detect, it needs to explicitly be defined in profiles. + Architectures ------------- From 6ac6520383ede0b351fac89fea2e541f959bc8ec Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 19 Jan 2021 13:22:00 +0100 Subject: [PATCH 027/681] Docs for build modules per generator in cpp_info (#1986) --- reference/conanfile/attributes.rst | 5 +++-- reference/conanfile/methods.rst | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 1255868f428f..b62be4e72b86 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -939,8 +939,9 @@ This object should be filled in ``package_info()`` method. +--------------------------------------+---------------------------------------------------------------------------------------------------------+ | self.cpp_info.system_libs | Ordered list with the system library names. Defaulted to ``[]`` (empty) | +--------------------------------------+---------------------------------------------------------------------------------------------------------+ -| self.cpp_info.build_modules | | List of relative paths to build system related utility module files created by the package. Used by | -| | | CMake generators to export *.cmake* files with functions for consumers. Defaulted to ``[]`` (empty) | +| self.cpp_info.build_modules | | Dictionary of lists per generator containing relative paths to build system related utility module | +| | | files created by the package. Used by CMake generators to export *.cmake* files with functions for | +| | | consumers. Defaulted to ``{}`` (empty) | +--------------------------------------+---------------------------------------------------------------------------------------------------------+ | self.cpp_info.components | | **[Experimental]** Dictionary with different components a package may have: libraries, executables... | | | | **Warning**: Using components with other ``cpp_info`` non-default values or configs is not supported | diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 07193b962eab..643062481093 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -217,7 +217,7 @@ The :ref:`cpp_info_attributes_reference` attribute has the following properties self.cpp_info.resdirs = ['res'] # Directories where resources, data, etc. can be found self.cpp_info.bindirs = ['bin'] # Directories where executables and shared libs can be found self.cpp_info.srcdirs = [] # Directories where sources can be found (debugging, reusing sources) - self.cpp_info.build_modules = [] # Build system utility module files + self.cpp_info.build_modules = {} # Build system utility module files self.cpp_info.defines = [] # preprocessor definitions self.cpp_info.cflags = [] # pure C flags self.cpp_info.cxxflags = [] # C++ compilation flags @@ -249,8 +249,8 @@ The :ref:`cpp_info_attributes_reference` attribute has the following properties - **srcdirs**: List of relative paths (starting from the package root) of directories in which to find sources (like .c, .cpp). By default it is empty. It might be used to store sources (for later debugging of packages, or to reuse those sources building them in other packages too). -- **build_modules**: List of relative paths to build system related utility module files created by the package. Used by CMake generators to - include *.cmake* files with functions for consumers. e.g: ``self.cpp_info.build_modules.append("cmake/myfunctions.cmake")``. Those files +- **build_modules**: Dictionary of lists per generator containing relative paths to build system related utility module files created by the package. Used by CMake generators to + include *.cmake* files with functions for consumers. e.g: ``self.cpp_info.build_modules["cmake_find_package"].append("cmake/myfunctions.cmake")``. Those files will be included automatically in `cmake`/`cmake_multi` generators when using `conan_basic_setup()` and will be automatically added in `cmake_find_package`/`cmake_find_package_multi` generators when `find_package()` is used. - **defines**: Ordered list of preprocessor directives. It is common that the consumers have to specify some sort of defines in some cases, From b51e0ed356bc42544523dab8dbce7dadb52372ff Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 13:32:18 +0100 Subject: [PATCH 028/681] docs for cmakedeps --- reference/conanfile/tools/cmake.rst | 97 ++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 8bea23d44064..b443cdaa6af4 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -7,7 +7,43 @@ conan.tools.cmake CMakeDeps --------- -Not yet available + +The ``CMakeDeps`` helper will generate one **xxxx-config.cmake** file per dependency, together with other necessary .cmake files +like version, or configuration. It can be used like: + + +.. code-block:: python + + from conans import ConanFile + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + generators = "CMakeDeps" + + +The full instantiation, that allows custom configuration can be done in the ``generate()`` method: + + +.. code-block:: python + + from conans import ConanFile + from conan.tools.cmake import CMakeDeps + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + + def generate(self): + cmake = CMakeDeps(self) + cmake.configurations.append("ReleaseShared") + if self.options["hello"].shared: + cmake.configuration = "ReleaseShared" + cmake.generate() + +As it can be seen, it allows to define custom user CMake configurations besides the standard Release, Debug, etc ones. +If the **settings.yml** file is customized to add new configurations to the ``settings.build_type``, then, adding it +explicitly to ``.configurations`` is not necessary. CMakeToolchain @@ -16,8 +52,65 @@ The ``CMakeToolchain`` is the toolchain generator for CMake. It will generate to command line invocation of CMake with the ``-DCMAKE_TOOLCHAIN_FILE=conantoolchain.cmake``. This generator translates the current package configuration, settings, and options, into CMake toolchain syntax. +It can be declared as: + +.. code-block:: python + + from conans import ConanFile + + class Pkg(ConanFile): + generators = "CMakeToolchain" + +Or fully instantiated in the ``generate()`` method: + +.. code-block:: python + + from conans import ConanFile + from conan.tools.cmake import CMakeToolchain + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + generators = "cmake_find_package_multi" + options = {"shared": [True, False], "fPIC": [True, False]} + default_options = {"shared": False, "fPIC": True} + + def generate(self): + tc = CMakeToolchain(self) + tc.variables["MYVAR"] = "MYVAR_VALUE" + tc.preprocessor_definitions["MYDEFINE"] = "MYDEF_VALUE" + tc.generate() + + +This will generate a *conan_toolchain.cmake* file with the information provided in the ``generate()`` method as well as information +translated from the current ``settings``. + CMake ----- The ``CMake`` build helper is a wrapper around the command line invocation of cmake. It will abstract the -calls like ``cmake --build . --config Release`` into Python method calls. +calls like ``cmake --build . --config Release`` into Python method calls. It will also add the argument +``-DCMAKE_TOOLCHAIN_FILE=conantoolchain.cmake`` to the ``configure()`` call. + + +.. code-block:: python + + from conans import ConanFile + from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + options = {"shared": [True, False], "fPIC": [True, False]} + default_options = {"shared": False, "fPIC": True} + + def generate(self): + tc = CMakeToolchain(self) + tc.generate() + deps = CMakeDeps(self) + deps.generate() + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() \ No newline at end of file From 34fa453b2bc714867a5a32d229c795f96fa150e1 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 16:17:25 +0100 Subject: [PATCH 029/681] new conf docs --- reference/conanfile/tools/cmake.rst | 10 +++++++ reference/conanfile/tools/microsoft.rst | 9 +++++- reference/config_files.rst | 1 + reference/config_files/conan_cfg.rst | 40 +++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 reference/config_files/conan_cfg.rst diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 8bea23d44064..d0361b8e8298 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -21,3 +21,13 @@ CMake ----- The ``CMake`` build helper is a wrapper around the command line invocation of cmake. It will abstract the calls like ``cmake --build . --config Release`` into Python method calls. + + + + +conf +++++ + +- ``tools.microsoft:msbuild_verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed + to the ``CMake.build()`` command, when a Visual Studio generator (MSBuild build system) is being used for CMake. It is passed as + an argument to the underlying build system via the call ``cmake --build . --config Release -- /verbosity:Diagnostic`` \ No newline at end of file diff --git a/reference/conanfile/tools/microsoft.rst b/reference/conanfile/tools/microsoft.rst index ac1108a71ed1..4751a7907be3 100644 --- a/reference/conanfile/tools/microsoft.rst +++ b/reference/conanfile/tools/microsoft.rst @@ -201,4 +201,11 @@ Where: - ``conf`` is the configuration, typically Release, Debug, which will be obtained from ``settings.build_type`` but this will be configurable. Please open a `Github issue `_ if you want to define custom configurations. - ``platform`` is the architecture, a mapping from the ``settings.arch`` to the common 'x86', 'x64', 'ARM', 'ARM64'. - If your platform is unsupported, please report in `Github issues `_ as well: + If your platform is unsupported, please report in `Github issues `_ as well. + + +conf +++++ + +- ``tools.microsoft:msbuild_verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed + to the ``MSBuild.build()`` call as ``msbuild .... /verbosity:XXX`` diff --git a/reference/config_files.rst b/reference/config_files.rst index b0374c7c3cca..b13281b46174 100644 --- a/reference/config_files.rst +++ b/reference/config_files.rst @@ -12,6 +12,7 @@ These are the most important configuration files, used to customize conan. config_files/artifacts.properties config_files/client_certificates config_files/conan.conf + config_files/conan.cfg config_files/conandata.yml config_files/default_profile config_files/editable_layout diff --git a/reference/config_files/conan_cfg.rst b/reference/config_files/conan_cfg.rst new file mode 100644 index 000000000000..270eb74b1b36 --- /dev/null +++ b/reference/config_files/conan_cfg.rst @@ -0,0 +1,40 @@ +.. _conan_cfg: + +conan.cfg +========= + +.. warning:: + + This new configuration mechanism is an **experimental** feature subject to breaking changes in future releases. + + +The **conan.cfg** file is located in the Conan user home directory. + +Global configuration +-------------------- + +- ``core:required_conan_version = "expression"`` allows defining a version expression like ">=1.30". Conan will raise an error if its current version does not satisfy the condition +- ``core.package_id:msvc_visual_incompatible`` allows opting-out the fallback from the new ``msvc`` compiler to the ``Visual Studio`` compiler existing binaries + + + +Tools configurations +-------------------- + +Tools and user configurations allows them to be defined both in the *conan.cfg* file and in profile files. Profile values will +have priority over globally defined ones in *conan.cfg*, and can be defined as: + +.. code-block:: text + + [settings] + ... + + [conf] + tools.microsoft:msbuild_verbosity=Diagnostic + + +Existing configurations: + +- ``tools.microsoft:msbuild_verbosity`` allows defining a value from ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` for build using the + MSBuild system, it could be with the ``tools.microsoft.MSBuild`` or with the ``tools.cmake.CMake`` helpers. + From d841e031e3590e89c8ece1cc663c44d368965d87 Mon Sep 17 00:00:00 2001 From: SSE4 Date: Tue, 19 Jan 2021 22:21:06 +0700 Subject: [PATCH 030/681] - update docs for MesonToolchain and Meson (build helper) (#1980) * - update docs for MesonToolchain and Meson (build helper) Signed-off-by: SSE4 * - move Signed-off-by: SSE4 * Update reference/conanfile/tools/meson.rst * Update reference/conanfile/tools/meson.rst * Update reference/conanfile/tools/meson.rst * Update reference/conanfile/tools/meson.rst --- creating_packages/toolchains.rst | 1 - creating_packages/toolchains/meson.rst | 72 ---------- reference/conanfile/tools.rst | 1 + reference/conanfile/tools/meson.rst | 182 +++++++++++++++++++++++++ 4 files changed, 183 insertions(+), 73 deletions(-) delete mode 100644 creating_packages/toolchains/meson.rst create mode 100644 reference/conanfile/tools/meson.rst diff --git a/creating_packages/toolchains.rst b/creating_packages/toolchains.rst index ecb8cb69fe24..9c569a8fede7 100644 --- a/creating_packages/toolchains.rst +++ b/creating_packages/toolchains.rst @@ -118,4 +118,3 @@ Built-in toolchains toolchains/cmake toolchains/make - toolchains/meson diff --git a/creating_packages/toolchains/meson.rst b/creating_packages/toolchains/meson.rst deleted file mode 100644 index 89c8cdcf6dea..000000000000 --- a/creating_packages/toolchains/meson.rst +++ /dev/null @@ -1,72 +0,0 @@ -.. _conan-meson-toolchain: - -MesonToolchain -============== - -.. warning:: - - This is an **experimental** feature subject to breaking changes in future releases. - - -The ``MesonToolchain`` can be used in the ``generate()`` method: - - -.. code:: python - - from conans import ConanFile - from conan.tools.meson import MesonToolchain - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - options = {"shared": [True, False]} - default_options = {"shared": False} - - def generate(self): - tc = MesonToolchain(self) - tc.generate() - - -The ``MesonToolchain`` will generate the following file during ``conan install`` -command (or before calling the ``build()`` method when the package is being -built in the cache): ``conan_meson_native.ini`` - -``conan_meson_native.ini`` will contain the definitions of all the Meson properties -related to the Conan options and settings for the current package, platform, -etc. This includes but is not limited to the following: - -* Detection of ``default_library`` from Conan settings - - * Based on existance/value of a option named ``shared`` - -* Detection of ``buildtype`` from Conan settings - -* Definition of the C++ standard as necessary - -* The Visual Studio runtime (``b_vscrt``), obtained from Conan input settings - -Generators ----------- - -The ``MesonToolchain`` only works with the ``pkg_config`` generator. -Please, do not use other generators, as they can have overlapping definitions that can conflict. - - -Using the toolchain in developer flow -------------------------------------- - -One of the advantages of using Conan toolchains is that they can help to achieve the exact same build -with local development flows, than when the package is created in the cache. - -With the ``MesonToolchain`` it is possible to do: - -.. code:: bash - - # Lets start in the folder containing the conanfile.py - $ mkdir build && cd build - # Install both debug and release deps and create the toolchain - $ conan install .. - # the build type Release is encoded in the toolchain already. - # This conan_meson_native.iniis specific for release - $ meson setup --native-file conan_meson_native.ini build . - $ meson compile -C build diff --git a/reference/conanfile/tools.rst b/reference/conanfile/tools.rst index ed78d1751b6f..41c504f93dce 100644 --- a/reference/conanfile/tools.rst +++ b/reference/conanfile/tools.rst @@ -36,6 +36,7 @@ Contents: :maxdepth: 2 tools/cmake + tools/meson tools/microsoft tools/qbs diff --git a/reference/conanfile/tools/meson.rst b/reference/conanfile/tools/meson.rst new file mode 100644 index 000000000000..0fdb3186d550 --- /dev/null +++ b/reference/conanfile/tools/meson.rst @@ -0,0 +1,182 @@ +.. _conan-meson-toolchain: + +MesonToolchain +============== + +.. warning:: + + This is an **experimental** feature subject to breaking changes in future releases. + + +The ``MesonToolchain`` can be used in the ``generate()`` method: + + +.. code:: python + + from conans import ConanFile + from conan.tools.meson import MesonToolchain + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + options = {"shared": [True, False]} + default_options = {"shared": False} + + def generate(self): + tc = MesonToolchain(self) + tc.generate() + + +The ``MesonToolchain`` will generate the following file during ``conan install`` +command (or before calling the ``build()`` method when the package is being +built in the cache): *conan_meson_native.ini*, if doing a native build, or +*conan_meson_cross.ini*, if doing a cross-build (:ref:`cross_building_reference`). + +``conan_meson_native.ini`` will contain the definitions of all the Meson properties +related to the Conan options and settings for the current package, platform, +etc. This includes but is not limited to the following: + +* Detection of ``default_library`` from Conan settings + + * Based on existance/value of a option named ``shared`` + +* Detection of ``buildtype`` from Conan settings + +* Definition of the C++ standard as necessary + +* The Visual Studio runtime (``b_vscrt``), obtained from Conan input settings + +*conan_meson_cross.ini* contains the same information as *conan_meson_native.ini*, +but with additional information to describe host, target, and build machines (such +as the processor architecture). + +Check out the meson documentation for more details on native and cross files: + +* `Machine files `_ +* `Native environments `_ +* `Cross compilation `_ + +constructor ++++++++++++ + +.. code:: python + + def __init__(self, conanfile, env=os.environ): + +Most of the arguments are optional and will be deduced from the current ``settings``, and not +necessary to define them. + +- ``conanfile``: the current recipe object. Always use ``self``. +- ``env``: the dictionary of the environment variables. + +definitions ++++++++++++ + +This attribute allows defining Meson project options: + +.. code:: python + + def generate(self): + tc = MesonToolchain(self) + tc.definitions["MYVAR"] = "MyValue" + tc.generate() + +- One project options definition for ``MYVAR`` in ``conan_meson_native.init`` or ``conan_meson_cross.ini`` file. + +Generators +---------- + +The ``MesonToolchain`` only works with the ``pkg_config`` generator. +Please, do not use other generators, as they can have overlapping definitions that can conflict. + + +Using the toolchain in developer flow +------------------------------------- + +One of the advantages of using Conan toolchains is that they can help to achieve the exact same build +with local development flows, than when the package is created in the cache. + +With the ``MesonToolchain`` it is possible to do: + +.. code:: bash + + # Lets start in the folder containing the conanfile.py + $ mkdir build && cd build + # Install both debug and release deps and create the toolchain + $ conan install .. + # the build type Release is encoded in the toolchain already. + # This conan_meson_native.iniis specific for release + $ meson setup --native-file conan_meson_native.ini build . + $ meson compile -C build + +Meson build helper +------------------ + +The ``Meson()`` build helper that works with the ``MesonToolchain`` is also experimental, +and subject to breaking change in the future. It will evolve to adapt and complement the +toolchain functionality. + +The helper is intended to be used in the ``build()`` method, to call Meson commands automatically +when a package is being built directly by Conan (create, install) + +.. code:: python + + from conan.tools.meson import Meson + + def build(self): + meson = Meson(self) + meson.configure(source_folder="src") + meson.build() + + +It supports the following methods: + + +constructor ++++++++++++ + +.. code:: python + + def __init__(self, conanfile, build_folder='build'): + +- ``conanfile``: the current recipe object. Always use ``self``. +- ``build_folder``: Relative path to a folder to contain the temporary build files + +configure() ++++++++++++ + +.. code:: python + + def configure(self, source_folder=None): + +Calls :command:`meson`, with the given generator and passing either :command:`--native-file conan_meson_native.ini` +(native builds) or :command:`--cross-file conan_meson_cross.ini` (cross builds). + +- ``source_folder``: Relative path to the folder containing the root *meson.build* + +build() ++++++++ + +.. code:: python + + def build(self): + +Calls the build system. Equivalent to :command:`meson compile -C .` in the build folder. + +install() ++++++++++ + +.. code:: python + + def install(self): + +Installs development files (headers, libraries, etc.). Equivalent to run :command:`meson install -C .` in the build folder. + +test() +++++++ + +.. code:: python + + def test(self): + +Runs project's tests. Equivalent to running :command:`meson test -v -C .` in the build folder.. From 33edeb23f5a0ab4b37ecbaa0c5c3556a0a2ed517 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 16:22:38 +0100 Subject: [PATCH 031/681] fix link --- reference/config_files.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reference/config_files.rst b/reference/config_files.rst index b13281b46174..fbf6208afa5b 100644 --- a/reference/config_files.rst +++ b/reference/config_files.rst @@ -12,9 +12,8 @@ These are the most important configuration files, used to customize conan. config_files/artifacts.properties config_files/client_certificates config_files/conan.conf - config_files/conan.cfg + config_files/conan_cfg config_files/conandata.yml config_files/default_profile config_files/editable_layout config_files/settings.yml - From ec7ab28384f40d103a0271572148cabac6927e23 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 18:03:20 +0100 Subject: [PATCH 032/681] refactoring toolchain docs --- creating_packages/toolchains.rst | 13 +--------- creating_packages/toolchains/cmake.rst | 11 +-------- reference/conanfile/tools.rst | 2 +- .../conanfile/tools/gnu.rst | 24 +------------------ 4 files changed, 4 insertions(+), 46 deletions(-) rename creating_packages/toolchains/make.rst => reference/conanfile/tools/gnu.rst (86%) diff --git a/creating_packages/toolchains.rst b/creating_packages/toolchains.rst index 9c569a8fede7..7bee4d37fee2 100644 --- a/creating_packages/toolchains.rst +++ b/creating_packages/toolchains.rst @@ -106,15 +106,4 @@ the documentation of each toolchain to check the associated build helper availab cmake = CMake(self) -Built-in toolchains -------------------- - -.. warning:: - - Toolchain reference is moving to :ref:`conan_tools` - -.. toctree:: - :maxdepth: 2 - - toolchains/cmake - toolchains/make +To learn more about existing built-in toolchains, read the reference in :ref:`conan_tools`. diff --git a/creating_packages/toolchains/cmake.rst b/creating_packages/toolchains/cmake.rst index 9e5d42bc639a..112eb09d564b 100644 --- a/creating_packages/toolchains/cmake.rst +++ b/creating_packages/toolchains/cmake.rst @@ -1,6 +1,3 @@ - -.. _conan-cmake-toolchain: - CMakeToolchain ============== @@ -8,12 +5,6 @@ CMakeToolchain This is an **experimental** feature subject to breaking changes in future releases. -.. warning: - - Starting in Conan 1.32 ``write_toolchain_files()`` method and ``toolchain`` attribute have been - deprecated. They will be removed in Conan 1.33, please use ``generate()`` instead of - ``write_toolchain_files()`` and ``generate`` or ``generators = "CMakeToolchain"`` instead of the - ``toolchain`` attribute. The ``CMakeToolchain`` can be used in the ``generate()`` method: @@ -63,7 +54,7 @@ constructor .. code:: python def __init__(self, conanfile, generator=None, generator_platform=None, build_type=None, - cmake_system_name=True, toolset=None, parallel=True, make_program=None): + cmake_system_name=True, toolset=None): Most of the arguments are optional and will be deduced from the current ``settings``, and not diff --git a/reference/conanfile/tools.rst b/reference/conanfile/tools.rst index 41c504f93dce..fd6afef55d2a 100644 --- a/reference/conanfile/tools.rst +++ b/reference/conanfile/tools.rst @@ -36,7 +36,7 @@ Contents: :maxdepth: 2 tools/cmake + tools/gnu tools/meson tools/microsoft tools/qbs - diff --git a/creating_packages/toolchains/make.rst b/reference/conanfile/tools/gnu.rst similarity index 86% rename from creating_packages/toolchains/make.rst rename to reference/conanfile/tools/gnu.rst index 5773b7401536..0dbe99b02019 100644 --- a/creating_packages/toolchains/make.rst +++ b/reference/conanfile/tools/gnu.rst @@ -5,19 +5,10 @@ This is an **experimental** feature subject to breaking changes in future releases. -.. warning: - - Starting in Conan 1.32 ``write_toolchain_files()`` method and ``toolchain`` attribute have been - deprecated. They will be removed in Conan 1.33, please use ``generate()`` instead of - ``write_toolchain_files()`` and ``generate`` or ``generators = "MakeToolchain"`` instead of the - ``toolchain`` attribute. - MakeToolchain ============== -The `MakeToolchain` can be used in the ``generate()`` method of -``conanfile.py``: - +The `MakeToolchain` can be used in the ``generate()`` method of ``conanfile.py``: .. code:: python @@ -195,16 +186,3 @@ it simply requires passing a few more parameters to **GnuMake**. $ conan install .. $ make -E='include build/conan_toolchain.mak' -E='$(call CONAN_TC_SETUP)' - - -Autotools Build Helper ----------------------- - -This toolchain should not be used together with the existing -``AutoToolsBuildEnvironment`` build helper in Conan at this time. They perform a -number of similar and probably conflicting operations on the standard -**GnuMake** variables. There is a goal to continue adding features to this -toolchain until is achieves feature parity with ``AutoToolsBuildEnvironment`` -which will take some time. During that process, we'll be trying to determine if -it's desirable and feasible to make the two co-exist and/or even work together. -At this time, it's unclear. From 130958696cd8efec3762ed8d79e7f0c9085bb662 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 19 Jan 2021 18:10:06 +0100 Subject: [PATCH 033/681] Update installation.rst Co-authored-by: SSE4 --- installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installation.rst b/installation.rst index 8ae93cdac559..c59cae74b3c5 100644 --- a/installation.rst +++ b/installation.rst @@ -139,7 +139,7 @@ Clone (or download and unzip) the git repository and install it with: # clone folder name matters, to avoid imports issues $ git clone https://github.com/conan-io/conan.git conan_src $ cd conan_src - $ pip install -e . + $ python -m pip install -e . Test your ``conan`` installation. From 55ea288e3f7cbe5ff28109a083525dbc9a1dfe9c Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 18:17:05 +0100 Subject: [PATCH 034/681] moving toolchain docs to reference --- creating_packages/toolchains/cmake.rst | 251 ------------------------- reference/conanfile/tools/cmake.rst | 188 +++++++++++++++++- 2 files changed, 187 insertions(+), 252 deletions(-) delete mode 100644 creating_packages/toolchains/cmake.rst diff --git a/creating_packages/toolchains/cmake.rst b/creating_packages/toolchains/cmake.rst deleted file mode 100644 index 112eb09d564b..000000000000 --- a/creating_packages/toolchains/cmake.rst +++ /dev/null @@ -1,251 +0,0 @@ -CMakeToolchain -============== - -.. warning:: - - This is an **experimental** feature subject to breaking changes in future releases. - - -The ``CMakeToolchain`` can be used in the ``generate()`` method: - - -.. code:: python - - from conans import ConanFile - from conan.tools.cmake import CMake, CMakeToolchain - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - generators = "cmake_find_package_multi" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} - - def generate(self): - tc = CMakeToolchain(self) - tc.generate() - - -The ``CMakeToolchain`` will generate 2 files, after a ``conan install`` command (or -before calling the ``build()`` method when the package is being built in the cache): - -- The main *conan_toolchain.cmake* file, that can be used in the command line. -- A *conan_project_include.cmake* file, that will automatically be called right after the - ``project()`` call for cmake>=3.15, containing definitions that only take effect after such - call. For older cmake versions you should explicitly call ``include(.../conan_project_include.cmake)`` - in your *CMakeLists.txt*. - - -These file will automatically manage the definition of cmake values according to current Conan -settings: - -- Definition of the CMake generator platform and generator toolset -- Definition of the CMake ``build_type`` -- Definition of the ``CMAKE_POSITION_INDEPENDENT_CODE``, based on ``fPIC`` option. -- Definition of the C++ standard as necessary -- Definition of the standard library used for C++ -- Deactivation of rpaths in OSX - -Most of these things will be configurable, please provide feedback at: https://github.com/conan-io/conan/issues - -constructor -+++++++++++ - -.. code:: python - - def __init__(self, conanfile, generator=None, generator_platform=None, build_type=None, - cmake_system_name=True, toolset=None): - - -Most of the arguments are optional and will be deduced from the current ``settings``, and not -necessary to define them. - - -preprocessor_definitions -++++++++++++++++++++++++ - -This attribute allows defining CMake variables, for multiple configurations (Debug, Release, etc). - -.. code:: python - - def generate(self): - tc = CMakeToolchain(self) - tc.preprocessor_definitions["MYVAR"] = "MyValue" - tc.preprocessor_definitions.debug["MYCONFIGVAR"] = "MyDebugValue" - tc.preprocessor_definitions.release["MYCONFIGVAR"] = "MyReleaseValue" - tc.generate() - -This will be translated to: - -- One ``set()`` definition for ``MYVAR`` in ``conan_toolchain.cmake`` file. -- One ``set()`` definition, using a cmake generator expression in ``conan_project_include.cmake`` file, - using the different values for different configurations. It is important to recall that things - that depend on the build type cannot be directly set in the toolchain. - -generators ----------- - -The ``CMakeToolchain`` only works with the ``cmake_find_package`` and ``cmake_find_package_multi`` -generators. Using others will raise, as they can have overlapping definitions that can conflict. - - -Using the toolchain in developer flow -------------------------------------- - -One of the advantages of using Conan toolchains is that they can help to achieve the exact same build -with local development flows, than when the package is created in the cache. - -With the ``CMakeToolchain`` it is possible to do, for multi-configuration systems like Visual Studio -(assuming we are using the ``cmake_find_package_multi`` generator): - -.. code:: bash - - # Lets start in the folder containing the conanfile.py - $ mkdir build && cd build - # Install both debug and release deps and create the toolchain - $ conan install .. - $ conan install .. -s build_type=Debug - # the conan_toolchain.cmake is common for both configurations - # Need to pass the generator WITHOUT the platform, that matches your default settings - $ cmake .. -G "Visual Studio 15" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake - # Now you can open the IDE, select Debug or Release config and build - # or, in the command line - $ cmake --build . --config Release - $ cmake --build . --config Debug - - -**NOTE**: The platform (Win64), is already encoded in the toolchain. The command line shouldn't pass it, so using -``-G "Visual Studio 15"`` instead of the ``-G "Visual Studio 15 Win64"`` - - -For single-configuration build systems: - -.. code:: bash - - # Lets start in the folder containing the conanfile.py - $ mkdir build_release && cd build_release - $ conan install .. - # the build type Release is encoded in the toolchain already. - # This conan_toolchain.cmake is specific for release - $ cmake .. -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake - $ cmake --build . # or just "make" - - # debug build requires its own folder - $ cd .. && mkdir build_debug && cd build_debug - $ conan install .. -s build_type=Debug - # the build type Debug is encoded in the toolchain already. - # This conan_toolchain.cmake is specific for debug - $ cmake .. -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake - $ cmake --build . # or just "make" - - - -CMake build helper ------------------- - -The ``CMake()`` build helper that works with the ``CMakeToolchain`` is also experimental, -and subject to breaking change in the future. It will evolve to adapt and complement the -toolchain functionality. - -The helper is intended to be used in the ``build()`` method, to call CMake commands automatically -when a package is being built directly by Conan (create, install) - -.. code:: python - - from conans import CMake - - def build(self): - cmake = CMake(self) - cmake.configure(source_folder="src") - cmake.build() - - -It supports the following methods: - -constructor -+++++++++++ - -.. code:: python - - def __init__(self, conanfile, generator=None, build_folder=None, parallel=True, - msbuild_verbosity="minimal"): - -- ``conanfile``: the current recipe object. Always use ``self``. -- ``generator``: CMake generator. Define it only to override the default one (like ``Visual Studio 15``). - Note that as the platform (x64, Win32...) is now defined in the toolchain it is not necessary to specify it here. -- ``build_folder``: Relative path to a folder to contain the temporary build files -- ``parallel``: Set it to ``False`` to deactivate using parallel builds. If activated, it will use - ``cpu_count`` configuration as the number of parallel jobs to use. -- ``msbuild_verbosity``: Used to define the output of MSBuild builds. - - -configure() -+++++++++++ - -.. code:: python - - def configure(self, source_folder=None): - -Calls ``cmake``, with the given generator and passing ``-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake``. -It will also provide the CMake generator in the command like, like ``-G "Visual Studio 15"``. Note -that it is not necessary to specify the platform, like ``-G "Visual Studio 15 Win64"``, as the -platform is already defined in the toolchain file. - -- ``source_folder``: Relative path to the folder containing the root *CMakeLists.txt* - - -build() -+++++++ - -.. code:: python - - def build(self, build_type=None, target=None): - - -Calls the build system. Equivalent to :command:`cmake --build .` in the build folder. - - -- ``build_type``: Use it only to override the value defined in the ``settings.build_type`` for a multi-configuration generator (e.g. Visual Studio, XCode). - This value will be ignored for single-configuration generators, they will use the one defined in the toolchain file during the install step. -- ``target``: name of the build target to run. - - -install() -+++++++++ - -.. code:: python - - def install(self, build_type=None): - - -Equivalent to run ``cmake --build . --target=install`` - -- ``build_type``: Use it only to override the value defined in the ``settings.build_type``. It - can fail if the build is single configuration (e.g. Unix Makefiles), as in that case the build - type must be specified at configure time, not build type. - - -test() -++++++ - -.. code:: python - - def test(self, build_type=None, target=None, output_on_failure=False): - - -Equivalent to running :command:`cmake --build . --target=RUN_TESTS`. - -- ``build_type``: Use it only to override the value defined in the ``settings.build_type``. It - can fail if the build is single configuration (e.g. Unix Makefiles), as in that case the build - type must be specified at configure time, not build type. -- ``target``: name of the build target to run, by default ``RUN_TESTS`` or ``test``. - - -Examples --------- - -Conan is able to generate a toolchain file for some configurations. In the -following sections you can find more information about them: - - * :ref:`Android `. - * :ref:`iOS `. \ No newline at end of file diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index a97f662e2c45..20fcf54af3d4 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -85,9 +85,116 @@ Or fully instantiated in the ``generate()`` method: tc.generate() -This will generate a *conan_toolchain.cmake* file with the information provided in the ``generate()`` method as well as information +This will generate a *conan_toolchain.cmake* file after a ``conan install`` (or when building the package +in the cache) with the information provided in the ``generate()`` method as well as information translated from the current ``settings``. +These file will automatically manage the definition of cmake values according to current Conan +settings: + +- Definition of the CMake generator platform and generator toolset +- Definition of the CMake ``build_type`` +- Definition of the ``CMAKE_POSITION_INDEPENDENT_CODE``, based on ``fPIC`` option. +- Definition of the C++ standard as necessary +- Definition of the standard library used for C++ +- Deactivation of rpaths in OSX + +Most of these things will be configurable, please provide feedback at: https://github.com/conan-io/conan/issues + +constructor ++++++++++++ + +.. code:: python + + def __init__(self, conanfile, generator=None, generator_platform=None, build_type=None, + cmake_system_name=True, toolset=None): + + +Most of the arguments are optional and will be deduced from the current ``settings``, and not +necessary to define them. + + +preprocessor_definitions +++++++++++++++++++++++++ + +This attribute allows defining CMake variables, for multiple configurations (Debug, Release, etc). + +.. code:: python + + def generate(self): + tc = CMakeToolchain(self) + tc.preprocessor_definitions["MYVAR"] = "MyValue" + tc.preprocessor_definitions.debug["MYCONFIGVAR"] = "MyDebugValue" + tc.preprocessor_definitions.release["MYCONFIGVAR"] = "MyReleaseValue" + tc.generate() + +This will be translated to: + +- One ``set()`` definition for ``MYVAR`` in ``conan_toolchain.cmake`` file. +- One ``set()`` definition, using a cmake generator expression in ``conan_project_include.cmake`` file, + using the different values for different configurations. It is important to recall that things + that depend on the build type cannot be directly set in the toolchain. + + +The ``CMakeToolchain`` is intended to run with the ``CMakeDeps`` dependencies generator. It might temporarily +work with others like ``cmake_find_package`` and ``cmake_find_package_multi``, but this will be removed soon. + +Using the toolchain in developer flow ++++++++++++++++++++++++++++++++++++++ + +One of the advantages of using Conan toolchains is that they can help to achieve the exact same build +with local development flows, than when the package is created in the cache. + +With the ``CMakeToolchain`` it is possible to do, for multi-configuration systems like Visual Studio +(assuming we are using the ``cmake_find_package_multi`` generator): + +.. code:: bash + + # Lets start in the folder containing the conanfile.py + $ mkdir build && cd build + # Install both debug and release deps and create the toolchain + $ conan install .. + $ conan install .. -s build_type=Debug + # the conan_toolchain.cmake is common for both configurations + # Need to pass the generator WITHOUT the platform, that matches your default settings + $ cmake .. -G "Visual Studio 15" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake + # Now you can open the IDE, select Debug or Release config and build + # or, in the command line + $ cmake --build . --config Release + $ cmake --build . --config Debug + + +**NOTE**: The platform (Win64), is already encoded in the toolchain. The command line shouldn't pass it, so using +``-G "Visual Studio 15"`` instead of the ``-G "Visual Studio 15 Win64"`` + + +For single-configuration build systems: + +.. code:: bash + + # Lets start in the folder containing the conanfile.py + $ mkdir build_release && cd build_release + $ conan install .. + # the build type Release is encoded in the toolchain already. + # This conan_toolchain.cmake is specific for release + $ cmake .. -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake + $ cmake --build . # or just "make" + + # debug build requires its own folder + $ cd .. && mkdir build_debug && cd build_debug + $ conan install .. -s build_type=Debug + # the build type Debug is encoded in the toolchain already. + # This conan_toolchain.cmake is specific for debug + $ cmake .. -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake + $ cmake --build . # or just "make" + + +Conan is able to generate a toolchain file for different systems. In the +following sections you can find more information about them: + + * :ref:`Android `. + * :ref:`iOS `. + CMake ----- @@ -95,6 +202,9 @@ The ``CMake`` build helper is a wrapper around the command line invocation of cm calls like ``cmake --build . --config Release`` into Python method calls. It will also add the argument ``-DCMAKE_TOOLCHAIN_FILE=conantoolchain.cmake`` to the ``configure()`` call. +The helper is intended to be used in the ``build()`` method, to call CMake commands automatically +when a package is being built directly by Conan (create, install) + .. code-block:: python @@ -118,6 +228,82 @@ calls like ``cmake --build . --config Release`` into Python method calls. It wil cmake.configure() cmake.build() +It supports the following methods: + +constructor ++++++++++++ + +.. code:: python + + def __init__(self, conanfile, generator=None, build_folder=None): + +- ``conanfile``: the current recipe object. Always use ``self``. +- ``generator``: CMake generator. Define it only to override the default one (like ``Visual Studio 15``). + Note that as the platform (x64, Win32...) is now defined in the toolchain it is not necessary to specify it here. +- ``build_folder``: Relative path to a folder to contain the temporary build files + + +configure() ++++++++++++ + +.. code:: python + + def configure(self, source_folder=None): + +Calls ``cmake``, with the given generator and passing ``-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake``. +It will also provide the CMake generator in the command like, like ``-G "Visual Studio 15"``. Note +that it is not necessary to specify the platform, like ``-G "Visual Studio 15 Win64"``, as the +platform is already defined in the toolchain file. + +- ``source_folder``: Relative path to the folder containing the root *CMakeLists.txt* + + +build() ++++++++ + +.. code:: python + + def build(self, build_type=None, target=None): + + +Calls the build system. Equivalent to :command:`cmake --build .` in the build folder. + + +- ``build_type``: Use it only to override the value defined in the ``settings.build_type`` for a multi-configuration generator (e.g. Visual Studio, XCode). + This value will be ignored for single-configuration generators, they will use the one defined in the toolchain file during the install step. +- ``target``: name of the build target to run. + + +install() ++++++++++ + +.. code:: python + + def install(self, build_type=None): + + +Equivalent to run ``cmake --build . --target=install`` + +- ``build_type``: Use it only to override the value defined in the ``settings.build_type``. It + can fail if the build is single configuration (e.g. Unix Makefiles), as in that case the build + type must be specified at configure time, not build type. + + +test() +++++++ + +.. code:: python + + def test(self, build_type=None, target=None, output_on_failure=False): + + +Equivalent to running :command:`cmake --build . --target=RUN_TESTS`. + +- ``build_type``: Use it only to override the value defined in the ``settings.build_type``. It + can fail if the build is single configuration (e.g. Unix Makefiles), as in that case the build + type must be specified at configure time, not build type. +- ``target``: name of the build target to run, by default ``RUN_TESTS`` or ``test``. + conf ++++ From 305abcf082d856d7f09173a6ff54b9960ab40690 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 19 Jan 2021 18:25:31 +0100 Subject: [PATCH 035/681] fix reference --- reference/conanfile/tools/cmake.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 20fcf54af3d4..6395c4daa87b 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -48,6 +48,7 @@ As it can be seen, it allows to define custom user CMake configurations besides If the **settings.yml** file is customized to add new configurations to the ``settings.build_type``, then, adding it explicitly to ``.configurations`` is not necessary. +.. _conan-cmake-toolchain: CMakeToolchain -------------- From 48ec755f249627cb8bf32d58c2f5902ec9e9fdeb Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 19 Jan 2021 19:18:38 +0100 Subject: [PATCH 036/681] release 1.33.0 --- .ci/publish.jenkins | 1 + conf.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index e87f3f2413fa..55051c331c35 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,6 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ + 'release/1.33.0': '1.33', 'release/1.32.1': '1.32', 'release/1.31.4': '1.31', 'release/1.30.2': '1.30', diff --git a/conf.py b/conf.py index da40c22875f0..2988386fa433 100644 --- a/conf.py +++ b/conf.py @@ -41,9 +41,9 @@ ] # The short X.Y version. -version = "1.32" +version = "1.33" # The full version, including alpha/beta/rc tags. -release = u'1.32.1' +release = u'1.33.0' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): From 41a17e3e87e6112ef9e60c32fa8e1aa735d3858e Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 19 Jan 2021 19:25:00 +0100 Subject: [PATCH 037/681] add changelog --- changelog.rst | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/changelog.rst b/changelog.rst index 647eea201410..320da6131949 100644 --- a/changelog.rst +++ b/changelog.rst @@ -21,6 +21,51 @@ Check https://github.com/conan-io/conan for issues and more details about develo Conan 1.32 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.33.0 (19-Jan-2021) +-------------------- + +- Feature: Introducing a new ``[conf]`` section in profiles that allows a more systematic configuration management for recipes and helpers (build helpers, toolchains). Introducing a new ``conan_conf.txt`` cache configuration file that contains configuration definition with the same syntax as in profiles. `#8266 `_ . Docs `here `__ +- Feature: Add Apple Catalyst support (as new os.subsystem) `#8264 `_ . Docs `here `__ +- Feature: Add os.sdk sub-settings for Apple `#8263 `_ . Docs `here `__ +- Feature: Provide support for ``msvc`` compiler in ``MSBuild`` tools `#8238 `_ . Docs `here `__ +- Feature: Specify build modules by the generator in `cpp_info`. Added backwards compatibility for `*.cmake` build modules added at global scope, but not for other file extensions. `#8232 `_ . Docs `here `__ +- Feature: The `tools.get`, `tools.unzip` and `tools.untargz` now accept a new argument `strip_root=True` to unzip moving all the files to the parent folder when all of them belongs to a single folder. `#8208 `_ . Docs `here `__ +- Feature: Add new ``msvc`` compiler setting and preliminary support in ``conan.tools.cmake`` generator and toolchain. `#8201 `_ . Docs `here `__ +- Feature: ``CMakeDeps`` now takes values for configurations from ``settings.yml``. `#8194 `_ . Docs `here `__ +- Feature: Implement ``ConanXXXRootFolder`` in ``MSBuildDeps`` generator. `#8177 `_ +- Feature: Add _Meson_ build helper. `#8147 `_ . Docs `here `__ +- Feature: Add `QbsToolchain` and a Qbs build helper class (currently working for Mcus, not for Android or iOS). `#8125 `_ . Docs `here `__ +- Feature: Add e2k (elbrus) architectures and mcst-lcc compiler `#8032 `_ . Docs `here `__ +- Feature: New ``CMakeDeps`` generator (at the moment is the ``cmake_find_package_multi``, that allows custom configurations, like ``ReleaseShared``. `#8024 `_ . Docs `here `__ +- Feature: Allow ``MSBuildToolchain`` custom configurations in ``generate()`` method. `#7754 `_ . Docs `here `__ +- Fix: Fixed help message in command `conan remove --outdated` with reference or pattern `#8350 `_ . Docs `here `__ +- Fix: Do not define CMAKE_GENERATOR_PLATFORM and CMAKE_GENERATOR_TOOLSET in the ``CMakeToolchain`` file unless the CMake generator is "Visual Studio". Fix https://github.com/conan-io/conan/issues/7485 `#8333 `_ +- Fix: Remove spurious '-find' argument to XCodes xcrun tool. `#8329 `_ +- Fix: Update pylint plugin, some fields are now available in the base `ConanFile`. `#8320 `_ +- Fix: Remove PyJWT deprecation warning by adding explicitly ``algorithms`` argument. `#8267 `_ +- Fix: CMake's generator name for Visual Studio compiler uses only the major version. `#8257 `_ +- Fix: Remove nosetests support, now using pytest for the test suite. `#8253 `_ +- Fix: Remove `CMAKE_PROJECT_INCLUDE` in `CMakeToolchain`, no longer necessary as the MSVC runtime can be defined with a generator expression in the toolchain. `#8251 `_ +- Fix: Temporarily allow ``cmake_paths`` generator for ``CMakeToolchain``, to allow start using the toolchain for users that depend on that generator. `#8230 `_ +- Fix: Let CMake generator generate code for checking against "ClangCL" msvc toolset. `#8218 `_ +- Fix: Include ``build_requires`` in the global ``conandeps.props`` file generated by MSBuildDeps. `#8186 `_ +- Fix: Change `MSBuildDeps` file ``conan_deps.props`` to ``conandeps.props`` to avoid collision with a package named "deps". `#8186 `_ +- Fix: Throw error when the recipe description is not a string. `#8143 `_ +- Fix: Inject build modules after CMake targets are created `#8130 `_ . Docs `here `__ +- Fix: Define ``package_folder`` in the ``test_package`` folder (defaulting to "package"), so the test recipe can execute ``cmake.install()`` in its ``build()`` method. `#8117 `_ +- Fix: Remove the downloaded file if it doesn't satisfy provided checksums (modifies `tools.download`). `#8116 `_ . Docs `here `__ +- Bugfix: Solved ``assert node.package_id != PACKAGE_ID_UNKNOWN`` assertion that happened when using ``build_requires`` that also exist in ``requires``, and using ``package_revision_mode`` and ``full_transitive_package_id=1`` `#8358 `_ +- BugFix: Fix SCM user and password by making them url-encoded `#8355 `_ +- Bugfix: Fix bug in definition of ``ROOT`` variables in ``MakeGenerator``. `#8301 `_ +- BugFix: fix `-j` being passed to _NMake_ in `AutotoolsBuildEnvironment`. `#8285 `_ +- BugFix: Fix per-package settings exact match for packages without user/channel. `#8281 `_ +- BugFix: Fix detected_architecture() for Apple M1, mapping to ``armv8`` (from returned ``arm64``). `#8262 `_ +- Bugfix: Make prompt names unique when using multiple virtualenv scripts in Powershell. `#8228 `_ +- Bugfix: Fix when _conandata.yml_ is empty and `scm_to_conandata` is enabled `#8215 `_ +- Bugfix: Removed a reference to deprecated `FlagsForFile` function in place of current `Settings` function. `#8167 `_ +- Bugfix: Add test for AutoToolsBuildEnvironment on Apple platforms `#8118 `_ +- Bugfix: Change the `rpath_flags` flag to always use the comma separator instead of "=", because the current behaviour causes linker error messages when attempting to cross-compile to Mac OS, and the comma separator is accepted everywhere. `#7716 `_ + 1.32.1 (15-Dec-2020) -------------------- From 0bee8d2a93d1d427047e5ea8a5c8019c34fc5380 Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 19 Jan 2021 19:26:31 +0100 Subject: [PATCH 038/681] update version --- changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.rst b/changelog.rst index 320da6131949..d276787e5f1c 100644 --- a/changelog.rst +++ b/changelog.rst @@ -18,7 +18,7 @@ Check https://github.com/conan-io/conan for issues and more details about develo .. important:: - Conan 1.32 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please + Conan 1.33 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. 1.33.0 (19-Jan-2021) From 41865d92fbbd032f3ccb75801e196b76a79b40be Mon Sep 17 00:00:00 2001 From: rico-chet Date: Tue, 19 Jan 2021 22:34:51 +0100 Subject: [PATCH 039/681] buildroot.rst: Fix a typo (#1996) Artifatory --> Artifactory --- integrations/cross_platform/buildroot.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/cross_platform/buildroot.rst b/integrations/cross_platform/buildroot.rst index 10279706597b..8fa50c5060ff 100644 --- a/integrations/cross_platform/buildroot.rst +++ b/integrations/cross_platform/buildroot.rst @@ -151,7 +151,7 @@ At the end of the installation it will be copied to the output directory. Customizing Conan remote ======================== -Let's say we have an :ref:`Artifatory ` instance where all packages are available +Let's say we have an :ref:`Artifactory ` instance where all packages are available for download. How could we customize the remote used by Buildroot? We need to introduce a new option, where we can write the remote name and Conan will be able to consume such variable. First we need to create a new configuration file to insert new options in Conan's menu: From 886c88b984e77d37a31e8bc36daa4de6a1923ebf Mon Sep 17 00:00:00 2001 From: czoido Date: Wed, 20 Jan 2021 06:30:05 +0100 Subject: [PATCH 040/681] fix date --- changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.rst b/changelog.rst index d276787e5f1c..76b7cbeb1989 100644 --- a/changelog.rst +++ b/changelog.rst @@ -21,7 +21,7 @@ Check https://github.com/conan-io/conan for issues and more details about develo Conan 1.33 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. -1.33.0 (19-Jan-2021) +1.33.0 (20-Jan-2021) -------------------- - Feature: Introducing a new ``[conf]`` section in profiles that allows a more systematic configuration management for recipes and helpers (build helpers, toolchains). Introducing a new ``conan_conf.txt`` cache configuration file that contains configuration definition with the same syntax as in profiles. `#8266 `_ . Docs `here `__ From 4c6546263fd138c8f570c878b0bada59f8fe5690 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Wed, 20 Jan 2021 15:07:35 -0300 Subject: [PATCH 041/681] Remove conan community from docs (#1999) * Remove conan community from docs Signed-off-by: Uilian Ries * Remove Conan COmmunity from remotes Signed-off-by: Uilian Ries --- devtools/create_installer_packages.rst | 14 ++--- howtos/other_languages_package_manager/go.rst | 57 ++++++++++++------- howtos/run_conan_in_docker.rst | 14 ++--- .../build_system/cmake/find_packages.rst | 4 +- integrations/ci/jenkins.rst | 12 ++-- integrations/cross_platform/buildroot.rst | 5 +- reference/commands/output/user.rst | 7 +-- systems_cross_building/cross_building.rst | 6 +- uploading_packages/remotes.rst | 9 --- 9 files changed, 67 insertions(+), 61 deletions(-) diff --git a/devtools/create_installer_packages.rst b/devtools/create_installer_packages.rst index 37de1bce55e1..d4d8e0a7c50f 100644 --- a/devtools/create_installer_packages.rst +++ b/devtools/create_installer_packages.rst @@ -4,7 +4,7 @@ Creating conan packages to install dev tools ============================================ One of the most useful features of Conan is to package executables like compilers or build tools and -distribute them in a controlled way to the team of developers. This way Conan helps not only with the +distribute them in a controlled way to the team of developers. This way Conan helps not only with the graph of dependencies of the application itself, but also with all the ecosystem needed to generate the project, making it really easy to control everything involved in the deployed application. @@ -38,7 +38,7 @@ the ``nasm`` tool for building assembler: name = "nasm" version = "2.13.02" license = "BSD-2-Clause" - url = "https://github.com/conan-community/conan-nasm-installer" + url = "https://github.com/conan-io/conan-center-index" settings = "os", "arch" description="Nasm for windows. Useful as a build_require." @@ -91,9 +91,9 @@ Using the tool packages in other recipes These kind of tools are not usually part of the application graph itself, they are needed only to build the library, so you should usually declare them as :ref:`build requirements `, in the recipe itself or in a profile. -For example, there are many recipes that can take advantage of the ``nasm`` package we've seen above, like +For example, there are many recipes that can take advantage of the ``nasm`` package we've seen above, like `flac `_ or `libx264 `_ -that are already available in `ConanCenter `_. Those recipes will take advantage of ``nasm`` +that are already available in `ConanCenter `_. Those recipes will take advantage of ``nasm`` being in the PATH to run some assembly optimizations. @@ -107,7 +107,7 @@ being in the PATH to run some assembly optimizations. def build(self): ... # ``nasm.exe`` will be in the PATH here - + def package_info(self): self.cpp_info.libs = [...] @@ -126,7 +126,7 @@ of adding the required paths to the corresponding environment variables: Here we are telling Conan to create the package for the ``libx264`` for the ``host`` platform defined in the profile ``profile_host`` file and to use the profile ``windows`` for all the build requirements -that are in the ``build`` context. In other words: in this example we are running a Windows machine +that are in the ``build`` context. In other words: in this example we are running a Windows machine and we need a version of ``nasm`` compatible with this machine, so we are providing a ``windows`` profile for the ``build`` context, and we are generating the library for the ``host`` platform which is declared in the ``profile_host`` profile (read more about :ref:`build requires context `). @@ -195,7 +195,7 @@ For example: Working in Windows with the ``nasm`` package we've already defined: > NASM version 2.13.02 compiled on Dec 18 2019 - + #. You can deactivate the virtual environment with the *deactivate.bat* script .. code-block:: bash diff --git a/howtos/other_languages_package_manager/go.rst b/howtos/other_languages_package_manager/go.rst index 7849bd152da7..c1a5cf5ce863 100644 --- a/howtos/other_languages_package_manager/go.rst +++ b/howtos/other_languages_package_manager/go.rst @@ -15,7 +15,7 @@ You can just clone the following example repository: .. code-block:: bash - $ git clone https://github.com/conan-community/conan-goserver-example + $ git clone https://github.com/conan-io/examples/tree/master/features/goserver Or, alternatively, manually create the folder and copy the following files inside: @@ -53,12 +53,12 @@ Create a *conanfile.txt*, with the following content: :caption: *conanfile.txt* [requires] - go-martini/1.0@lasote/stable + go-martini/1.0@ [imports] src, * -> ./deps/src -Our project requires a package, **go-martini/1.0@lasote/stable**, and we indicate that all **src contents** from all our requirements have +Our project requires a package, **go-martini/1.0@**, and we indicate that all **src contents** from all our requirements have to be copied to *./deps/src*. The package go-martini depends on go-inject, so Conan will handle automatically the go-inject dependency. @@ -109,24 +109,32 @@ Let's take a look at the *conanfile.py* of the **go inject** library: .. code-block:: python :caption: *conanfile.py* - from conans import ConanFile + import os + from conans import ConanFile, tools - class InjectConan(ConanFile): + + class GoInjectConan(ConanFile): name = "go-inject" version = "1.0" + license = "MIT" + homepage = "https://github.com/codegangsta/inject" + no_copy_source = True def source(self): - self.run("git clone https://github.com/codegangsta/inject.git") - self.run("cd inject && git checkout v1.0-rc1") # TAG v1.0-rc1 + tools.get("https://github.com/codegangsta/inject/archive/v1.0-rc1.tar.gz", + sha256="22b265ea391a19de6961aaa8811ecfcc5bbe7979594e30663c610821cdad6c7b") def package(self): - self.copy(pattern='*', dst='src/github.com/codegangsta/inject', src="inject", keep_path=True) + self.copy(pattern='*', + dst=os.path.join("src", "github.com", "codegangsta", "inject"), + src="inject-1.0-rc1", keep_path=True) + If you have read the :ref:`Building a hello world package `, the previous code may look quite simple to you. We want to pack **version 1.0** of the **go inject** library, so the **version** variable is **"1.0"**. In the ``source()`` method, we -declare how to obtain the source code of the library, in this case just by cloning the github repository and making a checkout of the -**v1.0-rc1** tag. In the ``package()`` method, we are just copying all the sources to a folder named "src/github.com/codegangsta/inject". +declare how to obtain the source code of the library, in this case just by downloading **v1.0-rc1** tag. +In the ``package()`` method, we are just copying all the sources to a folder named "src/github.com/codegangsta/inject". This way, we can keep importing the library in the same way: @@ -138,35 +146,42 @@ We can export and upload the package to a remote and we are done: .. code-block:: bash - $ conan export . lasote/stable # Or any other user/channel - $ conan upload go-inject/1.0@lasote/stable --all + $ conan create . # Or any other user/channel + $ conan upload go-inject/1.0@ --all Now look at the **go martini** conanfile: .. code-block:: python :caption: *conanfile.py* - from conans import ConanFile + import os + from conans import ConanFile, tools - class InjectConan(ConanFile): + + class GoMartiniConan(ConanFile): name = "go-martini" version = "1.0" - requires = 'go-inject/1.0@lasote/stable' + requires = "go-inject/1.0@" + license = "MIT" + homepage = "https://github.com/go-martini/martini" + no_copy_source = True def source(self): - self.run("git clone https://github.com/go-martini/martini.git") - self.run("cd martini && git checkout v1.0") # TAG v1.0 + tools.get("https://github.com/go-martini/martini/archive/v1.0.tar.gz", + sha256="3db135845d076d611f4420e0500e91625543a6b00dc9431cbe45d3571741281b") def package(self): - self.copy(pattern='*', dst='src/github.com/go-martini/martini', src="martini", keep_path=True) + self.copy(pattern="*", dst=os.path.join("src", "github.com", "go-martini", "martini"), + src="martini-1.0", keep_path=True) + -It is very similar. The only difference is the ``requires`` variable. It defines the **go-inject/1.0@lasote/stable** library, as a +It is very similar. The only difference is the ``requires`` variable. It defines the **go-inject/1.0@** library, as a requirement. .. code-block:: bash - $ conan export . lasote/stable # Or any other user/channel - $ conan upload go-martini/1.0@lasote/stable --all + $ conan create . # Or any other user/channel + $ conan upload go-martini/1.0@ --all Now we are able to use them easily and without the problems of versioning with github checkouts. diff --git a/howtos/run_conan_in_docker.rst b/howtos/run_conan_in_docker.rst index 4f0155be1156..1bc80e76b454 100644 --- a/howtos/run_conan_in_docker.rst +++ b/howtos/run_conan_in_docker.rst @@ -38,9 +38,9 @@ It is always recommended to upgrade Conan from pip first: .. code-block:: bash $ sudo pip install conan --upgrade # We make sure we are running the latest Conan version - $ git clone https://github.com/conan-community/conan-openssl - $ cd conan-openssl - $ conan create . user/channel + $ git clone https://github.com/conan-io/conan-center-index + $ cd conan-center-index/recipes/openssl/1.x.x + $ conan create . 1.1.1i@ Sharing a local folder with a Docker container @@ -50,8 +50,8 @@ You can share a local folder with your container, for example a project: .. code-block:: bash - $ git clone https://github.com/conan-community/conan-openssl - $ cd conan-openssl + $ git clone https://github.com/conan-io/conan-center-index + $ cd conan-center-index/recipes/openssl/1.x.x $ docker run -it -v$(pwd):/home/conan/project --rm conanio/gcc7 /bin/bash @@ -90,8 +90,8 @@ Building and uploading a package along with all its missing dependencies for ``L .. code-block:: bash - $ git clone https://github.com/conan-community/conan-openssl - $ cd conan-openssl + $ git clone https://github.com/conan-io/conan-center-index + $ cd conan-center-index/recipes/openssl/1.x.x $ docker run -it -v$(pwd):/home/conan/project --rm conanio/gcc49-armv7hf /bin/bash # Now we are running on the conangcc49-armv7hf container diff --git a/integrations/build_system/cmake/find_packages.rst b/integrations/build_system/cmake/find_packages.rst index 40a96d086df2..f9dd79e993de 100644 --- a/integrations/build_system/cmake/find_packages.rst +++ b/integrations/build_system/cmake/find_packages.rst @@ -85,5 +85,5 @@ Then repeat for the library names with CONAN_LIBS_XXX and the paths where the li self.copy("FindXXX.cmake", ".", ".") -.. _`conan's boost package`: https://github.com/conan-community/conan-boost.git -.. _`conan's zlib package`: https://github.com/conan-community/conan-zlib.git +.. _`conan's boost package`: https://github.com/conan-io/conan-center-index/tree/master/recipes/boost/all +.. _`conan's zlib package`: https://github.com/conan-io/conan-center-index/tree/master/recipes/zlib/1.2.11 diff --git a/integrations/ci/jenkins.rst b/integrations/ci/jenkins.rst index ce33e526d1c7..c521dae5392c 100644 --- a/integrations/ci/jenkins.rst +++ b/integrations/ci/jenkins.rst @@ -84,13 +84,15 @@ Example: Build a Conan package and upload it to Artifactory In this example we will call Conan :ref:`test package` command to create a binary packages and then upload it to Artifactory. We also upload the `build information`_: - + .. code-block:: groovy def artifactory_name = "artifactory" def artifactory_repo = "conan-local" - def repo_url = 'https://github.com/conan-community/conan-zlib.git' - def repo_branch = "release/1.2.11" + def repo_url = 'https://github.com/conan-io/conan-center-index.git' + def repo_branch = "master" + def recipe_folder = "recipes/zlib/1.2.11" + def recipe_version = "1.2.11" node { def server = Artifactory.server artifactory_name @@ -102,7 +104,9 @@ and then upload it to Artifactory. We also upload the `build information`_: } stage("Test recipe"){ - client.run(command: "create") + dir (recipe_folder) { + client.run(command: "create . ${recipe_version}@") + } } stage("Upload packages"){ diff --git a/integrations/cross_platform/buildroot.rst b/integrations/cross_platform/buildroot.rst index 10279706597b..f6dbfa4fdaac 100644 --- a/integrations/cross_platform/buildroot.rst +++ b/integrations/cross_platform/buildroot.rst @@ -117,8 +117,9 @@ Now let's go to the *conan-zlib.mk* that contains the Zlib data: CONAN_ZLIB_VERSION = 1.2.11 CONAN_ZLIB_LICENSE = Zlib CONAN_ZLIB_LICENSE_FILES = licenses/LICENSE - CONAN_ZLIB_SITE = $(call github,conan-community,conan-zlib,92d34d0024d64a8f307237f211e43ab9952ef0a1) + CONAN_ZLIB_SITE = $(call github,conan-io,conan-center-index,134dd3b84d629d27ba3474e01b688e9c0f25b9c8) CONAN_ZLIB_REFERENCE = zlib/$(CONAN_ZLIB_VERSION)@ + CONAN_ZLIB_SUBDIR = recipes/zlib/1.2.11 $(eval $(conan-package)) @@ -235,4 +236,4 @@ If you are interested in knowing more, we have a complete `blog post`_ about Bui .. _`Buildroot Project`: https://buildroot.org/ .. _`GPL-2.0-or-later`: https://spdx.org/licenses/GPL-2.0-or-later.html .. _`blog post`: https://blog.conan.io/2019/08/27/Creating-small-Linux-images-with-Buildroot.html -.. _`pkg-conan.mk`: https://github.com/conan-community/buildroot/blob/feature/conan/package/pkg-conan.mk \ No newline at end of file +.. _`pkg-conan.mk`: https://github.com/conan-io/examples/blob/features/buildroot/package/pkg-conan.mk diff --git a/reference/commands/output/user.rst b/reference/commands/output/user.rst index 9f68754b2b6a..4cc9406d8c14 100644 --- a/reference/commands/output/user.rst +++ b/reference/commands/output/user.rst @@ -30,7 +30,7 @@ List users per remote: :command:`conan user --json user.json` { "error":false, - "remotes":[ + "remotes":[ { "name":"conan-center", "user_name":"danimtb", @@ -41,11 +41,6 @@ List users per remote: :command:`conan user --json user.json` "user_name":null, "authenticated":false }, - { - "name":"conan-community", - "user_name":"danimtb", - "authenticated":true - }, { "name":"the_remote", "user_name":"foo", diff --git a/systems_cross_building/cross_building.rst b/systems_cross_building/cross_building.rst index 1d7854d4efe3..9c2ac69f92dc 100644 --- a/systems_cross_building/cross_building.rst +++ b/systems_cross_building/cross_building.rst @@ -591,13 +591,13 @@ RPI one: .. code-block:: bash - git clone https://github.com/conan-community/conan-zlib.git + git clone https://github.com/conan-io/conan-center-index.git - Call :command:`conan create` using the created profile. .. code-block:: bash - $ cd conan-zlib && conan create . -pr:h ../android_21_arm_clang -pr:b default + $ cd conan-center-index/recipes/zlib/1.2.11 && conan create . 1.2.11@ -pr:h ../android_21_arm_clang -pr:b default ... -- Build files have been written to: /tmp/conan-zlib/test_package/build/ba0b9dbae0576b9a23ce7005180b00e4fdef1198 @@ -623,7 +623,7 @@ integration section` in the documentation. - Check the :ref:`Creating conan packages to install dev tools` to learn more about how to create Conan packages for tools. - - Check the `mingw-installer `_ build require recipe as an example of packaging a compiler. + - Check the `msys2 `_ build require recipe as an example of packaging a compiler. diff --git a/uploading_packages/remotes.rst b/uploading_packages/remotes.rst index c939c426f221..1b365568c749 100644 --- a/uploading_packages/remotes.rst +++ b/uploading_packages/remotes.rst @@ -85,15 +85,6 @@ Bincrafters $ conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan -Conan Community -+++++++++++++++ - -.. warning:: - - The conan community repository is deprecated and no longer maintained. Packages in this repository - have been moved or are in the process of being added to `conan-center-index `_ - and served in `ConanCenter `_. - .. note:: If you are working in a team, you probably want to use the same remotes everywhere: developer machines, CI. The ``conan config install`` From dc6f7397937e66fd7ddac82026a7eafe99de8cf6 Mon Sep 17 00:00:00 2001 From: James Date: Thu, 21 Jan 2021 12:58:35 +0100 Subject: [PATCH 042/681] fix tools (#2001) --- reference/conanfile/tools/gnu.rst | 10 ++++++---- reference/conanfile/tools/meson.rst | 13 ++++++++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/reference/conanfile/tools/gnu.rst b/reference/conanfile/tools/gnu.rst index 0dbe99b02019..f18295115647 100644 --- a/reference/conanfile/tools/gnu.rst +++ b/reference/conanfile/tools/gnu.rst @@ -1,12 +1,14 @@ .. _make_toolchain: +conan.tools.gnu +=============== .. warning:: This is an **experimental** feature subject to breaking changes in future releases. MakeToolchain -============== +------------- The `MakeToolchain` can be used in the ``generate()`` method of ``conanfile.py``: @@ -129,7 +131,7 @@ items, please provide feedback at: https://github.com/conan-io/conan/issues definitions ------------ ++++++++++++ This attribute allows defining preprocessor definitions the same way that build helpers do: @@ -146,7 +148,7 @@ This will be translated to: generators ----------- +++++++++++ The ``MakeGenerator`` is being developed in-tandem with this toolchain because ideally they would be used in the same recipes and workflows. They have @@ -156,7 +158,7 @@ independent from each other. Thus, you can use this toolchain without using the Using the toolchain in developer flow -------------------------------------- ++++++++++++++++++++++++++++++++++++++ One of the advantages of using Conan toolchains is that it provides exact same "toolchain-related" variables that Conan will have within a recipe's diff --git a/reference/conanfile/tools/meson.rst b/reference/conanfile/tools/meson.rst index 0fdb3186d550..206a9d0eb7f7 100644 --- a/reference/conanfile/tools/meson.rst +++ b/reference/conanfile/tools/meson.rst @@ -1,7 +1,10 @@ .. _conan-meson-toolchain: +conan.tools.meson +================= + MesonToolchain -============== +-------------- .. warning:: @@ -84,14 +87,14 @@ This attribute allows defining Meson project options: - One project options definition for ``MYVAR`` in ``conan_meson_native.init`` or ``conan_meson_cross.ini`` file. Generators ----------- +++++++++++ The ``MesonToolchain`` only works with the ``pkg_config`` generator. Please, do not use other generators, as they can have overlapping definitions that can conflict. Using the toolchain in developer flow -------------------------------------- ++++++++++++++++++++++++++++++++++++++ One of the advantages of using Conan toolchains is that they can help to achieve the exact same build with local development flows, than when the package is created in the cache. @@ -109,8 +112,8 @@ With the ``MesonToolchain`` it is possible to do: $ meson setup --native-file conan_meson_native.ini build . $ meson compile -C build -Meson build helper ------------------- +Meson +----- The ``Meson()`` build helper that works with the ``MesonToolchain`` is also experimental, and subject to breaking change in the future. It will evolve to adapt and complement the From b5a987246da0af21975849174b82862925e8ca85 Mon Sep 17 00:00:00 2001 From: czoido Date: Thu, 21 Jan 2021 16:31:45 +0100 Subject: [PATCH 043/681] fail links on PRs --- .ci/test.jenkins | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/test.jenkins b/.ci/test.jenkins index 9334c08feb11..1b7d7907aac5 100644 --- a/.ci/test.jenkins +++ b/.ci/test.jenkins @@ -32,7 +32,7 @@ node('Linux') { linkcheck: { image.inside { int output = sh(script: 'make linkcheck', returnStatus: true) - if (output != 0 && isMaster) { + if (output != 0) { currentBuild.result = 'FAILURE' error('Stop here, linkcheck failed!') } From 1445b0512f86f74a224b1b228f0f05c4d85cd4ab Mon Sep 17 00:00:00 2001 From: czoido Date: Thu, 21 Jan 2021 16:50:34 +0100 Subject: [PATCH 044/681] fix link --- integrations/cross_platform/buildroot.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/integrations/cross_platform/buildroot.rst b/integrations/cross_platform/buildroot.rst index f6dbfa4fdaac..7386ffa9311c 100644 --- a/integrations/cross_platform/buildroot.rst +++ b/integrations/cross_platform/buildroot.rst @@ -236,4 +236,3 @@ If you are interested in knowing more, we have a complete `blog post`_ about Bui .. _`Buildroot Project`: https://buildroot.org/ .. _`GPL-2.0-or-later`: https://spdx.org/licenses/GPL-2.0-or-later.html .. _`blog post`: https://blog.conan.io/2019/08/27/Creating-small-Linux-images-with-Buildroot.html -.. _`pkg-conan.mk`: https://github.com/conan-io/examples/blob/features/buildroot/package/pkg-conan.mk From c33a650e3af6628e743a075686da085a7065ea41 Mon Sep 17 00:00:00 2001 From: czoido Date: Thu, 21 Jan 2021 16:57:41 +0100 Subject: [PATCH 045/681] old link --- integrations/cross_platform/buildroot.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/cross_platform/buildroot.rst b/integrations/cross_platform/buildroot.rst index 7386ffa9311c..be3f9ef6aa71 100644 --- a/integrations/cross_platform/buildroot.rst +++ b/integrations/cross_platform/buildroot.rst @@ -236,3 +236,4 @@ If you are interested in knowing more, we have a complete `blog post`_ about Bui .. _`Buildroot Project`: https://buildroot.org/ .. _`GPL-2.0-or-later`: https://spdx.org/licenses/GPL-2.0-or-later.html .. _`blog post`: https://blog.conan.io/2019/08/27/Creating-small-Linux-images-with-Buildroot.html +.. _`pkg-conan.mk`: https://github.com/conan-community/buildroot/blob/feature/conan/package/pkg-conan.mk From f105190f8cab739874f3bb312bcf811675b694ac Mon Sep 17 00:00:00 2001 From: Simone Gasparini Date: Sat, 30 Jan 2021 22:45:04 +0100 Subject: [PATCH 046/681] [getting started] add reference to cmake section (#2006) --- getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started.rst b/getting_started.rst index 90d0a84884a4..4c73e0c7e29c 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -204,7 +204,7 @@ An MD5 hash calculator using the Poco Libraries .. note:: There are other integrations with CMake, like the ``cmake_find_package`` generators, that will - use the ``find_package()`` CMake syntax. + use the ``find_package()`` CMake syntax (see :ref:`cmake` section). 7. Now we are ready to build and run our MD5 app: From d320e9623bdcac46554f47594a990781361594eb Mon Sep 17 00:00:00 2001 From: Jerry Wiltse Date: Mon, 1 Feb 2021 06:54:24 -0500 Subject: [PATCH 047/681] Update definitions to preprocessor_definitions (#2007) --- reference/conanfile/tools/gnu.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/tools/gnu.rst b/reference/conanfile/tools/gnu.rst index f18295115647..213d17d53bd5 100644 --- a/reference/conanfile/tools/gnu.rst +++ b/reference/conanfile/tools/gnu.rst @@ -139,7 +139,7 @@ This attribute allows defining preprocessor definitions the same way that build def generate(self): tc = MakeToolchain(self) - tc.definitions["MYVAR"] = "MyValue" + tc.preprocessor_definitions["MYVAR"] = "MyValue" tc.generate() This will be translated to: From 0994c910cde6c1973f4be0f6edb48750b8fbc1d7 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 2 Feb 2021 10:09:17 +0100 Subject: [PATCH 048/681] Release 1.33.1 (#2010) * Rename conan.cfg to global.conf (#2008) * conan.cfg to global.conf * rename file * fix format * fix files * fix title * change catalyst to lowercase (#2009) * conan 1.33.1 --- .ci/publish.jenkins | 2 +- changelog.rst | 8 ++++++++ conf.py | 2 +- reference/config_files.rst | 2 +- .../config_files/{conan_cfg.rst => global_conf.rst} | 12 ++++++------ reference/config_files/settings.yml.rst | 2 +- 6 files changed, 18 insertions(+), 10 deletions(-) rename reference/config_files/{conan_cfg.rst => global_conf.rst} (79%) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index 55051c331c35..5b827df43167 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,7 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ - 'release/1.33.0': '1.33', + 'release/1.33.1': '1.33', 'release/1.32.1': '1.32', 'release/1.31.4': '1.31', 'release/1.30.2': '1.30', diff --git a/changelog.rst b/changelog.rst index 76b7cbeb1989..1dbfe9c4ee60 100644 --- a/changelog.rst +++ b/changelog.rst @@ -21,6 +21,14 @@ Check https://github.com/conan-io/conan for issues and more details about develo Conan 1.33 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.33.1 (02-Feb-2021) +-------------------- + +- Fix: Rename _conan.cfg_ to _global.conf_. `#8422 `_ . Docs `here `__ +- Fix: Make CMakeDeps generator available in declarative mode ``generators = "CMakeDeps"`` `#8416 `_ +- Fix: Make the new Macos subsystem Catalyst lowercase to be consistent with existing subsystems. `#8389 `_ . Docs `here `__ +- BugFix: Fix Apple Catalyst flags. `#8389 `_ . Docs `here `__ + 1.33.0 (20-Jan-2021) -------------------- diff --git a/conf.py b/conf.py index 2988386fa433..cbad054deaf9 100644 --- a/conf.py +++ b/conf.py @@ -43,7 +43,7 @@ # The short X.Y version. version = "1.33" # The full version, including alpha/beta/rc tags. -release = u'1.33.0' +release = u'1.33.1' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): diff --git a/reference/config_files.rst b/reference/config_files.rst index fbf6208afa5b..2c8f09b80419 100644 --- a/reference/config_files.rst +++ b/reference/config_files.rst @@ -12,7 +12,7 @@ These are the most important configuration files, used to customize conan. config_files/artifacts.properties config_files/client_certificates config_files/conan.conf - config_files/conan_cfg + config_files/global_conf config_files/conandata.yml config_files/default_profile config_files/editable_layout diff --git a/reference/config_files/conan_cfg.rst b/reference/config_files/global_conf.rst similarity index 79% rename from reference/config_files/conan_cfg.rst rename to reference/config_files/global_conf.rst index 270eb74b1b36..ba26cc4f34dc 100644 --- a/reference/config_files/conan_cfg.rst +++ b/reference/config_files/global_conf.rst @@ -1,14 +1,14 @@ -.. _conan_cfg: +.. _global_conf: -conan.cfg -========= +global.conf +=========== .. warning:: This new configuration mechanism is an **experimental** feature subject to breaking changes in future releases. -The **conan.cfg** file is located in the Conan user home directory. +The **global.conf** file is located in the Conan user home directory. Global configuration -------------------- @@ -21,8 +21,8 @@ Global configuration Tools configurations -------------------- -Tools and user configurations allows them to be defined both in the *conan.cfg* file and in profile files. Profile values will -have priority over globally defined ones in *conan.cfg*, and can be defined as: +Tools and user configurations allows them to be defined both in the *global.conf* file and in profile files. Profile values will +have priority over globally defined ones in *global.conf*, and can be defined as: .. code-block:: text diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index aa84241448b1..77e51210a5f2 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -32,7 +32,7 @@ are possible. These are the **default** values, but it is possible to customize Macos: version: [None, "10.6", "10.7", "10.8", "10.9", "10.10", "10.11", "10.12", "10.13", "10.14", "10.15", "11.0"] sdk: [None, "macosx"] - subsystem: [None, "Catalyst"] + subsystem: [None, catalyst] Android: api_level: ANY iOS: From d9339df2f5cb28543490bfb79ad0597dbef1f9f8 Mon Sep 17 00:00:00 2001 From: SSE4 Date: Tue, 2 Feb 2021 17:20:51 +0700 Subject: [PATCH 049/681] - meson : add target argument (#2011) Signed-off-by: SSE4 --- reference/conanfile/tools/meson.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reference/conanfile/tools/meson.rst b/reference/conanfile/tools/meson.rst index 206a9d0eb7f7..98be9ea6ee83 100644 --- a/reference/conanfile/tools/meson.rst +++ b/reference/conanfile/tools/meson.rst @@ -162,10 +162,13 @@ build() .. code:: python - def build(self): + def build(self, target=None): Calls the build system. Equivalent to :command:`meson compile -C .` in the build folder. +Parameters: + - **target** (Optional, Defaulted to ``None``): Specifies the target to execute. The default *all* target will be built if ``None`` is specified. + install() +++++++++ From eff7a69c291253453abe081b5c58abc5ab25de3f Mon Sep 17 00:00:00 2001 From: James Date: Wed, 3 Feb 2021 10:18:10 +0100 Subject: [PATCH 050/681] fix lowercase package names (#2013) --- .../define_abi_compatibility.rst | 24 ++++++------ creating_packages/getting_started.rst | 6 +-- devtools/running_packages.rst | 38 +++++++++---------- howtos/makefiles.rst | 6 +-- integrations/custom.rst | 4 +- mastering/envvars.rst | 2 +- reference/build_helpers/cmake.rst | 2 +- reference/conanfile/attributes.rst | 12 +++--- reference/conanfile/methods.rst | 20 +++++----- reference/generators/b2.rst | 4 +- reference/generators/cmake.rst | 14 +++---- versioning/version_ranges.rst | 10 ++--- 12 files changed, 71 insertions(+), 71 deletions(-) diff --git a/creating_packages/define_abi_compatibility.rst b/creating_packages/define_abi_compatibility.rst index 2f5295274956..d2ebdcc84b40 100644 --- a/creating_packages/define_abi_compatibility.rst +++ b/creating_packages/define_abi_compatibility.rst @@ -11,7 +11,7 @@ different binary: .. code-block:: python - class MyLibConanPackage(ConanFile): + class MyLibConanPackage(ConanFile): name = "mylib" version = "1.0" settings = "os", "arch", "compiler", "build_type" @@ -54,8 +54,8 @@ The recipe for such a package will be to generate a single binary package, no mo .. code-block:: python - class MyLibConanPackage(ConanFile): - name = "MyLib" + class MyLibConanPackage(ConanFile): + name = "mylib" version = "1.0" # no settings defined! @@ -135,7 +135,7 @@ The required package has the same result again ``af04...46ad``. Now we can try u .. code-block:: bash - $ conan install Pkg/1.0@myuser/mychannel -s compiler=gcc -s compiler.version=4.4 ... + $ conan install pkg/1.0@myuser/mychannel -s compiler=gcc -s compiler.version=4.4 ... Requirements pkg/1.0@myuser/mychannel from local @@ -144,7 +144,7 @@ The required package has the same result again ``af04...46ad``. Now we can try u The computed package ID is different which means that we need a different binary package for GCC 4.4. -The same way we have adjusted the ``self.info.settings``, we could set the ``self.info.options`` values if needed. +The same way we have adjusted the ``self.info.settings``, we could set the ``self.info.options`` values if needed. If you want to make packages independent on ``build_type`` removing the ``build_type`` from the package settings in the ``package_id()`` will work for OSX and Linux. However when building with Visual studio the ``compiler.runtime`` field will change based on the ``build_type`` value so in that case you will also want to delete the compiler runtime field like so: .. code-block:: python @@ -196,7 +196,7 @@ That can be defined as: class Pkg(ConanFile): settings = "os", "compiler", "arch", "build_type" - + def package_id(self): if self.settings.compiler == "gcc" and self.settings.compiler.version == "4.9": for version in ("4.8", "4.7"): @@ -225,7 +225,7 @@ It is the responsibility of the developer to guarantee that such binaries are in self.compatible_packages.append(compatible_pkg) This recipe defines that the binaries are compatible with binaries of itself built with a lower optimization value. It can -have up to 3 different binaries, one for each different value of ``optimized`` option. The ``package_id()`` defines that a binary +have up to 3 different binaries, one for each different value of ``optimized`` option. The ``package_id()`` defines that a binary built with ``optimized=1`` can be perfectly linked and will run even if someone defines ``optimized=2``, or ``optimized=3`` in their configuration. But a binary built with ``optimized=2`` will not be considered if the requested one is ``optimized=1``. @@ -558,7 +558,7 @@ All the modes can be applied to all dependencies, or to individual ones: .. code-block:: text - my_other_lib/1.3.4-a4+b3@user/testing => my_other_lib/1.3.4-a4+b3 + my_other_lib/1.3.4-a4+b3@user/testing => my_other_lib/1.3.4-a4+b3 - ``full_recipe_mode()``: Any change in the reference of the requirement (user & channel too) changes the package ID. @@ -571,7 +571,7 @@ All the modes can be applied to all dependencies, or to individual ones: .. code-block:: text - my_other_lib/1.3.4-a4+b3@user/testing => my_other_lib/1.3.4-a4+b3@user/testing + my_other_lib/1.3.4-a4+b3@user/testing => my_other_lib/1.3.4-a4+b3@user/testing - ``full_package_mode()``: Any change in the required version, user, channel or package ID changes the package ID. @@ -585,7 +585,7 @@ All the modes can be applied to all dependencies, or to individual ones: .. code-block:: text - MyOtherLib/1.3.4-a4+b3@user/testing:73b..fa56 => MyOtherLib/1.3.4-a4+b3@user/testing:73b..fa56 + MyOtherLib/1.3.4-a4+b3@user/testing:73b..fa56 => MyOtherLib/1.3.4-a4+b3@user/testing:73b..fa56 - ``unrelated_mode()``: Requirements do not change the package ID. @@ -600,7 +600,7 @@ All the modes can be applied to all dependencies, or to individual ones: .. code-block:: text - mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 => mypkg/1.3.4-a4+b3@user/testing#RREV1 + mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 => mypkg/1.3.4-a4+b3@user/testing#RREV1 .. code-block:: python @@ -617,7 +617,7 @@ All the modes can be applied to all dependencies, or to individual ones: .. code-block:: text # The full reference of the dependency package binary will be used as-is - mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 => mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 + mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 => mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 .. code-block:: python diff --git a/creating_packages/getting_started.rst b/creating_packages/getting_started.rst index 850c2c9ff3af..92545a4a5622 100644 --- a/creating_packages/getting_started.rst +++ b/creating_packages/getting_started.rst @@ -136,7 +136,7 @@ basics: .. seealso:: Check the :ref:`existing build helpers `. - The ``package()`` method copies artifacts (headers, libs) from the build folder to the final - package folder. + package folder. - Finally, the ``package_info()`` method defines that the consumer must link with the "hello" library when using this package. Other information as include or lib paths can be defined as well. This @@ -360,9 +360,9 @@ There are some exceptions to the above. For example, settings can be defined per .. code-block:: bash - $ conan install . -s MyPkg:compiler=gcc -s compiler=clang .. + $ conan install . -s mypkg:compiler=gcc -s compiler=clang .. -This will use ``gcc`` for MyPkg and ``clang`` for the rest of the dependencies (extremely rare case). +This will use ``gcc`` for "mypkg" and ``clang`` for the rest of the dependencies (extremely rare case). There are situations whereby many packages use the same option, thereby allowing you to set its value once using patterns, like: diff --git a/devtools/running_packages.rst b/devtools/running_packages.rst index 4610f2933754..6a056674ae46 100644 --- a/devtools/running_packages.rst +++ b/devtools/running_packages.rst @@ -123,13 +123,13 @@ Using the `deploy` generator The :ref:`deploy generator ` is used to have all the dependencies of an application copied into a single place. Then all the files can be repackaged into the distribution format of choice. -For instance, if the application depends on boost, we may not know that it also requires many other 3rt-party libraries, -such as -`zlib `_, -`bzip2 `_, -`lzma `_, -`zstd `_, -`iconv `_, etc. +For instance, if the application depends on boost, we may not know that it also requires many other 3rt-party libraries, +such as +`zlib `_, +`bzip2 `_, +`lzma `_, +`zstd `_, +`iconv `_, etc. .. code-block:: bash @@ -180,7 +180,7 @@ appropriate format for distribution. The following code shows how to read the li While with the `deploy` generator, all the files were copied into a folder. The advantage with the `json` one is that you have fine-grained control over the files and those can be directly copied to the desired layout. -In that sense, the script above could be easily modified to apply some sort of filtering (e.g. to copy only shared libraries, +In that sense, the script above could be easily modified to apply some sort of filtering (e.g. to copy only shared libraries, and omit any static libraries or auxiliary files such as pkg-config .pc files). Additionally, you could also write a simple startup script for your application with the extracted information like this: @@ -213,14 +213,14 @@ Running from packages If a dependency has an executable that we want to run in the conanfile, it can be done directly in code using the ``run_environment=True`` argument. It internally uses a ``RunEnvironment()`` helper. -For example, if we want to execute the :command:`greet` app while building the ``Consumer`` package: +For example, if we want to execute the :command:`greet` app while building the ``consumer`` package: .. code-block:: python from conans import ConanFile, tools, RunEnvironment class ConsumerConan(ConanFile): - name = "Consumer" + name = "consumer" version = "0.1" settings = "os", "compiler", "build_type", "arch" requires = "hello/0.1@user/testing" @@ -242,10 +242,10 @@ Instead of using the environment, it is also possible to explicitly access the p .. code-block:: python def build(self): - path = os.path.join(self.deps_cpp_info["Hello"].rootpath, "bin") + path = os.path.join(self.deps_cpp_info["hello"].rootpath, "bin") self.run(["%s/greet" % path]) -Note that this might not be enough if shared libraries exist. Using the ``run_environment=True`` helper above +Note that this might not be enough if shared libraries exist. Using the ``run_environment=True`` helper above is a more complete solution. This example also demonstrates using a list to specify the command to run. This bypasses the system shell and @@ -274,7 +274,7 @@ The consumer package is simple, as the ``PATH`` environment variable contains th Read the :ref:`next section ` for a more comprenhensive explanation about using -packaged executables in your recipe methods. +packaged executables in your recipe methods. .. _repackage: @@ -352,7 +352,7 @@ Glibc is not a just C standard library, as it provides: - BSD functions (like BSD sockets). - Wrappers for OS-specific APIs (like Linux system calls) -Even if your application doesn't use directly any of these functions, they are often used by other libraries, +Even if your application doesn't use directly any of these functions, they are often used by other libraries, so, in practice, it's almost always in actual use. There are other implementations of the C standard library that present the same challenge, such as @@ -400,7 +400,7 @@ Similarly to the standard C library `glibc`, running the application linked with /hello: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.21' not found (required by /hello) /hello: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.26' not found (required by /hello) -Fortunately, this is much easier to address by just adding ``-static-libstdc++`` compiler flag. Unlike C runtime, C++ runtime can be +Fortunately, this is much easier to address by just adding ``-static-libstdc++`` compiler flag. Unlike C runtime, C++ runtime can be linked statically safely, because it doesn't use system calls directly, but instead relies on ``libc`` to provide required wrappers. Compiler runtime @@ -415,9 +415,9 @@ referenced directly in code and are mostly implicitly inserted by the compiler i $ ldd ./a.out libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6626aee000) -you can avoid this kind of dependency by the using of the ``-static-libgcc`` compiler flag. However, it's not always sane thing to do, as -there are certain situations when applications should use shared runtime. The most common is when the application wishes to throw and catch -exceptions across different shared libraries. Check out the `GCC manual `_ for the +you can avoid this kind of dependency by the using of the ``-static-libgcc`` compiler flag. However, it's not always sane thing to do, as +there are certain situations when applications should use shared runtime. The most common is when the application wishes to throw and catch +exceptions across different shared libraries. Check out the `GCC manual `_ for the detailed information. System API (system calls) @@ -430,5 +430,5 @@ provided by ``glibc``). As a result, if the application was compiled on a machine with a newer kernel and build system used to auto-detect available system calls, it may fail to execute properly on machines with older kernels. -The solution is to either use a build machine with lowest supported kernel, or model supported operation system (just like in case of ``glibc``). +The solution is to either use a build machine with lowest supported kernel, or model supported operation system (just like in case of ``glibc``). Check out sections :ref:`add_new_settings` and :ref:`add_new_sub_settings` to get a piece of information on how to model distribution in conan settings. diff --git a/howtos/makefiles.rst b/howtos/makefiles.rst index cb4cd6602a05..fb6b063b5e0a 100644 --- a/howtos/makefiles.rst +++ b/howtos/makefiles.rst @@ -14,7 +14,7 @@ but could be extended to shared libraries too. The Makefiles surely can be impro Creating packages ----------------- -Sources for this example can be found in our `examples repository `_ +Sources for this example can be found in our `examples repository `_ in the *features/makefiles* folder: .. code-block:: bash @@ -112,7 +112,7 @@ There you can also see a *src* folder with a *Makefile* creating an executable: $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@ $(OUT): $(OBJ) - $(CXX) -o $(OUT) $(OBJ) $(LDFLAGS) $(LIBS) + $(CXX) -o $(OUT) $(OBJ) $(LDFLAGS) $(LIBS) And also a *conanfile.py* very similar to the previous one. In this case adding a ``requires`` and a ``deploy()`` method: @@ -124,7 +124,7 @@ And also a *conanfile.py* very similar to the previous one. In this case adding from conans import tools class AppConan(ConanFile): - name = "App" + name = "app" version = "0.1" settings = "os", "compiler", "build_type", "arch" exports_sources = "src/*" diff --git a/integrations/custom.rst b/integrations/custom.rst index ff76ed1a05cd..1b2e0847d5b6 100644 --- a/integrations/custom.rst +++ b/integrations/custom.rst @@ -221,12 +221,12 @@ generator to simplify the task for your build system. print(self.env) print("--------- FROM MyLib -------------") - print(self.deps_env_info["MyLib"].some_env_var) + print(self.deps_env_info["mylib"].some_env_var) # User declared variables (from requirements self.user_info objects) # are available in the self.deps_user_info object print("--------- FROM MyLib -------------") - print(self.deps_user_info["MyLib"].some_user_var) + print(self.deps_user_info["mylib"].some_user_var) Create your own generator ------------------------- diff --git a/mastering/envvars.rst b/mastering/envvars.rst index 14d96d4f2bc4..05e51c295e5e 100644 --- a/mastering/envvars.rst +++ b/mastering/envvars.rst @@ -31,7 +31,7 @@ If you want to override an environment variable that a package has inherited fro .. code-block:: bash - conan install . -e MyPackage:PATH=/other/path + conan install . -e mypkg:PATH=/other/path If you want to define an environment variable, but you want to append the variables declared in your requirements, you can use the ``[]`` syntax: diff --git a/reference/build_helpers/cmake.rst b/reference/build_helpers/cmake.rst index ba8512759a63..01c6bcb5a75b 100644 --- a/reference/build_helpers/cmake.rst +++ b/reference/build_helpers/cmake.rst @@ -442,7 +442,7 @@ The following example of ``conanfile.py`` shows you how to manage a project with from conans import ConanFile, CMake class SomePackage(ConanFile): - name = "SomePackage" + name = "somepkg" version = "1.0.0" settings = "os", "compiler", "build_type", "arch" generators = "cmake" diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index b62be4e72b86..0407d9a23ab9 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -10,7 +10,7 @@ Attributes name ---- -This is a string, with a minimum of 2 and a maximum of 50 characters (though shorter names are recommended), that defines the package name. It will be the ``/version@user/channel`` of the package reference. +This is a string, with a minimum of 2 and a maximum of 50 characters (though shorter names are recommended), that defines the package name. It will be the ``/version@user/channel`` of the package reference. It should match the following regex ``^[a-zA-Z0-9_][a-zA-Z0-9_\+\.-]{1,50}$``, so start with alphanumeric or underscore, then alphanumeric, underscore, +, ., - characters. The name is only necessary for ``export``-ing the recipe into the local cache (``export`` and ``create`` commands), if they are not defined in the command line. @@ -20,7 +20,7 @@ However, the most common and suggested approach would be to define it in plain t version ------- -The version attribute will define the version part of the package reference: ``PkgName/@user/channel`` +The version attribute will define the version part of the package reference: ``pkgName/@user/channel`` It is a string, and can take any value, matching the same constraints as the ``name`` attribute. In case the version follows semantic versioning in the form ``X.Y.Z-pre1+build2``, that value might be used for requiring this package through version ranges instead of exact versions. @@ -411,14 +411,14 @@ go over all of them for the example recipe ``mypkg`` defined above: setting=value [options] - MyPkg:shared=False + mypkg:shared=False - Last way of defining values for options, with the highest priority over them all, is to pass these values using the command argument :command:`-o` in the command line: .. code-block:: bash - $ conan install . -o MyPkg:shared=True -o OtherPkg:option=value + $ conan install . -o mypkg:shared=True -o otherpkg:option=value Values for options can be also conditionally assigned (or even deleted) in the methods ``configure()`` and ``config_options()``, the @@ -1539,7 +1539,7 @@ provides This is an **experimental** feature subject to breaking changes in future releases. -This attribute declares that the recipe provides the same functionality as other recipe(s). The attribute is usually needed if two or more +This attribute declares that the recipe provides the same functionality as other recipe(s). The attribute is usually needed if two or more libraries implement the same API to prevent link-time and run-time conflicts (ODR violations). One typical situation is forked libraries. Some examples are: @@ -1581,5 +1581,5 @@ To declare that a recipe provides the functionality of several different recipes version = "1.0" provides = "cblas", "lapack" -If the attribute is omitted, the value of the attribute is assumed to be equal to the current package name. Thus, it's redundant for +If the attribute is omitted, the value of the attribute is assumed to be equal to the current package name. Thus, it's redundant for ``libjpeg`` recipe to declare that it provides ``libjpeg``, it's already implicitly assumed by Conan. diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 643062481093..db48ef09d67f 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -296,10 +296,10 @@ using the ``deps_cpp_info`` object: class OtherConan(ConanFile): name = "OtherLib" version = "1.0" - requires = "MyLib/1.6.0@conan/stable" + requires = "mylib/1.6.0@conan/stable" def build(self): - self.output.warn(self.deps_cpp_info["MyLib"].libdirs) + self.output.warn(self.deps_cpp_info["mylib"].libdirs) .. note:: @@ -344,10 +344,10 @@ If your recipe has requirements, you can access to your requirements ``env_info` class OtherConan(ConanFile): name = "OtherLib" version = "1.0" - requires = "MyLib/1.6.0@conan/stable" + requires = "mylib/1.6.0@conan/stable" def build(self): - self.output.warn(self.deps_env_info["MyLib"].othervar) + self.output.warn(self.deps_env_info["mylib"].othervar) .. _method_package_info_user_info: @@ -362,7 +362,7 @@ Currently only the ``cmake``, ``cmake_multi`` and ``txt`` generators supports `` .. code-block:: python class MyLibConan(ConanFile): - name = "MyLib" + name = "mylib" version = "1.6.0" # ... @@ -376,12 +376,12 @@ recipe has requirements, you can access to your requirements ``user_info`` using .. code-block:: python class OtherConan(ConanFile): - name = "OtherLib" + name = "otherlib" version = "1.0" - requires = "MyLib/1.6.0@conan/stable" + requires = "mylib/1.6.0@conan/stable" def build(self): - self.out.warn(self.deps_user_info["MyLib"].var1) + self.out.warn(self.deps_user_info["mylib"].var1) .. important:: @@ -395,7 +395,7 @@ recipe has requirements, you can access to your requirements ``user_info`` using ... # In the dependent conanfile - jars = self.deps_user_info["Pkg"].jars + jars = self.deps_user_info["pkg"].jars jar_list = jars.replace(" ", "").split(",") .. _method_configure_config_options: @@ -498,7 +498,7 @@ can be done: del self.options.shared This will be executed before the actual assignment of ``options`` (then, such ``options`` values cannot be used inside this function), so -the command :command:`conan install -o Pkg:shared=True` will raise an exception in Windows saying that ``shared`` is not an option for such +the command :command:`conan install -o pkg:shared=True` will raise an exception in Windows saying that ``shared`` is not an option for such package. .. _invalid_configuration: diff --git a/reference/generators/b2.rst b/reference/generators/b2.rst index 3d1d5bcca101..99054021bbbc 100644 --- a/reference/generators/b2.rst +++ b/reference/generators/b2.rst @@ -204,7 +204,7 @@ name in lower case. For example: .. code-block:: python class MyLibConan(ConanFile): - name = "MyLib" + name = "mylib" version = "1.6.0" # ... @@ -212,7 +212,7 @@ name in lower case. For example: def package_info(self): self.user_info.var1 = 2 -When other library requires ``MyLib`` and uses the ``b2`` generator: +When other library requires ``mylib`` and uses the ``b2`` generator: .. code-block:: text :caption: *conanbuildinfo-XXX.jam* diff --git a/reference/generators/cmake.rst b/reference/generators/cmake.rst index 0db99db3a0fc..37c08eb5f840 100644 --- a/reference/generators/cmake.rst +++ b/reference/generators/cmake.rst @@ -18,7 +18,7 @@ Variables in *conanbuildinfo.cmake* - **Package declared variables**: For each requirement *conanbuildinfo.cmake* file declares the following variables. Where ```` is the placeholder for the name of - the require in uppercase (``ZLIB`` for ``zlib/1.2.8@lasote/stable``) or the one declared in ``cpp_info.name`` or in + the require in uppercase (``ZLIB`` for ``zlib/1.2.8@lasote/stable``) or the one declared in ``cpp_info.name`` or in ``cpp_info.names["cmake"]`` if specified: +---------------------------------------+----------------------------------------------------------------------+ @@ -113,7 +113,7 @@ Variables in *conanbuildinfo.cmake* .. code-block:: python class MyLibConan(ConanFile): - name = "MyLib" + name = "mylib" version = "1.6.0" # ... @@ -121,7 +121,7 @@ Variables in *conanbuildinfo.cmake* def package_info(self): self.user_info.var1 = 2 - Other library requiring ``MyLib`` and using this generator will get: + Other library requiring ``mylib`` and using this generator will get: .. code-block:: cmake :caption: *conanbuildinfo.cmake* @@ -194,12 +194,12 @@ This method can be disabled setting the :ref:`conan_disable_check_compiler` vari conan_output_dirs_setup() +++++++++++++++++++++++++ -Adjusts each `CMAKE_RUNTIME_OUTPUT_DIRECTORY` variable to be ``${CMAKE_CURRENT_BINARY_DIR}/bin`` -and each ``CMAKE_ARCHIVE_OUTPUT_DIRECTORY`` and ``CMAKE_LIBRARY_OUTPUT_DIRECTORY`` variable to be +Adjusts each `CMAKE_RUNTIME_OUTPUT_DIRECTORY` variable to be ``${CMAKE_CURRENT_BINARY_DIR}/bin`` +and each ``CMAKE_ARCHIVE_OUTPUT_DIRECTORY`` and ``CMAKE_LIBRARY_OUTPUT_DIRECTORY`` variable to be ``${CMAKE_CURRENT_BINARY_DIR}/lib``. -Calling this method makes writing the ``package()`` method for recipies easier. All artifacts will -always be found in the same location. Otherwise, they may be found in different locations depending +Calling this method makes writing the ``package()`` method for recipies easier. All artifacts will +always be found in the same location. Otherwise, they may be found in different locations depending on your build environment (eg Linux vs Windows). conan_set_find_library_paths() diff --git a/versioning/version_ranges.rst b/versioning/version_ranges.rst index 5d22227468af..d131719de937 100644 --- a/versioning/version_ranges.rst +++ b/versioning/version_ranges.rst @@ -6,15 +6,15 @@ Version ranges Version range expressions are supported, both in ``conanfile.txt`` and in ``conanfile.py`` requirements. -The syntax uses brackets. The square brackets are the way to inform Conan that is a version range. Otherwise, versions are plain strings. They can be whatever you want them to be (up to limitations of length and allowed characters). +The syntax uses brackets. The square brackets are the way to inform Conan that is a version range. Otherwise, versions are plain strings. They can be whatever you want them to be (up to limitations of length and allowed characters). .. code-block:: python class HelloConan(ConanFile): - requires = "Pkg/[>1.0 <1.8]@user/stable" + requires = "pkg/[>1.0 <1.8]@user/stable" -So when specifying ``Pkg/[expression]@user/stable``, it means that ``expression`` will be evaluated as a version range. Otherwise, it will be understood as plain text, so ``requires = "Pkg/version@user/stable"`` always means to use the version ``version`` literally. +So when specifying ``pkg/[expression]@user/stable``, it means that ``expression`` will be evaluated as a version range. Otherwise, it will be understood as plain text, so ``requires = "pkg/version@user/stable"`` always means to use the version ``version`` literally. There are some packages that do not follow semver. A popular one would be the OpenSSL package with versions as ``1.0.2n``. They cannot be used with version-ranges. To require such packages you always have to use explicit versions (without brackets). @@ -41,8 +41,8 @@ There are two options for the version range: .. code-block:: python [>1.1 <2.1, include_prerelease=True] # Would e.g. accept "2.0.0-pre.1" as match - [~1.2.3, loose=False] # Would only accept correct Semantic Versioning strings. - # E.g. version "1.2.3.4" would not be accepted. + [~1.2.3, loose=False] # Would only accept correct Semantic Versioning strings. + # E.g. version "1.2.3.4" would not be accepted. [~1.2.3, loose=False, include_prerelease=True] # Both options can be used for the same version range. Version range expressions are evaluated at the time of building the dependency graph, from From 3cdb5d3fc9981ac23ff88543d6c772cdc1dfe588 Mon Sep 17 00:00:00 2001 From: James Date: Thu, 4 Feb 2021 16:13:15 +0100 Subject: [PATCH 051/681] remove training banner (#2015) --- _themes/conan/layout.html | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/_themes/conan/layout.html b/_themes/conan/layout.html index 636db4743857..45d11fde4e7f 100644 --- a/_themes/conan/layout.html +++ b/_themes/conan/layout.html @@ -158,13 +158,11 @@ {% include "breadcrumbs.html" %} - -
+
{% block body %}{% endblock %} From 06b1ae7f4f05c76dc7c36b58fe57cc1f98772c24 Mon Sep 17 00:00:00 2001 From: chausner Date: Mon, 8 Feb 2021 11:22:02 +0100 Subject: [PATCH 052/681] Fix incorrect indentation in define_abi_compatibility.rst (#2017) --- creating_packages/define_abi_compatibility.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/creating_packages/define_abi_compatibility.rst b/creating_packages/define_abi_compatibility.rst index d2ebdcc84b40..291047627eee 100644 --- a/creating_packages/define_abi_compatibility.rst +++ b/creating_packages/define_abi_compatibility.rst @@ -598,7 +598,7 @@ All the modes can be applied to all dependencies, or to individual ones: `pkg/version@user/channel#RREV:pkg_id` (including the recipe revision), will be taken into account to compute the consumer package ID - .. code-block:: text + .. code-block:: text mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 => mypkg/1.3.4-a4+b3@user/testing#RREV1 @@ -614,7 +614,7 @@ All the modes can be applied to all dependencies, or to individual ones: This is the most strict mode. Any change in the upstream will produce new consumers package IDs, becoming a fully deterministic binary model. - .. code-block:: text + .. code-block:: text # The full reference of the dependency package binary will be used as-is mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 => mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 @@ -624,11 +624,11 @@ All the modes can be applied to all dependencies, or to individual ones: def package_id(self): self.info.requires["mypkg"].package_revision_mode() - Given that the package ID of consumers depends on the package revision PREV of the dependencies, when - one of the upstream dependencies doesn't have a package revision yet (for example it is going to be - built from sources, so its PREV cannot be determined yet), the consumers package ID will be unknown and - marked as such. These dependency graphs cannot be built in a single invocation, because they are intended - for CI systems, in which a package creation/built is called for each package in the graph. + Given that the package ID of consumers depends on the package revision PREV of the dependencies, when + one of the upstream dependencies doesn't have a package revision yet (for example it is going to be + built from sources, so its PREV cannot be determined yet), the consumers package ID will be unknown and + marked as such. These dependency graphs cannot be built in a single invocation, because they are intended + for CI systems, in which a package creation/built is called for each package in the graph. You can also adjust the individual properties manually: From fc1e8feb1610f59bb1d2cda0cab34e403dcb0d0a Mon Sep 17 00:00:00 2001 From: chausner Date: Mon, 8 Feb 2021 11:25:59 +0100 Subject: [PATCH 053/681] Fix spelling (#2018) Co-authored-by: Carlos Zoido --- versioning/lockfiles/configurations.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/versioning/lockfiles/configurations.rst b/versioning/lockfiles/configurations.rst index edef9c929c34..65e8d512310b 100644 --- a/versioning/lockfiles/configurations.rst +++ b/versioning/lockfiles/configurations.rst @@ -8,7 +8,7 @@ Multiple configurations This is an **experimental** feature subject to breaking changes in future releases. In the previous section we managed just 1 configuration, for the default profile. In many applications, -packages needs to be built with several different configurations, typically managed by different profile +packages need to be built with several different configurations, typically managed by different profile files. .. note:: From 768700e0c25d2863256f4bf68140d492b42a8c1e Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Mon, 8 Feb 2021 12:26:42 +0100 Subject: [PATCH 054/681] Update develop with master (#2020) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner --- _themes/conan/layout.html | 8 ++-- .../define_abi_compatibility.rst | 38 +++++++++---------- creating_packages/getting_started.rst | 6 +-- devtools/running_packages.rst | 38 +++++++++---------- howtos/makefiles.rst | 6 +-- integrations/custom.rst | 4 +- mastering/envvars.rst | 2 +- reference/build_helpers/cmake.rst | 2 +- reference/conanfile/attributes.rst | 12 +++--- reference/conanfile/methods.rst | 20 +++++----- reference/generators/b2.rst | 4 +- reference/generators/cmake.rst | 14 +++---- versioning/lockfiles/configurations.rst | 2 +- versioning/version_ranges.rst | 10 ++--- 14 files changed, 82 insertions(+), 84 deletions(-) diff --git a/_themes/conan/layout.html b/_themes/conan/layout.html index 636db4743857..45d11fde4e7f 100644 --- a/_themes/conan/layout.html +++ b/_themes/conan/layout.html @@ -158,13 +158,11 @@ {% include "breadcrumbs.html" %} - -
+
{% block body %}{% endblock %} diff --git a/creating_packages/define_abi_compatibility.rst b/creating_packages/define_abi_compatibility.rst index 2f5295274956..291047627eee 100644 --- a/creating_packages/define_abi_compatibility.rst +++ b/creating_packages/define_abi_compatibility.rst @@ -11,7 +11,7 @@ different binary: .. code-block:: python - class MyLibConanPackage(ConanFile): + class MyLibConanPackage(ConanFile): name = "mylib" version = "1.0" settings = "os", "arch", "compiler", "build_type" @@ -54,8 +54,8 @@ The recipe for such a package will be to generate a single binary package, no mo .. code-block:: python - class MyLibConanPackage(ConanFile): - name = "MyLib" + class MyLibConanPackage(ConanFile): + name = "mylib" version = "1.0" # no settings defined! @@ -135,7 +135,7 @@ The required package has the same result again ``af04...46ad``. Now we can try u .. code-block:: bash - $ conan install Pkg/1.0@myuser/mychannel -s compiler=gcc -s compiler.version=4.4 ... + $ conan install pkg/1.0@myuser/mychannel -s compiler=gcc -s compiler.version=4.4 ... Requirements pkg/1.0@myuser/mychannel from local @@ -144,7 +144,7 @@ The required package has the same result again ``af04...46ad``. Now we can try u The computed package ID is different which means that we need a different binary package for GCC 4.4. -The same way we have adjusted the ``self.info.settings``, we could set the ``self.info.options`` values if needed. +The same way we have adjusted the ``self.info.settings``, we could set the ``self.info.options`` values if needed. If you want to make packages independent on ``build_type`` removing the ``build_type`` from the package settings in the ``package_id()`` will work for OSX and Linux. However when building with Visual studio the ``compiler.runtime`` field will change based on the ``build_type`` value so in that case you will also want to delete the compiler runtime field like so: .. code-block:: python @@ -196,7 +196,7 @@ That can be defined as: class Pkg(ConanFile): settings = "os", "compiler", "arch", "build_type" - + def package_id(self): if self.settings.compiler == "gcc" and self.settings.compiler.version == "4.9": for version in ("4.8", "4.7"): @@ -225,7 +225,7 @@ It is the responsibility of the developer to guarantee that such binaries are in self.compatible_packages.append(compatible_pkg) This recipe defines that the binaries are compatible with binaries of itself built with a lower optimization value. It can -have up to 3 different binaries, one for each different value of ``optimized`` option. The ``package_id()`` defines that a binary +have up to 3 different binaries, one for each different value of ``optimized`` option. The ``package_id()`` defines that a binary built with ``optimized=1`` can be perfectly linked and will run even if someone defines ``optimized=2``, or ``optimized=3`` in their configuration. But a binary built with ``optimized=2`` will not be considered if the requested one is ``optimized=1``. @@ -558,7 +558,7 @@ All the modes can be applied to all dependencies, or to individual ones: .. code-block:: text - my_other_lib/1.3.4-a4+b3@user/testing => my_other_lib/1.3.4-a4+b3 + my_other_lib/1.3.4-a4+b3@user/testing => my_other_lib/1.3.4-a4+b3 - ``full_recipe_mode()``: Any change in the reference of the requirement (user & channel too) changes the package ID. @@ -571,7 +571,7 @@ All the modes can be applied to all dependencies, or to individual ones: .. code-block:: text - my_other_lib/1.3.4-a4+b3@user/testing => my_other_lib/1.3.4-a4+b3@user/testing + my_other_lib/1.3.4-a4+b3@user/testing => my_other_lib/1.3.4-a4+b3@user/testing - ``full_package_mode()``: Any change in the required version, user, channel or package ID changes the package ID. @@ -585,7 +585,7 @@ All the modes can be applied to all dependencies, or to individual ones: .. code-block:: text - MyOtherLib/1.3.4-a4+b3@user/testing:73b..fa56 => MyOtherLib/1.3.4-a4+b3@user/testing:73b..fa56 + MyOtherLib/1.3.4-a4+b3@user/testing:73b..fa56 => MyOtherLib/1.3.4-a4+b3@user/testing:73b..fa56 - ``unrelated_mode()``: Requirements do not change the package ID. @@ -598,9 +598,9 @@ All the modes can be applied to all dependencies, or to individual ones: `pkg/version@user/channel#RREV:pkg_id` (including the recipe revision), will be taken into account to compute the consumer package ID - .. code-block:: text + .. code-block:: text - mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 => mypkg/1.3.4-a4+b3@user/testing#RREV1 + mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 => mypkg/1.3.4-a4+b3@user/testing#RREV1 .. code-block:: python @@ -614,21 +614,21 @@ All the modes can be applied to all dependencies, or to individual ones: This is the most strict mode. Any change in the upstream will produce new consumers package IDs, becoming a fully deterministic binary model. - .. code-block:: text + .. code-block:: text # The full reference of the dependency package binary will be used as-is - mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 => mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 + mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 => mypkg/1.3.4@user/testing#RREV1:73b..fa56#PREV1 .. code-block:: python def package_id(self): self.info.requires["mypkg"].package_revision_mode() - Given that the package ID of consumers depends on the package revision PREV of the dependencies, when - one of the upstream dependencies doesn't have a package revision yet (for example it is going to be - built from sources, so its PREV cannot be determined yet), the consumers package ID will be unknown and - marked as such. These dependency graphs cannot be built in a single invocation, because they are intended - for CI systems, in which a package creation/built is called for each package in the graph. + Given that the package ID of consumers depends on the package revision PREV of the dependencies, when + one of the upstream dependencies doesn't have a package revision yet (for example it is going to be + built from sources, so its PREV cannot be determined yet), the consumers package ID will be unknown and + marked as such. These dependency graphs cannot be built in a single invocation, because they are intended + for CI systems, in which a package creation/built is called for each package in the graph. You can also adjust the individual properties manually: diff --git a/creating_packages/getting_started.rst b/creating_packages/getting_started.rst index 850c2c9ff3af..92545a4a5622 100644 --- a/creating_packages/getting_started.rst +++ b/creating_packages/getting_started.rst @@ -136,7 +136,7 @@ basics: .. seealso:: Check the :ref:`existing build helpers `. - The ``package()`` method copies artifacts (headers, libs) from the build folder to the final - package folder. + package folder. - Finally, the ``package_info()`` method defines that the consumer must link with the "hello" library when using this package. Other information as include or lib paths can be defined as well. This @@ -360,9 +360,9 @@ There are some exceptions to the above. For example, settings can be defined per .. code-block:: bash - $ conan install . -s MyPkg:compiler=gcc -s compiler=clang .. + $ conan install . -s mypkg:compiler=gcc -s compiler=clang .. -This will use ``gcc`` for MyPkg and ``clang`` for the rest of the dependencies (extremely rare case). +This will use ``gcc`` for "mypkg" and ``clang`` for the rest of the dependencies (extremely rare case). There are situations whereby many packages use the same option, thereby allowing you to set its value once using patterns, like: diff --git a/devtools/running_packages.rst b/devtools/running_packages.rst index 4610f2933754..6a056674ae46 100644 --- a/devtools/running_packages.rst +++ b/devtools/running_packages.rst @@ -123,13 +123,13 @@ Using the `deploy` generator The :ref:`deploy generator ` is used to have all the dependencies of an application copied into a single place. Then all the files can be repackaged into the distribution format of choice. -For instance, if the application depends on boost, we may not know that it also requires many other 3rt-party libraries, -such as -`zlib `_, -`bzip2 `_, -`lzma `_, -`zstd `_, -`iconv `_, etc. +For instance, if the application depends on boost, we may not know that it also requires many other 3rt-party libraries, +such as +`zlib `_, +`bzip2 `_, +`lzma `_, +`zstd `_, +`iconv `_, etc. .. code-block:: bash @@ -180,7 +180,7 @@ appropriate format for distribution. The following code shows how to read the li While with the `deploy` generator, all the files were copied into a folder. The advantage with the `json` one is that you have fine-grained control over the files and those can be directly copied to the desired layout. -In that sense, the script above could be easily modified to apply some sort of filtering (e.g. to copy only shared libraries, +In that sense, the script above could be easily modified to apply some sort of filtering (e.g. to copy only shared libraries, and omit any static libraries or auxiliary files such as pkg-config .pc files). Additionally, you could also write a simple startup script for your application with the extracted information like this: @@ -213,14 +213,14 @@ Running from packages If a dependency has an executable that we want to run in the conanfile, it can be done directly in code using the ``run_environment=True`` argument. It internally uses a ``RunEnvironment()`` helper. -For example, if we want to execute the :command:`greet` app while building the ``Consumer`` package: +For example, if we want to execute the :command:`greet` app while building the ``consumer`` package: .. code-block:: python from conans import ConanFile, tools, RunEnvironment class ConsumerConan(ConanFile): - name = "Consumer" + name = "consumer" version = "0.1" settings = "os", "compiler", "build_type", "arch" requires = "hello/0.1@user/testing" @@ -242,10 +242,10 @@ Instead of using the environment, it is also possible to explicitly access the p .. code-block:: python def build(self): - path = os.path.join(self.deps_cpp_info["Hello"].rootpath, "bin") + path = os.path.join(self.deps_cpp_info["hello"].rootpath, "bin") self.run(["%s/greet" % path]) -Note that this might not be enough if shared libraries exist. Using the ``run_environment=True`` helper above +Note that this might not be enough if shared libraries exist. Using the ``run_environment=True`` helper above is a more complete solution. This example also demonstrates using a list to specify the command to run. This bypasses the system shell and @@ -274,7 +274,7 @@ The consumer package is simple, as the ``PATH`` environment variable contains th Read the :ref:`next section ` for a more comprenhensive explanation about using -packaged executables in your recipe methods. +packaged executables in your recipe methods. .. _repackage: @@ -352,7 +352,7 @@ Glibc is not a just C standard library, as it provides: - BSD functions (like BSD sockets). - Wrappers for OS-specific APIs (like Linux system calls) -Even if your application doesn't use directly any of these functions, they are often used by other libraries, +Even if your application doesn't use directly any of these functions, they are often used by other libraries, so, in practice, it's almost always in actual use. There are other implementations of the C standard library that present the same challenge, such as @@ -400,7 +400,7 @@ Similarly to the standard C library `glibc`, running the application linked with /hello: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.21' not found (required by /hello) /hello: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.26' not found (required by /hello) -Fortunately, this is much easier to address by just adding ``-static-libstdc++`` compiler flag. Unlike C runtime, C++ runtime can be +Fortunately, this is much easier to address by just adding ``-static-libstdc++`` compiler flag. Unlike C runtime, C++ runtime can be linked statically safely, because it doesn't use system calls directly, but instead relies on ``libc`` to provide required wrappers. Compiler runtime @@ -415,9 +415,9 @@ referenced directly in code and are mostly implicitly inserted by the compiler i $ ldd ./a.out libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6626aee000) -you can avoid this kind of dependency by the using of the ``-static-libgcc`` compiler flag. However, it's not always sane thing to do, as -there are certain situations when applications should use shared runtime. The most common is when the application wishes to throw and catch -exceptions across different shared libraries. Check out the `GCC manual `_ for the +you can avoid this kind of dependency by the using of the ``-static-libgcc`` compiler flag. However, it's not always sane thing to do, as +there are certain situations when applications should use shared runtime. The most common is when the application wishes to throw and catch +exceptions across different shared libraries. Check out the `GCC manual `_ for the detailed information. System API (system calls) @@ -430,5 +430,5 @@ provided by ``glibc``). As a result, if the application was compiled on a machine with a newer kernel and build system used to auto-detect available system calls, it may fail to execute properly on machines with older kernels. -The solution is to either use a build machine with lowest supported kernel, or model supported operation system (just like in case of ``glibc``). +The solution is to either use a build machine with lowest supported kernel, or model supported operation system (just like in case of ``glibc``). Check out sections :ref:`add_new_settings` and :ref:`add_new_sub_settings` to get a piece of information on how to model distribution in conan settings. diff --git a/howtos/makefiles.rst b/howtos/makefiles.rst index cb4cd6602a05..fb6b063b5e0a 100644 --- a/howtos/makefiles.rst +++ b/howtos/makefiles.rst @@ -14,7 +14,7 @@ but could be extended to shared libraries too. The Makefiles surely can be impro Creating packages ----------------- -Sources for this example can be found in our `examples repository `_ +Sources for this example can be found in our `examples repository `_ in the *features/makefiles* folder: .. code-block:: bash @@ -112,7 +112,7 @@ There you can also see a *src* folder with a *Makefile* creating an executable: $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@ $(OUT): $(OBJ) - $(CXX) -o $(OUT) $(OBJ) $(LDFLAGS) $(LIBS) + $(CXX) -o $(OUT) $(OBJ) $(LDFLAGS) $(LIBS) And also a *conanfile.py* very similar to the previous one. In this case adding a ``requires`` and a ``deploy()`` method: @@ -124,7 +124,7 @@ And also a *conanfile.py* very similar to the previous one. In this case adding from conans import tools class AppConan(ConanFile): - name = "App" + name = "app" version = "0.1" settings = "os", "compiler", "build_type", "arch" exports_sources = "src/*" diff --git a/integrations/custom.rst b/integrations/custom.rst index ff76ed1a05cd..1b2e0847d5b6 100644 --- a/integrations/custom.rst +++ b/integrations/custom.rst @@ -221,12 +221,12 @@ generator to simplify the task for your build system. print(self.env) print("--------- FROM MyLib -------------") - print(self.deps_env_info["MyLib"].some_env_var) + print(self.deps_env_info["mylib"].some_env_var) # User declared variables (from requirements self.user_info objects) # are available in the self.deps_user_info object print("--------- FROM MyLib -------------") - print(self.deps_user_info["MyLib"].some_user_var) + print(self.deps_user_info["mylib"].some_user_var) Create your own generator ------------------------- diff --git a/mastering/envvars.rst b/mastering/envvars.rst index 14d96d4f2bc4..05e51c295e5e 100644 --- a/mastering/envvars.rst +++ b/mastering/envvars.rst @@ -31,7 +31,7 @@ If you want to override an environment variable that a package has inherited fro .. code-block:: bash - conan install . -e MyPackage:PATH=/other/path + conan install . -e mypkg:PATH=/other/path If you want to define an environment variable, but you want to append the variables declared in your requirements, you can use the ``[]`` syntax: diff --git a/reference/build_helpers/cmake.rst b/reference/build_helpers/cmake.rst index ba8512759a63..01c6bcb5a75b 100644 --- a/reference/build_helpers/cmake.rst +++ b/reference/build_helpers/cmake.rst @@ -442,7 +442,7 @@ The following example of ``conanfile.py`` shows you how to manage a project with from conans import ConanFile, CMake class SomePackage(ConanFile): - name = "SomePackage" + name = "somepkg" version = "1.0.0" settings = "os", "compiler", "build_type", "arch" generators = "cmake" diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index b62be4e72b86..0407d9a23ab9 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -10,7 +10,7 @@ Attributes name ---- -This is a string, with a minimum of 2 and a maximum of 50 characters (though shorter names are recommended), that defines the package name. It will be the ``/version@user/channel`` of the package reference. +This is a string, with a minimum of 2 and a maximum of 50 characters (though shorter names are recommended), that defines the package name. It will be the ``/version@user/channel`` of the package reference. It should match the following regex ``^[a-zA-Z0-9_][a-zA-Z0-9_\+\.-]{1,50}$``, so start with alphanumeric or underscore, then alphanumeric, underscore, +, ., - characters. The name is only necessary for ``export``-ing the recipe into the local cache (``export`` and ``create`` commands), if they are not defined in the command line. @@ -20,7 +20,7 @@ However, the most common and suggested approach would be to define it in plain t version ------- -The version attribute will define the version part of the package reference: ``PkgName/@user/channel`` +The version attribute will define the version part of the package reference: ``pkgName/@user/channel`` It is a string, and can take any value, matching the same constraints as the ``name`` attribute. In case the version follows semantic versioning in the form ``X.Y.Z-pre1+build2``, that value might be used for requiring this package through version ranges instead of exact versions. @@ -411,14 +411,14 @@ go over all of them for the example recipe ``mypkg`` defined above: setting=value [options] - MyPkg:shared=False + mypkg:shared=False - Last way of defining values for options, with the highest priority over them all, is to pass these values using the command argument :command:`-o` in the command line: .. code-block:: bash - $ conan install . -o MyPkg:shared=True -o OtherPkg:option=value + $ conan install . -o mypkg:shared=True -o otherpkg:option=value Values for options can be also conditionally assigned (or even deleted) in the methods ``configure()`` and ``config_options()``, the @@ -1539,7 +1539,7 @@ provides This is an **experimental** feature subject to breaking changes in future releases. -This attribute declares that the recipe provides the same functionality as other recipe(s). The attribute is usually needed if two or more +This attribute declares that the recipe provides the same functionality as other recipe(s). The attribute is usually needed if two or more libraries implement the same API to prevent link-time and run-time conflicts (ODR violations). One typical situation is forked libraries. Some examples are: @@ -1581,5 +1581,5 @@ To declare that a recipe provides the functionality of several different recipes version = "1.0" provides = "cblas", "lapack" -If the attribute is omitted, the value of the attribute is assumed to be equal to the current package name. Thus, it's redundant for +If the attribute is omitted, the value of the attribute is assumed to be equal to the current package name. Thus, it's redundant for ``libjpeg`` recipe to declare that it provides ``libjpeg``, it's already implicitly assumed by Conan. diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 643062481093..db48ef09d67f 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -296,10 +296,10 @@ using the ``deps_cpp_info`` object: class OtherConan(ConanFile): name = "OtherLib" version = "1.0" - requires = "MyLib/1.6.0@conan/stable" + requires = "mylib/1.6.0@conan/stable" def build(self): - self.output.warn(self.deps_cpp_info["MyLib"].libdirs) + self.output.warn(self.deps_cpp_info["mylib"].libdirs) .. note:: @@ -344,10 +344,10 @@ If your recipe has requirements, you can access to your requirements ``env_info` class OtherConan(ConanFile): name = "OtherLib" version = "1.0" - requires = "MyLib/1.6.0@conan/stable" + requires = "mylib/1.6.0@conan/stable" def build(self): - self.output.warn(self.deps_env_info["MyLib"].othervar) + self.output.warn(self.deps_env_info["mylib"].othervar) .. _method_package_info_user_info: @@ -362,7 +362,7 @@ Currently only the ``cmake``, ``cmake_multi`` and ``txt`` generators supports `` .. code-block:: python class MyLibConan(ConanFile): - name = "MyLib" + name = "mylib" version = "1.6.0" # ... @@ -376,12 +376,12 @@ recipe has requirements, you can access to your requirements ``user_info`` using .. code-block:: python class OtherConan(ConanFile): - name = "OtherLib" + name = "otherlib" version = "1.0" - requires = "MyLib/1.6.0@conan/stable" + requires = "mylib/1.6.0@conan/stable" def build(self): - self.out.warn(self.deps_user_info["MyLib"].var1) + self.out.warn(self.deps_user_info["mylib"].var1) .. important:: @@ -395,7 +395,7 @@ recipe has requirements, you can access to your requirements ``user_info`` using ... # In the dependent conanfile - jars = self.deps_user_info["Pkg"].jars + jars = self.deps_user_info["pkg"].jars jar_list = jars.replace(" ", "").split(",") .. _method_configure_config_options: @@ -498,7 +498,7 @@ can be done: del self.options.shared This will be executed before the actual assignment of ``options`` (then, such ``options`` values cannot be used inside this function), so -the command :command:`conan install -o Pkg:shared=True` will raise an exception in Windows saying that ``shared`` is not an option for such +the command :command:`conan install -o pkg:shared=True` will raise an exception in Windows saying that ``shared`` is not an option for such package. .. _invalid_configuration: diff --git a/reference/generators/b2.rst b/reference/generators/b2.rst index 3d1d5bcca101..99054021bbbc 100644 --- a/reference/generators/b2.rst +++ b/reference/generators/b2.rst @@ -204,7 +204,7 @@ name in lower case. For example: .. code-block:: python class MyLibConan(ConanFile): - name = "MyLib" + name = "mylib" version = "1.6.0" # ... @@ -212,7 +212,7 @@ name in lower case. For example: def package_info(self): self.user_info.var1 = 2 -When other library requires ``MyLib`` and uses the ``b2`` generator: +When other library requires ``mylib`` and uses the ``b2`` generator: .. code-block:: text :caption: *conanbuildinfo-XXX.jam* diff --git a/reference/generators/cmake.rst b/reference/generators/cmake.rst index 0db99db3a0fc..37c08eb5f840 100644 --- a/reference/generators/cmake.rst +++ b/reference/generators/cmake.rst @@ -18,7 +18,7 @@ Variables in *conanbuildinfo.cmake* - **Package declared variables**: For each requirement *conanbuildinfo.cmake* file declares the following variables. Where ```` is the placeholder for the name of - the require in uppercase (``ZLIB`` for ``zlib/1.2.8@lasote/stable``) or the one declared in ``cpp_info.name`` or in + the require in uppercase (``ZLIB`` for ``zlib/1.2.8@lasote/stable``) or the one declared in ``cpp_info.name`` or in ``cpp_info.names["cmake"]`` if specified: +---------------------------------------+----------------------------------------------------------------------+ @@ -113,7 +113,7 @@ Variables in *conanbuildinfo.cmake* .. code-block:: python class MyLibConan(ConanFile): - name = "MyLib" + name = "mylib" version = "1.6.0" # ... @@ -121,7 +121,7 @@ Variables in *conanbuildinfo.cmake* def package_info(self): self.user_info.var1 = 2 - Other library requiring ``MyLib`` and using this generator will get: + Other library requiring ``mylib`` and using this generator will get: .. code-block:: cmake :caption: *conanbuildinfo.cmake* @@ -194,12 +194,12 @@ This method can be disabled setting the :ref:`conan_disable_check_compiler` vari conan_output_dirs_setup() +++++++++++++++++++++++++ -Adjusts each `CMAKE_RUNTIME_OUTPUT_DIRECTORY` variable to be ``${CMAKE_CURRENT_BINARY_DIR}/bin`` -and each ``CMAKE_ARCHIVE_OUTPUT_DIRECTORY`` and ``CMAKE_LIBRARY_OUTPUT_DIRECTORY`` variable to be +Adjusts each `CMAKE_RUNTIME_OUTPUT_DIRECTORY` variable to be ``${CMAKE_CURRENT_BINARY_DIR}/bin`` +and each ``CMAKE_ARCHIVE_OUTPUT_DIRECTORY`` and ``CMAKE_LIBRARY_OUTPUT_DIRECTORY`` variable to be ``${CMAKE_CURRENT_BINARY_DIR}/lib``. -Calling this method makes writing the ``package()`` method for recipies easier. All artifacts will -always be found in the same location. Otherwise, they may be found in different locations depending +Calling this method makes writing the ``package()`` method for recipies easier. All artifacts will +always be found in the same location. Otherwise, they may be found in different locations depending on your build environment (eg Linux vs Windows). conan_set_find_library_paths() diff --git a/versioning/lockfiles/configurations.rst b/versioning/lockfiles/configurations.rst index edef9c929c34..65e8d512310b 100644 --- a/versioning/lockfiles/configurations.rst +++ b/versioning/lockfiles/configurations.rst @@ -8,7 +8,7 @@ Multiple configurations This is an **experimental** feature subject to breaking changes in future releases. In the previous section we managed just 1 configuration, for the default profile. In many applications, -packages needs to be built with several different configurations, typically managed by different profile +packages need to be built with several different configurations, typically managed by different profile files. .. note:: diff --git a/versioning/version_ranges.rst b/versioning/version_ranges.rst index 5d22227468af..d131719de937 100644 --- a/versioning/version_ranges.rst +++ b/versioning/version_ranges.rst @@ -6,15 +6,15 @@ Version ranges Version range expressions are supported, both in ``conanfile.txt`` and in ``conanfile.py`` requirements. -The syntax uses brackets. The square brackets are the way to inform Conan that is a version range. Otherwise, versions are plain strings. They can be whatever you want them to be (up to limitations of length and allowed characters). +The syntax uses brackets. The square brackets are the way to inform Conan that is a version range. Otherwise, versions are plain strings. They can be whatever you want them to be (up to limitations of length and allowed characters). .. code-block:: python class HelloConan(ConanFile): - requires = "Pkg/[>1.0 <1.8]@user/stable" + requires = "pkg/[>1.0 <1.8]@user/stable" -So when specifying ``Pkg/[expression]@user/stable``, it means that ``expression`` will be evaluated as a version range. Otherwise, it will be understood as plain text, so ``requires = "Pkg/version@user/stable"`` always means to use the version ``version`` literally. +So when specifying ``pkg/[expression]@user/stable``, it means that ``expression`` will be evaluated as a version range. Otherwise, it will be understood as plain text, so ``requires = "pkg/version@user/stable"`` always means to use the version ``version`` literally. There are some packages that do not follow semver. A popular one would be the OpenSSL package with versions as ``1.0.2n``. They cannot be used with version-ranges. To require such packages you always have to use explicit versions (without brackets). @@ -41,8 +41,8 @@ There are two options for the version range: .. code-block:: python [>1.1 <2.1, include_prerelease=True] # Would e.g. accept "2.0.0-pre.1" as match - [~1.2.3, loose=False] # Would only accept correct Semantic Versioning strings. - # E.g. version "1.2.3.4" would not be accepted. + [~1.2.3, loose=False] # Would only accept correct Semantic Versioning strings. + # E.g. version "1.2.3.4" would not be accepted. [~1.2.3, loose=False, include_prerelease=True] # Both options can be used for the same version range. Version range expressions are evaluated at the time of building the dependency graph, from From 19305e223bd989c6d2fff1bf06f47f172c7b944d Mon Sep 17 00:00:00 2001 From: chausner Date: Mon, 8 Feb 2021 15:37:28 +0100 Subject: [PATCH 055/681] Fix multiple minor spelling mistakes (#2019) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix multiple minor spelling mistakes * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: Carlos Zoido --- mastering/virtualenv.rst | 2 +- versioning/lockfiles/build_order.rst | 4 ++-- versioning/lockfiles/ci.rst | 8 ++++---- versioning/lockfiles/introduction.rst | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mastering/virtualenv.rst b/mastering/virtualenv.rst index baf16e7f8094..a1c1bf9c6515 100644 --- a/mastering/virtualenv.rst +++ b/mastering/virtualenv.rst @@ -4,7 +4,7 @@ Virtual Environments ==================== -Conan offer three special Conan generators to create virtual environments: +Conan offers three special Conan generators to create virtual environments: - ``virtualenv``: Declares the :ref:`self.env_info` variables of the requirements. - ``virtualbuildenv``: Special build environment variables for autotools/visual studio. diff --git a/versioning/lockfiles/build_order.rst b/versioning/lockfiles/build_order.rst index c99c83539a8f..3f43bef1272b 100644 --- a/versioning/lockfiles/build_order.rst +++ b/versioning/lockfiles/build_order.rst @@ -30,7 +30,7 @@ In this section we are going to use the following packages, defining this depend The example in this section uses ``full_version_mode``, that is, if a package changes any part of its version, its consumers will need to build a new binary because a new ``package_id`` will be computed. This example will use version ranges, and -it is not necessary to have revisions enabled. It also do not require a server, everything can be reproduced locally. +it is not necessary to have revisions enabled. It also does not require a server, everything can be reproduced locally. .. code-block:: bash @@ -214,7 +214,7 @@ defined. They lock the reference and the package-id, and they can be built from If we want to check if the new ``libb/0.2`` version affects to the ``app2`` and something needs to -be rebuild, the process is identical: +be rebuilt, the process is identical: .. code-block:: bash diff --git a/versioning/lockfiles/ci.rst b/versioning/lockfiles/ci.rst index 9fbd46a0623c..66ee33cb39f8 100644 --- a/versioning/lockfiles/ci.rst +++ b/versioning/lockfiles/ci.rst @@ -13,7 +13,7 @@ case. It doesn't aim to present a complete solution or the only possible one, de project, the team, the requirements, the constraints, etc., other approaches might be recommended. In this section we are going to use the same packages than in the previous one, defining this - dependency graph. +dependency graph. .. image:: conan_lock_build_order.png :height: 200 px @@ -48,7 +48,7 @@ need to build a new binary because a new ``package_id`` will be computed. $ conan config set general.default_package_id_mode=full_version_mode -This example will use version ranges, and it is not necessary to have revisions enabled. It also do not require +This example will use version ranges, and it is not necessary to have revisions enabled. It also does not require a server, everything can be reproduced locally, although the usage of different repositories will be introduced. @@ -157,9 +157,9 @@ revision doing an export, creating a new *libb_base.lock* lockfile: Products pipeline ----------------- There is an important question to be addressed: **when a package changes, what other packages -consuming it should be rebuild to account for this change?**. The problem might be harder than +consuming it should be rebuilt to account for this change?**. The problem might be harder than it seems at first sight, or from the observation of the graph above. It shows that ``libd/0.1`` -has a dependency to ``libb/0.1``, does it means that a new ``libb/0.2`` should produce a re-build +has a dependency to ``libb/0.1``, does it mean that a new ``libb/0.2`` should produce a re-build of ``libd/0.1`` to link with the new version? Not always, if ``libd`` had a pinned dependency and not a version range, it will never resolve to the new version, and then it doesn't and it cannot be rebuilt unless some developer makes some changes to ``libd`` and bumps the requirement. diff --git a/versioning/lockfiles/introduction.rst b/versioning/lockfiles/introduction.rst index 5a861bc97250..b28de62a648b 100644 --- a/versioning/lockfiles/introduction.rst +++ b/versioning/lockfiles/introduction.rst @@ -27,7 +27,7 @@ Locking dependencies This example uses ``full_version_mode``, that is, if a package changes any part of its version, its consumers will need to build a new binary because a new ``package_id`` will be computed. This example will use version ranges, and -it is not necessary to have revisions enabled. It also do not require a server, everything can be reproduced locally. +it is not necessary to have revisions enabled. It also does not require a server, everything can be reproduced locally. .. code-block:: bash From 2435e847f3369970177f68814ec8ed322ef31957 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Fri, 12 Feb 2021 10:35:01 -0300 Subject: [PATCH 056/681] Add --build=\!skip Signed-off-by: Uilian Ries --- mastering/policies.rst | 1 + reference/commands/consumer/install.rst | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/mastering/policies.rst b/mastering/policies.rst index 5e0427f355f8..0472dcc7594f 100644 --- a/mastering/policies.rst +++ b/mastering/policies.rst @@ -13,6 +13,7 @@ As previously demonstrated, we can use the :command:`--build` option to change t - :command:`--build cascade` will build from code all the nodes with some dependency being built (for any reason). Can be used together with any other build policy. Useful to make sure that any new change introduced in a dependency is incorporated by building again the package. - :command:`--build pattern*` will build only the packages with the reference starting with "pattern". +- :command:`--build --build=!some_package` will build all requirements from sources, except for some_package. With the ``build_policy`` attribute in the `conanfile.py` the package creator can change the default Conan's build behavior. The allowed build_policy values are: diff --git a/reference/commands/consumer/install.rst b/reference/commands/consumer/install.rst index 840c6adfb20c..acf658e3855a 100644 --- a/reference/commands/consumer/install.rst +++ b/reference/commands/consumer/install.rst @@ -244,6 +244,13 @@ Possible values are: - e.g., :command:`--build=zlib` will match any package named ``zlib`` (same as ``zlib/*``). - e.g., :command:`--build=z*@conan/stable` will match any package starting with ``z`` with ``conan/stable`` as user/channel. +* :command:`--build=![pattern]`: A fnmatch case-sensitive pattern of a package reference or only the package name. + Conan will exclude the build of the packages whose reference matches the given + **pattern**. Several patterns can be specified, chaining multiple options: + + - e.g., :command:`--build=!zlib --build` Build all packages from source, except for zlib. + - e.g., :command:`--build=!z* --build` Build all packages from source, except for those starting with ``z`` + If you omit the :command:`--build` option, the ``build_policy`` attribute in `conanfile.py` will be looked up. If it is set to ``missing`` or ``always``, this build option will be used, otherwise the command will behave like :command:`--build=never` was set. From 9f07cf48fd773cf313f9d4ca60b6e71d5b216c23 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 15 Feb 2021 11:59:21 +0100 Subject: [PATCH 057/681] Remove misleading message about ConanCenter in shared_library_package_id() (#2000) --- reference/conanfile/methods.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index db48ef09d67f..723536073271 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -979,7 +979,6 @@ When a shared library links with a static library, the binary code of the later That means that any change in the static library basically requires a new binary re-build of the shared one to integrate those changes. Note that this doesn't happen in the static-static and shared-shared library dependencies. - Use this ``shared_library_package_id()`` helper in the ``package_id()`` method: .. code-block:: python @@ -999,12 +998,6 @@ option in command line or profiles, but can also be defined in recipes like: if self.options.shared: self.options["*"].shared = True -Using both ``shared_library_package_id()`` and this ``configure()`` method is necessary for -`Conan-center packages `_ that have dependencies -to compiled libraries and have the ``shared`` option. - - - self.info.vs_toolset_compatible() / self.info.vs_toolset_incompatible() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 96d12ef35b88a1da583e30493448c69b4921d678 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 17 Feb 2021 17:25:18 +0100 Subject: [PATCH 058/681] Update yocto docs (#2022) --- integrations/cross_platform/yocto.rst | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/integrations/cross_platform/yocto.rst b/integrations/cross_platform/yocto.rst index fe2701c42908..00e6a4c7aebe 100644 --- a/integrations/cross_platform/yocto.rst +++ b/integrations/cross_platform/yocto.rst @@ -36,7 +36,7 @@ debugger and test the application. :width: 600 px :align: center -3. Once the cross-built packages are available in Artifactory, the application can be directly deployed to the Yocto image. This step can also be automated also in a CI. +3. Once the cross-built packages are available in Artifactory, the application can be directly deployed to the Yocto image without building it from sources again. .. image:: /images/yocto/conan-yocto_deploy.png @@ -207,9 +207,6 @@ You would also have to activate the layers in the *bblayers.conf* file of your b .. note:: - Currently there is no support for ``CONAN_REVISIONS_ENABLED``, so remote and virtual Artifactory repositories will not work in this - case. We will continue working on this layer to support more features. - Please report any question, feature request or issue related to the ``meta-conan`` layer in its `GitHub issue tracker `_. From b421bddbd1030aaa5d556f2659547e03514eb449 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Mon, 22 Feb 2021 06:16:15 -0300 Subject: [PATCH 059/681] Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido --- faq/troubleshooting.rst | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/faq/troubleshooting.rst b/faq/troubleshooting.rst index 4d8a10142e18..4070a2d3fb0d 100644 --- a/faq/troubleshooting.rst +++ b/faq/troubleshooting.rst @@ -218,3 +218,49 @@ solve this problem you need to remove existing upper case variant ``OpenSSL``: .. code-block:: bash $ conan remove "OpenSSL/*" + + +ERROR: Incompatible requirements obtained in different evaluations of 'requirements' +------------------------------------------------------------------------------------ + +When two different packages require the same package as a dependency, but with different versions, will result in the following error: +.. code-block:: bash + + $ cat conanfile.txt + + [requires] + baz/1.0.0 + foobar/1.0.0 + + $ conan install conanfile.txt + + [...] + WARN: foobar/1.0.0: requirement foo/1.3.0 overridden by baz/1.0.0 to foo/1.0.0 + ERROR: baz/1.0.0: Incompatible requirements obtained in different evaluations of 'requirements' + Previous requirements: [foo/1.0.0] + New requirements: [foo/1.3.0] + +As we can see in the following situation: the ``conanfile.txt`` requires 2 packages (``baz/1.0.0`` and ``foobar/1.0.0``) which +both require the package named ``foo``. However, ``baz`` requires ``foo/1.0.0``, but ``foobar`` requires ``foo/1.3.0``. +As the required versions are different, it's considered a conflict and Conan will not solve it. + +To solve this kind of collision, you have to choose a version for ``foo`` and add it to the ``conanfile.txt`` as an explicit +requirement: + +.. code-block:: text + + [requires] + foo/1.3.0 + baz/1.0.0 + foobar/1.0.0 + +Here we choose ``foo/1.3.0`` because is newer. Now we can proceed: + +.. code-block:: bash + + $ conan install conanfile.txt + + [...] + WARN: baz/1.0.0: requirement foo/1.0.0 overridden by foobar/1.0.0 to foo/1.3.0 + +Conan still warns us about the conflict, but as we have [overridden](docs.conan.io/en/latest/versioning/introduction.html?#dependencies-overriding) the ``foo`` version, it's no longer an error. From 7d91b5bf9d20518b9a44b955b6a8d47b7ec825f8 Mon Sep 17 00:00:00 2001 From: Psy-Kai Date: Mon, 22 Feb 2021 10:27:29 +0100 Subject: [PATCH 060/681] Rename QbsToolchain to QbsProfile (#2027) * Rename QbsToolchain to QbsProfile * Rename use_profile to profile --- reference/conanfile/tools/qbs.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reference/conanfile/tools/qbs.rst b/reference/conanfile/tools/qbs.rst index cf3b4d526621..786b00008a0e 100644 --- a/reference/conanfile/tools/qbs.rst +++ b/reference/conanfile/tools/qbs.rst @@ -3,7 +3,7 @@ conan.tools.qbs =============== -QbsToolchain +QbsProfile ------------ .. warning:: @@ -11,13 +11,13 @@ QbsToolchain This is an **experimental** feature subject to breaking changes in future releases. -The ``QbsToolchain`` can be used in the ``generate()`` method: +The ``QbsProfile`` can be used in the ``generate()`` method: .. code:: python from conans import ConanFile - from conan.tools.qbs import QbsToolchain + from conan.tools.qbs import QbsProfile class App(ConanFile): settings = "os", "arch", "compiler", "build_type" @@ -26,17 +26,17 @@ The ``QbsToolchain`` can be used in the ``generate()`` method: default_options = {"shared": False} def generate(self): - tc = QbsToolchain(self) + tc = QbsProfile(self) tc.generate() -The ``QbsToolchain`` will generate the following file during :command:`conan install` +The ``QbsProfile`` will generate the following file during :command:`conan install` command (or before calling the ``build()`` method when the package is being -built in the cache): *conan_toolchain.qbs*. This file will contain a qbs profile +built in the cache): *conan_toolchain_profile.qbs*. This file will contain a qbs profile named *conan_toolchain_profile*. -*conan_toolchain.qbs* will contain the definitions of all the Qbs properties +*conan_toolchain_profile.qbs* will contain the definitions of all the Qbs properties related to the Conan options and settings for the current package, platform, etc. This includes the following: @@ -102,7 +102,7 @@ Parameters: Attributes ++++++++++ -use_toolchain_profile +profile ********************* **Defaulted to**: ``conan_toolchain_profile`` From 04221a2aafd04fb274904418ae03b853a868d88a Mon Sep 17 00:00:00 2001 From: James Date: Thu, 25 Feb 2021 16:41:49 +0100 Subject: [PATCH 061/681] conan_v2_error update (#2031) --- conan_v2.rst | 12 ++++++------ reference/conan_v2_mode.rst | 28 ++++++++-------------------- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/conan_v2.rst b/conan_v2.rst index 2bb9925abf59..c24e793744d4 100644 --- a/conan_v2.rst +++ b/conan_v2.rst @@ -3,16 +3,16 @@ Road to Conan 2.0 ================= -Conan has started to think about the next major release. We've been gathering feedback +Conan has started to work on the next major release. We've been gathering feedback from the community about our features and we think it's time to break some default -behaviors, clean the codebase and add space for new developments. +behaviors, clean the codebase and add space for new developments. Development is +ongoing and the `Conan 2.0 Tribe `_ is having discussions +about it. In the future, this section will contain relevant information and changes regarding Conan 2.0, there is a lot of work ahead, as you can see in `our backlog `_. -Meanwhile, in version 1.23 we have introduced an environment variable to activate new defaults and -best practices, and to detect things that are already almost deprecated. Read more about ``CONAN_V2_MODE`` -in :ref:`this section ` (this mode is only for developers and for testing purpose, -it doesn't expose a stable set of features and there is no stability commitment). +Meanwhile, in version 1.23 we have introduced an environment variable to raise errors in case of using features +that will be deprecated in Conan 2.0. Read more about ``CONAN_V2_MODE`` in :ref:`this section `. Stay tuned! diff --git a/reference/conan_v2_mode.rst b/reference/conan_v2_mode.rst index 0a532e798cb8..c3a0fc1c3c94 100644 --- a/reference/conan_v2_mode.rst +++ b/reference/conan_v2_mode.rst @@ -4,33 +4,24 @@ CONAN_V2_MODE ============= -This environment variable activates some behaviors and defaults that are intended -to be in the next major release, :ref:`Conan 2.0 `. It also turns into -errors things that are already deprecated in Conan 1.x. - -The objective is to try to minimize the impact on existing recipes when Conan 2.0 will be -available and to start gathering feedback about the new configuration and behavior. This -does not resemble the full behavior that Conan 2.0 will bring. The **v2 mode is a work-in-progress, -it is highly experimental and there is no commitment for stability here**, but we expect that -users with this mode activated will help us to shape the future version of Conan while we -keep evolving the Conan 1.x series. +If defined in the environment, this variable will raise errors whenever a :ref:`Conan 2.0 ` deprecated feature +is used. It is a good mechanism to check the recipes future Conan 2.0 "compliance". Activating it should +not change behavior in any way, just raise error for deprecated things, but if it works, the same +result should be achieved. The number of deprecated features will increase in future Conan 1.X releases, +it could be a good practice to have it activated in some nightly job or the like, to report on current +status of your recipes. So, if you are ready to experiment add the variable ``CONAN_V2_MODE`` to your environment and, please, report your feedback about it. -.. warning:: - **Do not activate this mode in a production environment!** Even if everything seems - to work fine, package ID might change, revisions will be different and the ABI could - be incompatible. +The following is a current known list of features that will change in Conan 2.0 and might start raising +errors if CONAN_V2_MODE is activated: Changes related to the default configuration -------------------------------------------- -These changes will be applied when installing Conan for the first time, as these are -stored in the autogenerated configuration files in the cache: - * First level setting `cppstd` is removed. * Revisions are enabled by default (adds ``revisions_enabled=1`` to *conan.conf*). * No hooks activated by default. @@ -38,9 +29,6 @@ stored in the autogenerated configuration files in the cache: * GCC >= 5 autodetected profile will use ``libstdc++11``. * Directory ``/python`` is not added to Python ``sys.path``. -Some of these behaviors will be also activated for existing installations if the -*conan.conf* doesn't contain a value for them. - Changes in recipes ------------------ From 3f24e6845cad5814b50e6bbb04fe31a2c992917e Mon Sep 17 00:00:00 2001 From: James Date: Fri, 26 Feb 2021 11:22:04 +0100 Subject: [PATCH 062/681] lock bundle (#2030) * lock bundle * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido Co-authored-by: Carlos Zoido --- versioning/lockfiles.rst | 1 + versioning/lockfiles/bundle.rst | 195 +++++++++++++++++++++ versioning/lockfiles/conan_lock_bundle.png | Bin 0 -> 40933 bytes 3 files changed, 196 insertions(+) create mode 100644 versioning/lockfiles/bundle.rst create mode 100644 versioning/lockfiles/conan_lock_bundle.png diff --git a/versioning/lockfiles.rst b/versioning/lockfiles.rst index a865b832861e..e57b769e43a7 100644 --- a/versioning/lockfiles.rst +++ b/versioning/lockfiles.rst @@ -22,4 +22,5 @@ version ranges or using package revisions. lockfiles/configurations lockfiles/evolving lockfiles/build_order + lockfiles/bundle lockfiles/ci \ No newline at end of file diff --git a/versioning/lockfiles/bundle.rst b/versioning/lockfiles/bundle.rst new file mode 100644 index 000000000000..ac98b496b10f --- /dev/null +++ b/versioning/lockfiles/bundle.rst @@ -0,0 +1,195 @@ +.. _versioning_lockfiles_bundle: + +Lockfile bundles +================ + +.. warning:: + + This is an **experimental** feature subject to breaking changes in future releases. + + +Every package build using lockfiles requires a given configuration-specific lockfile, and after the build, that lockfile is +updated to include the built package revision. If we have different configurations for different variants as different architectures, +compiler versions or Debug/Release, a build will be typically necessary for each one. + +In real life, it is also likely that we might want to build together different applications or products, that could be even disconnected, +and we want to do it as efficiently and fast (in parallel) as possible. We could have the following situation: + + +.. image:: conan_lock_bundle.png + :height: 200 px + :width: 400 px + :align: center + + +In this diagram we see that we are building and releasing 2 different products in our team: ``app1/1.1`` and +``app2/2.3``. ``app1`` depends on ``pkgb/0.1`` (omitting ``user/channel`` for brevity, but please use it) and +``app2`` depends on ``pkgb/0.2``. In turn, both versions of ``pkgb`` depend on the same ``pkga/0.1`` version. + +If we are building both products for 2 different configurations each (lets say Windows and Linux), we could capture 4 +different lockfiles: + +.. code:: bash + + $ conan lock create --ref=app1/1.1 --base --lockfile-out=app1_base.lock + $ conan lock create --ref=app2/2.3 --base --lockfile-out=app2_base.lock + + $ conan lock create --ref=app1/1.1 -s os=Windows --lockfile=app1_base.lock --lockfile-out=app1_windows.lock + $ conan lock create --ref=app1/1.1 -s os=Linux --lockfile=app1_base.lock --lockfile-out=app1_linux.lock + $ conan lock create --ref=app2/2.3 -s os=Windows --lockfile=app2_base.lock --lockfile-out=app2_windows.lock + $ conan lock create --ref=app2/2.3 -s os=Linux --lockfile=app2_base.lock --lockfile-out=app2_linux.lock + +If we launched these 4 lockfiles builds in parallel, we can see that ``pkga/0.1`` will be built 4 times, 2 times +in Windows and 2 times in Linux. The extra build in each OS is redundant and can be avoided. But we need a way +to orchestrate it, that is what a lockfile bundle is for. + + +Creating a lockfile bundle +-------------------------- + +Creating a lockfile bundle can be done with the ``conan lock bundle create`` command, passing the list of all lockfiles +for all configurations and products, and obtaining one single output bundle: + +.. code:: bash + + $ conan lock bundle create app1_windows.lock app1_linux.lock app2_windows.lock app2_linux.lock --bundle-out=lock.bundle + + +Inspecting the resulting lockfile bundle file, we can see it is a json file with the following structure: + +.. code:: json + + "lock_bundle": { + "app1/1.1@#584778f98ba1d0eb7c80a5ae1fe12fe2": { + "package_id": { + "3bcd6800847f779e0883ee91b411aad9ddd8e83c": { + "lockfiles": { + "app1_windows.lock": [ + "1" + ] + }, + "prev": null, + "modified": null + }, + "60fbb0a22359b4888f7ecad69bcdfcd6e70e2784": { + "lockfiles": { + "app1_linux.lock": [ + "1" + ] + }, + "prev": null, + "modified": null + } + }, + "requires": [ + "pkgb/0.1@#cd8f22d6f264f65398d8c534046e8e20" + ] + }, + +The bundle groups items per "recipe reference", included the recipe revision, like ``app1/1.1@#584778f98ba1d0eb7c80a5ae1fe12fe2``. +For each one, it will list all different binaries, identified by their ``package_id`` that are involved in the different +lockfiles, listing all lockfiles for each ``package_id``. In this case, as ``app1`` only belongs to app1 lockfiles, only +one lockfile ``app1_windows.lock``, ``app1_linux.lock`` is in each ``package_id``. Also, the package revision ``prev`` is listed, +in this case being ``null``, because there is no locked binary in the lockfiles, but is going to be built. + +.. note:: + + The relative path between the bundle file and the lockfile files need to be maintained. In the example + ``app1_linux.lock`` means that the lockfile is located in the same folder as the bundle file itself. If + moving the bundle to a different machine, the lockfiles should be moved too, maintaining the same relative + layout. + +The interesting part is in the ``pkga/0.1`` information in the bundle: + +.. code:: json + + "pkga/0.1@#f096d7d54098b7ad7012f9435d9c33f3": { + "package_id": { + "3475bd55b91ae904ac96fde0f106a136ab951a5e": { + "lockfiles": { + "app1_windows.lock": [ + "3" + ], + "app2_windows.lock": [ + "3" + ] + }, + "prev": null, + "modified": null + }, + +Now we can see that for one ``package_id`` there are actually 2 different lockfiles that require it. Both ``app1`` and ``app2`` +depend in this case on ``pkga/0.1``. +This is the information that can be used to avoid duplicated builds. + + + +Using a lockfile bundle to build +-------------------------------- + +The lockfile bundles also can compute a "build order" over the bundle, that will give an ordered list of lists of the +package references that need to be built. In our case we could do: + +.. code:: bash + + $ conan lock bundle build-order lock.bundle --json=build_order.json + [ + ["pkga/0.1@#f096d7d54098b7ad7012f9435d9c33f3"], + ["pkgb/0.1@#cd8f22d6f264f65398d8c534046e8e20", "pkgb/0.2@#cd8f22d6f264f65398d8c534046e8e20"], + ["app1/0.1@#584778f98ba1d0eb7c80a5ae1fe12fe2", "app2/0.1@#3850895c1eac8223c43c71d525348019"] + ] + +The result is a list of lists. Every inner list is a "level", it is formed by mutually independent references that +can be built in parallel, because they don't depend on each other. But every level will have dependencies to the +previous levels, so it is necessary to build those levels in order. + +The build order list can be iterated, building the packages in order. The necessary information is in the bundle +file itself, so we can read it and use it, something like: + + +.. code:: python + + # Get the build order + build_order = json.loads(open("build_order.json").read()) + + # Read the bundle + bundle = json.loads(open("lock.bundle").read()) + bundle = bundle["lock_bundle"] + for level in build_order: # iterate the build_order + for ref in level: # All refs in this level could be built in parallel + # Now get the package_ids and lockfile information + package_ids = bundle[ref]["package_id"] + for pkg_id, info in package_ids.items(): + lockfiles = info["lockfiles"] + lockfile = next(iter(sorted(lockfiles))) # Get the first one, all should be valid to build same packag_id + + os.system("conan install {ref} --build={ref} --lockfile={lockfile} " + "--lockfile-out={lockfile}".format(ref=ref, lockfile=lockfile)) + os.system("conan lock bundle update lock.bundle") + + +This works under the hypothesis that the same binary, identified by the same ``package_id`` will be obtained irrespective +of which lockfile or final product is used to build it. If this doesn't hold true, then the ``package_id`` policies should +be revised until this condition is met. + +.. important:: + + Recall that this is an orchestration mechanism, that can be used to distribute the actual ``conan install`` tasks + to different agents, based on the lockfile itself, we might need some logic to send that build to one or another + build server. If we didn't want to orchestrate and everything can be built in this machine a + ``conan install app1/1.1@ --lockfile={lockfile} --build=missing`` would build all the necessary dependencies in the + graph, in the current agent. + + +Note that the builds themselves are using regular lockfiles. The bundle does not contain the necessary information to +reproduce the dependency graph that is needed to create packages. + +The command ``conan lock bundle update lock.bundle`` manages to update all the connected lockfiles after a reference has been +built. When the build is fired, it is done using 1 of the lockfiles, for a given configuration. That lockfile will get the +updated package revision and status. The ``conan lock bundle update`` does this process in 2 steps: + +- Scan all connected lockfiles for every ``ref`` recipe reference and ``package_id``, and collect those that have been modified. +- Propagate the modified information to all the other connected lockfiles. + +After ``conan lock bundle update``, all packages sharing the same reference and ``package_id`` should have the same status (marked +"modified" and same package revision) diff --git a/versioning/lockfiles/conan_lock_bundle.png b/versioning/lockfiles/conan_lock_bundle.png new file mode 100644 index 0000000000000000000000000000000000000000..829c1dfbf83bd25916752606f535ff580e497d7e GIT binary patch literal 40933 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 ss-l1Sf}r%PZn>e_|DSSYR;N^{SSpWb4 literal 0 HcmV?d00001 From 8700e209a62545dcfc7457f6cea5fa96a5ce2b6c Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Fri, 26 Feb 2021 11:55:41 +0100 Subject: [PATCH 063/681] Merge master to develop (#2033) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido * Remove misleading message about ConanCenter in shared_library_package_id() (#2000) * Update yocto docs (#2022) * Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner Co-authored-by: Daniel Co-authored-by: Uilian Ries --- faq/troubleshooting.rst | 46 +++++++++++++++++++++++++++ integrations/cross_platform/yocto.rst | 5 +-- reference/conanfile/methods.rst | 7 ---- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/faq/troubleshooting.rst b/faq/troubleshooting.rst index 4d8a10142e18..4070a2d3fb0d 100644 --- a/faq/troubleshooting.rst +++ b/faq/troubleshooting.rst @@ -218,3 +218,49 @@ solve this problem you need to remove existing upper case variant ``OpenSSL``: .. code-block:: bash $ conan remove "OpenSSL/*" + + +ERROR: Incompatible requirements obtained in different evaluations of 'requirements' +------------------------------------------------------------------------------------ + +When two different packages require the same package as a dependency, but with different versions, will result in the following error: +.. code-block:: bash + + $ cat conanfile.txt + + [requires] + baz/1.0.0 + foobar/1.0.0 + + $ conan install conanfile.txt + + [...] + WARN: foobar/1.0.0: requirement foo/1.3.0 overridden by baz/1.0.0 to foo/1.0.0 + ERROR: baz/1.0.0: Incompatible requirements obtained in different evaluations of 'requirements' + Previous requirements: [foo/1.0.0] + New requirements: [foo/1.3.0] + +As we can see in the following situation: the ``conanfile.txt`` requires 2 packages (``baz/1.0.0`` and ``foobar/1.0.0``) which +both require the package named ``foo``. However, ``baz`` requires ``foo/1.0.0``, but ``foobar`` requires ``foo/1.3.0``. +As the required versions are different, it's considered a conflict and Conan will not solve it. + +To solve this kind of collision, you have to choose a version for ``foo`` and add it to the ``conanfile.txt`` as an explicit +requirement: + +.. code-block:: text + + [requires] + foo/1.3.0 + baz/1.0.0 + foobar/1.0.0 + +Here we choose ``foo/1.3.0`` because is newer. Now we can proceed: + +.. code-block:: bash + + $ conan install conanfile.txt + + [...] + WARN: baz/1.0.0: requirement foo/1.0.0 overridden by foobar/1.0.0 to foo/1.3.0 + +Conan still warns us about the conflict, but as we have [overridden](docs.conan.io/en/latest/versioning/introduction.html?#dependencies-overriding) the ``foo`` version, it's no longer an error. diff --git a/integrations/cross_platform/yocto.rst b/integrations/cross_platform/yocto.rst index fe2701c42908..00e6a4c7aebe 100644 --- a/integrations/cross_platform/yocto.rst +++ b/integrations/cross_platform/yocto.rst @@ -36,7 +36,7 @@ debugger and test the application. :width: 600 px :align: center -3. Once the cross-built packages are available in Artifactory, the application can be directly deployed to the Yocto image. This step can also be automated also in a CI. +3. Once the cross-built packages are available in Artifactory, the application can be directly deployed to the Yocto image without building it from sources again. .. image:: /images/yocto/conan-yocto_deploy.png @@ -207,9 +207,6 @@ You would also have to activate the layers in the *bblayers.conf* file of your b .. note:: - Currently there is no support for ``CONAN_REVISIONS_ENABLED``, so remote and virtual Artifactory repositories will not work in this - case. We will continue working on this layer to support more features. - Please report any question, feature request or issue related to the ``meta-conan`` layer in its `GitHub issue tracker `_. diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index db48ef09d67f..723536073271 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -979,7 +979,6 @@ When a shared library links with a static library, the binary code of the later That means that any change in the static library basically requires a new binary re-build of the shared one to integrate those changes. Note that this doesn't happen in the static-static and shared-shared library dependencies. - Use this ``shared_library_package_id()`` helper in the ``package_id()`` method: .. code-block:: python @@ -999,12 +998,6 @@ option in command line or profiles, but can also be defined in recipes like: if self.options.shared: self.options["*"].shared = True -Using both ``shared_library_package_id()`` and this ``configure()`` method is necessary for -`Conan-center packages `_ that have dependencies -to compiled libraries and have the ``shared`` option. - - - self.info.vs_toolset_compatible() / self.info.vs_toolset_incompatible() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 06f021f7a320d187ab93591e06a7ef4af8619305 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Fri, 26 Feb 2021 12:26:34 +0100 Subject: [PATCH 064/681] Release 1.34.0 (#2035) * buildroot.rst: Fix a typo (#1996) Artifatory --> Artifactory * - meson : add target argument (#2011) Signed-off-by: SSE4 * Update develop with master (#2020) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner * Fix multiple minor spelling mistakes (#2019) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix multiple minor spelling mistakes * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: Carlos Zoido * Rename QbsToolchain to QbsProfile (#2027) * Rename QbsToolchain to QbsProfile * Rename use_profile to profile * conan_v2_error update (#2031) * lock bundle (#2030) * lock bundle * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido Co-authored-by: Carlos Zoido * release 1.34.0 * fix changelog * Merge master to release branch (#2034) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido * Remove misleading message about ConanCenter in shared_library_package_id() (#2000) * Update yocto docs (#2022) * Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: rico-chet Co-authored-by: SSE4 Co-authored-by: James Co-authored-by: chausner Co-authored-by: Psy-Kai Co-authored-by: Daniel Co-authored-by: Uilian Ries --- .ci/publish.jenkins | 1 + changelog.rst | 30 +++- conan_v2.rst | 12 +- conf.py | 4 +- integrations/cross_platform/buildroot.rst | 2 +- mastering/virtualenv.rst | 2 +- reference/conan_v2_mode.rst | 28 +-- reference/conanfile/tools/meson.rst | 5 +- reference/conanfile/tools/qbs.rst | 16 +- versioning/lockfiles.rst | 1 + versioning/lockfiles/build_order.rst | 4 +- versioning/lockfiles/bundle.rst | 195 +++++++++++++++++++++ versioning/lockfiles/ci.rst | 8 +- versioning/lockfiles/conan_lock_bundle.png | Bin 0 -> 40933 bytes versioning/lockfiles/introduction.rst | 2 +- 15 files changed, 263 insertions(+), 47 deletions(-) create mode 100644 versioning/lockfiles/bundle.rst create mode 100644 versioning/lockfiles/conan_lock_bundle.png diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index 5b827df43167..74248d458e4a 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,6 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ + 'release/1.34.0': '1.34', 'release/1.33.1': '1.33', 'release/1.32.1': '1.32', 'release/1.31.4': '1.31', diff --git a/changelog.rst b/changelog.rst index 1dbfe9c4ee60..979f5dcf1522 100644 --- a/changelog.rst +++ b/changelog.rst @@ -18,9 +18,37 @@ Check https://github.com/conan-io/conan for issues and more details about develo .. important:: - Conan 1.33 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please + Conan 1.34 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.34.0 (26-Feb-2021) +-------------------- + +- Feature: Add `path` and `repository` properties to conan_build_info v2. `#8436 `_ +- Feature: Setting _conan_ as name for `buildAgent` in `conan_build_info`. `#8433 `_ +- Feature: Using actual conan version in version for `buildAgent` in `conan_build_info` instead of 1.X. `#8433 `_ +- Feature: Add `type` _conan_ to Conan build info modules. `#8433 `_ +- Feature: Add ``scm`` output in :command:`conan info` command. `#8380 `_ +- Feature: Forked ``cmake_find_package_multi`` into ``CMakeDeps``, to allow evolution without breaking. `#8371 `_ +- Feature: Use built-in retries in requests lib to retry http requests with _5xx_ response code. `#8352 `_ +- Feature: New lockfile "bundle" feature that can integrate different lockfiles for different configurations and different graphs into a single lockfile bundle that can be used to vastly optimize CI (specially for multiple products), implementing bundle build-order and bundle update operations. `#8344 `_ . Docs `here `__ +- Fix: Renamed generator `QbsToolchain` to `QbsProfile`. `#8537 `_ . Docs `here `__ +- Fix: Renamed default filename of _QbsProfile_ generated file to _conan_toolchain_profile_.qbs. `#8537 `_ . Docs `here `__ +- Fix: Renamed Qbs attribute `use_toolchain_profile` to `profile`. `#8537 `_ . Docs `here `__ +- Fix: Remove extra spaces in flags and colons in path variables. `#8496 `_ +- Fix: `conan_v2_error` if `scm_to_conandata` is not enabled. `#8447 `_ +- Fix: `CONAN_V2_MODE` env-var does not longer alter behavior, only raises errors for Conan 2.0 incompatibilities `#8399 `_ . Docs `here `__ +- Fix: meson : Add target and jobs arguments. `#8384 `_ . Docs `here `__ +- Fix: Set `qbs.targetPlatform` with qbs toolchain. `#8372 `_ +- Fix: Remove warnings for old toolchains imports and ``generate_toolchain_files()`` calls (use new imports and ``generate()`` calls. `#8361 `_ +- BugFix: Improve `tools.unix_path` for Cygwin. `#8509 `_ +- BugFix: Allow `run_in_windows_bash` in MSYS/Cygwin. `#8506 `_ +- BugFix: Add some sanity check to avoid a vague error for custom architectures. `#8502 `_ +- BugFix: Fix Apple M1 detection. `#8501 `_ +- Bugfix: Fix repeated ``build_requires``, including conflicting versions in profile composition or inclusion that repeats ``[build_requires]`` values. `#8463 `_ +- Bugfix: Fixing a `CMakeDeps` bug with components, not finding the _conan_macros.cmake_ file. `#8445 `_ +- Bugfix: Fix exit code for `conan_build_info`. `#8408 `_ + 1.33.1 (02-Feb-2021) -------------------- diff --git a/conan_v2.rst b/conan_v2.rst index 2bb9925abf59..c24e793744d4 100644 --- a/conan_v2.rst +++ b/conan_v2.rst @@ -3,16 +3,16 @@ Road to Conan 2.0 ================= -Conan has started to think about the next major release. We've been gathering feedback +Conan has started to work on the next major release. We've been gathering feedback from the community about our features and we think it's time to break some default -behaviors, clean the codebase and add space for new developments. +behaviors, clean the codebase and add space for new developments. Development is +ongoing and the `Conan 2.0 Tribe `_ is having discussions +about it. In the future, this section will contain relevant information and changes regarding Conan 2.0, there is a lot of work ahead, as you can see in `our backlog `_. -Meanwhile, in version 1.23 we have introduced an environment variable to activate new defaults and -best practices, and to detect things that are already almost deprecated. Read more about ``CONAN_V2_MODE`` -in :ref:`this section ` (this mode is only for developers and for testing purpose, -it doesn't expose a stable set of features and there is no stability commitment). +Meanwhile, in version 1.23 we have introduced an environment variable to raise errors in case of using features +that will be deprecated in Conan 2.0. Read more about ``CONAN_V2_MODE`` in :ref:`this section `. Stay tuned! diff --git a/conf.py b/conf.py index cbad054deaf9..0f0e47059d2f 100644 --- a/conf.py +++ b/conf.py @@ -41,9 +41,9 @@ ] # The short X.Y version. -version = "1.33" +version = "1.34" # The full version, including alpha/beta/rc tags. -release = u'1.33.1' +release = u'1.34.0' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): diff --git a/integrations/cross_platform/buildroot.rst b/integrations/cross_platform/buildroot.rst index be3f9ef6aa71..2df6e10e8740 100644 --- a/integrations/cross_platform/buildroot.rst +++ b/integrations/cross_platform/buildroot.rst @@ -152,7 +152,7 @@ At the end of the installation it will be copied to the output directory. Customizing Conan remote ======================== -Let's say we have an :ref:`Artifatory ` instance where all packages are available +Let's say we have an :ref:`Artifactory ` instance where all packages are available for download. How could we customize the remote used by Buildroot? We need to introduce a new option, where we can write the remote name and Conan will be able to consume such variable. First we need to create a new configuration file to insert new options in Conan's menu: diff --git a/mastering/virtualenv.rst b/mastering/virtualenv.rst index baf16e7f8094..a1c1bf9c6515 100644 --- a/mastering/virtualenv.rst +++ b/mastering/virtualenv.rst @@ -4,7 +4,7 @@ Virtual Environments ==================== -Conan offer three special Conan generators to create virtual environments: +Conan offers three special Conan generators to create virtual environments: - ``virtualenv``: Declares the :ref:`self.env_info` variables of the requirements. - ``virtualbuildenv``: Special build environment variables for autotools/visual studio. diff --git a/reference/conan_v2_mode.rst b/reference/conan_v2_mode.rst index 0a532e798cb8..c3a0fc1c3c94 100644 --- a/reference/conan_v2_mode.rst +++ b/reference/conan_v2_mode.rst @@ -4,33 +4,24 @@ CONAN_V2_MODE ============= -This environment variable activates some behaviors and defaults that are intended -to be in the next major release, :ref:`Conan 2.0 `. It also turns into -errors things that are already deprecated in Conan 1.x. - -The objective is to try to minimize the impact on existing recipes when Conan 2.0 will be -available and to start gathering feedback about the new configuration and behavior. This -does not resemble the full behavior that Conan 2.0 will bring. The **v2 mode is a work-in-progress, -it is highly experimental and there is no commitment for stability here**, but we expect that -users with this mode activated will help us to shape the future version of Conan while we -keep evolving the Conan 1.x series. +If defined in the environment, this variable will raise errors whenever a :ref:`Conan 2.0 ` deprecated feature +is used. It is a good mechanism to check the recipes future Conan 2.0 "compliance". Activating it should +not change behavior in any way, just raise error for deprecated things, but if it works, the same +result should be achieved. The number of deprecated features will increase in future Conan 1.X releases, +it could be a good practice to have it activated in some nightly job or the like, to report on current +status of your recipes. So, if you are ready to experiment add the variable ``CONAN_V2_MODE`` to your environment and, please, report your feedback about it. -.. warning:: - **Do not activate this mode in a production environment!** Even if everything seems - to work fine, package ID might change, revisions will be different and the ABI could - be incompatible. +The following is a current known list of features that will change in Conan 2.0 and might start raising +errors if CONAN_V2_MODE is activated: Changes related to the default configuration -------------------------------------------- -These changes will be applied when installing Conan for the first time, as these are -stored in the autogenerated configuration files in the cache: - * First level setting `cppstd` is removed. * Revisions are enabled by default (adds ``revisions_enabled=1`` to *conan.conf*). * No hooks activated by default. @@ -38,9 +29,6 @@ stored in the autogenerated configuration files in the cache: * GCC >= 5 autodetected profile will use ``libstdc++11``. * Directory ``/python`` is not added to Python ``sys.path``. -Some of these behaviors will be also activated for existing installations if the -*conan.conf* doesn't contain a value for them. - Changes in recipes ------------------ diff --git a/reference/conanfile/tools/meson.rst b/reference/conanfile/tools/meson.rst index 206a9d0eb7f7..98be9ea6ee83 100644 --- a/reference/conanfile/tools/meson.rst +++ b/reference/conanfile/tools/meson.rst @@ -162,10 +162,13 @@ build() .. code:: python - def build(self): + def build(self, target=None): Calls the build system. Equivalent to :command:`meson compile -C .` in the build folder. +Parameters: + - **target** (Optional, Defaulted to ``None``): Specifies the target to execute. The default *all* target will be built if ``None`` is specified. + install() +++++++++ diff --git a/reference/conanfile/tools/qbs.rst b/reference/conanfile/tools/qbs.rst index cf3b4d526621..786b00008a0e 100644 --- a/reference/conanfile/tools/qbs.rst +++ b/reference/conanfile/tools/qbs.rst @@ -3,7 +3,7 @@ conan.tools.qbs =============== -QbsToolchain +QbsProfile ------------ .. warning:: @@ -11,13 +11,13 @@ QbsToolchain This is an **experimental** feature subject to breaking changes in future releases. -The ``QbsToolchain`` can be used in the ``generate()`` method: +The ``QbsProfile`` can be used in the ``generate()`` method: .. code:: python from conans import ConanFile - from conan.tools.qbs import QbsToolchain + from conan.tools.qbs import QbsProfile class App(ConanFile): settings = "os", "arch", "compiler", "build_type" @@ -26,17 +26,17 @@ The ``QbsToolchain`` can be used in the ``generate()`` method: default_options = {"shared": False} def generate(self): - tc = QbsToolchain(self) + tc = QbsProfile(self) tc.generate() -The ``QbsToolchain`` will generate the following file during :command:`conan install` +The ``QbsProfile`` will generate the following file during :command:`conan install` command (or before calling the ``build()`` method when the package is being -built in the cache): *conan_toolchain.qbs*. This file will contain a qbs profile +built in the cache): *conan_toolchain_profile.qbs*. This file will contain a qbs profile named *conan_toolchain_profile*. -*conan_toolchain.qbs* will contain the definitions of all the Qbs properties +*conan_toolchain_profile.qbs* will contain the definitions of all the Qbs properties related to the Conan options and settings for the current package, platform, etc. This includes the following: @@ -102,7 +102,7 @@ Parameters: Attributes ++++++++++ -use_toolchain_profile +profile ********************* **Defaulted to**: ``conan_toolchain_profile`` diff --git a/versioning/lockfiles.rst b/versioning/lockfiles.rst index a865b832861e..e57b769e43a7 100644 --- a/versioning/lockfiles.rst +++ b/versioning/lockfiles.rst @@ -22,4 +22,5 @@ version ranges or using package revisions. lockfiles/configurations lockfiles/evolving lockfiles/build_order + lockfiles/bundle lockfiles/ci \ No newline at end of file diff --git a/versioning/lockfiles/build_order.rst b/versioning/lockfiles/build_order.rst index c99c83539a8f..3f43bef1272b 100644 --- a/versioning/lockfiles/build_order.rst +++ b/versioning/lockfiles/build_order.rst @@ -30,7 +30,7 @@ In this section we are going to use the following packages, defining this depend The example in this section uses ``full_version_mode``, that is, if a package changes any part of its version, its consumers will need to build a new binary because a new ``package_id`` will be computed. This example will use version ranges, and -it is not necessary to have revisions enabled. It also do not require a server, everything can be reproduced locally. +it is not necessary to have revisions enabled. It also does not require a server, everything can be reproduced locally. .. code-block:: bash @@ -214,7 +214,7 @@ defined. They lock the reference and the package-id, and they can be built from If we want to check if the new ``libb/0.2`` version affects to the ``app2`` and something needs to -be rebuild, the process is identical: +be rebuilt, the process is identical: .. code-block:: bash diff --git a/versioning/lockfiles/bundle.rst b/versioning/lockfiles/bundle.rst new file mode 100644 index 000000000000..ac98b496b10f --- /dev/null +++ b/versioning/lockfiles/bundle.rst @@ -0,0 +1,195 @@ +.. _versioning_lockfiles_bundle: + +Lockfile bundles +================ + +.. warning:: + + This is an **experimental** feature subject to breaking changes in future releases. + + +Every package build using lockfiles requires a given configuration-specific lockfile, and after the build, that lockfile is +updated to include the built package revision. If we have different configurations for different variants as different architectures, +compiler versions or Debug/Release, a build will be typically necessary for each one. + +In real life, it is also likely that we might want to build together different applications or products, that could be even disconnected, +and we want to do it as efficiently and fast (in parallel) as possible. We could have the following situation: + + +.. image:: conan_lock_bundle.png + :height: 200 px + :width: 400 px + :align: center + + +In this diagram we see that we are building and releasing 2 different products in our team: ``app1/1.1`` and +``app2/2.3``. ``app1`` depends on ``pkgb/0.1`` (omitting ``user/channel`` for brevity, but please use it) and +``app2`` depends on ``pkgb/0.2``. In turn, both versions of ``pkgb`` depend on the same ``pkga/0.1`` version. + +If we are building both products for 2 different configurations each (lets say Windows and Linux), we could capture 4 +different lockfiles: + +.. code:: bash + + $ conan lock create --ref=app1/1.1 --base --lockfile-out=app1_base.lock + $ conan lock create --ref=app2/2.3 --base --lockfile-out=app2_base.lock + + $ conan lock create --ref=app1/1.1 -s os=Windows --lockfile=app1_base.lock --lockfile-out=app1_windows.lock + $ conan lock create --ref=app1/1.1 -s os=Linux --lockfile=app1_base.lock --lockfile-out=app1_linux.lock + $ conan lock create --ref=app2/2.3 -s os=Windows --lockfile=app2_base.lock --lockfile-out=app2_windows.lock + $ conan lock create --ref=app2/2.3 -s os=Linux --lockfile=app2_base.lock --lockfile-out=app2_linux.lock + +If we launched these 4 lockfiles builds in parallel, we can see that ``pkga/0.1`` will be built 4 times, 2 times +in Windows and 2 times in Linux. The extra build in each OS is redundant and can be avoided. But we need a way +to orchestrate it, that is what a lockfile bundle is for. + + +Creating a lockfile bundle +-------------------------- + +Creating a lockfile bundle can be done with the ``conan lock bundle create`` command, passing the list of all lockfiles +for all configurations and products, and obtaining one single output bundle: + +.. code:: bash + + $ conan lock bundle create app1_windows.lock app1_linux.lock app2_windows.lock app2_linux.lock --bundle-out=lock.bundle + + +Inspecting the resulting lockfile bundle file, we can see it is a json file with the following structure: + +.. code:: json + + "lock_bundle": { + "app1/1.1@#584778f98ba1d0eb7c80a5ae1fe12fe2": { + "package_id": { + "3bcd6800847f779e0883ee91b411aad9ddd8e83c": { + "lockfiles": { + "app1_windows.lock": [ + "1" + ] + }, + "prev": null, + "modified": null + }, + "60fbb0a22359b4888f7ecad69bcdfcd6e70e2784": { + "lockfiles": { + "app1_linux.lock": [ + "1" + ] + }, + "prev": null, + "modified": null + } + }, + "requires": [ + "pkgb/0.1@#cd8f22d6f264f65398d8c534046e8e20" + ] + }, + +The bundle groups items per "recipe reference", included the recipe revision, like ``app1/1.1@#584778f98ba1d0eb7c80a5ae1fe12fe2``. +For each one, it will list all different binaries, identified by their ``package_id`` that are involved in the different +lockfiles, listing all lockfiles for each ``package_id``. In this case, as ``app1`` only belongs to app1 lockfiles, only +one lockfile ``app1_windows.lock``, ``app1_linux.lock`` is in each ``package_id``. Also, the package revision ``prev`` is listed, +in this case being ``null``, because there is no locked binary in the lockfiles, but is going to be built. + +.. note:: + + The relative path between the bundle file and the lockfile files need to be maintained. In the example + ``app1_linux.lock`` means that the lockfile is located in the same folder as the bundle file itself. If + moving the bundle to a different machine, the lockfiles should be moved too, maintaining the same relative + layout. + +The interesting part is in the ``pkga/0.1`` information in the bundle: + +.. code:: json + + "pkga/0.1@#f096d7d54098b7ad7012f9435d9c33f3": { + "package_id": { + "3475bd55b91ae904ac96fde0f106a136ab951a5e": { + "lockfiles": { + "app1_windows.lock": [ + "3" + ], + "app2_windows.lock": [ + "3" + ] + }, + "prev": null, + "modified": null + }, + +Now we can see that for one ``package_id`` there are actually 2 different lockfiles that require it. Both ``app1`` and ``app2`` +depend in this case on ``pkga/0.1``. +This is the information that can be used to avoid duplicated builds. + + + +Using a lockfile bundle to build +-------------------------------- + +The lockfile bundles also can compute a "build order" over the bundle, that will give an ordered list of lists of the +package references that need to be built. In our case we could do: + +.. code:: bash + + $ conan lock bundle build-order lock.bundle --json=build_order.json + [ + ["pkga/0.1@#f096d7d54098b7ad7012f9435d9c33f3"], + ["pkgb/0.1@#cd8f22d6f264f65398d8c534046e8e20", "pkgb/0.2@#cd8f22d6f264f65398d8c534046e8e20"], + ["app1/0.1@#584778f98ba1d0eb7c80a5ae1fe12fe2", "app2/0.1@#3850895c1eac8223c43c71d525348019"] + ] + +The result is a list of lists. Every inner list is a "level", it is formed by mutually independent references that +can be built in parallel, because they don't depend on each other. But every level will have dependencies to the +previous levels, so it is necessary to build those levels in order. + +The build order list can be iterated, building the packages in order. The necessary information is in the bundle +file itself, so we can read it and use it, something like: + + +.. code:: python + + # Get the build order + build_order = json.loads(open("build_order.json").read()) + + # Read the bundle + bundle = json.loads(open("lock.bundle").read()) + bundle = bundle["lock_bundle"] + for level in build_order: # iterate the build_order + for ref in level: # All refs in this level could be built in parallel + # Now get the package_ids and lockfile information + package_ids = bundle[ref]["package_id"] + for pkg_id, info in package_ids.items(): + lockfiles = info["lockfiles"] + lockfile = next(iter(sorted(lockfiles))) # Get the first one, all should be valid to build same packag_id + + os.system("conan install {ref} --build={ref} --lockfile={lockfile} " + "--lockfile-out={lockfile}".format(ref=ref, lockfile=lockfile)) + os.system("conan lock bundle update lock.bundle") + + +This works under the hypothesis that the same binary, identified by the same ``package_id`` will be obtained irrespective +of which lockfile or final product is used to build it. If this doesn't hold true, then the ``package_id`` policies should +be revised until this condition is met. + +.. important:: + + Recall that this is an orchestration mechanism, that can be used to distribute the actual ``conan install`` tasks + to different agents, based on the lockfile itself, we might need some logic to send that build to one or another + build server. If we didn't want to orchestrate and everything can be built in this machine a + ``conan install app1/1.1@ --lockfile={lockfile} --build=missing`` would build all the necessary dependencies in the + graph, in the current agent. + + +Note that the builds themselves are using regular lockfiles. The bundle does not contain the necessary information to +reproduce the dependency graph that is needed to create packages. + +The command ``conan lock bundle update lock.bundle`` manages to update all the connected lockfiles after a reference has been +built. When the build is fired, it is done using 1 of the lockfiles, for a given configuration. That lockfile will get the +updated package revision and status. The ``conan lock bundle update`` does this process in 2 steps: + +- Scan all connected lockfiles for every ``ref`` recipe reference and ``package_id``, and collect those that have been modified. +- Propagate the modified information to all the other connected lockfiles. + +After ``conan lock bundle update``, all packages sharing the same reference and ``package_id`` should have the same status (marked +"modified" and same package revision) diff --git a/versioning/lockfiles/ci.rst b/versioning/lockfiles/ci.rst index 9fbd46a0623c..66ee33cb39f8 100644 --- a/versioning/lockfiles/ci.rst +++ b/versioning/lockfiles/ci.rst @@ -13,7 +13,7 @@ case. It doesn't aim to present a complete solution or the only possible one, de project, the team, the requirements, the constraints, etc., other approaches might be recommended. In this section we are going to use the same packages than in the previous one, defining this - dependency graph. +dependency graph. .. image:: conan_lock_build_order.png :height: 200 px @@ -48,7 +48,7 @@ need to build a new binary because a new ``package_id`` will be computed. $ conan config set general.default_package_id_mode=full_version_mode -This example will use version ranges, and it is not necessary to have revisions enabled. It also do not require +This example will use version ranges, and it is not necessary to have revisions enabled. It also does not require a server, everything can be reproduced locally, although the usage of different repositories will be introduced. @@ -157,9 +157,9 @@ revision doing an export, creating a new *libb_base.lock* lockfile: Products pipeline ----------------- There is an important question to be addressed: **when a package changes, what other packages -consuming it should be rebuild to account for this change?**. The problem might be harder than +consuming it should be rebuilt to account for this change?**. The problem might be harder than it seems at first sight, or from the observation of the graph above. It shows that ``libd/0.1`` -has a dependency to ``libb/0.1``, does it means that a new ``libb/0.2`` should produce a re-build +has a dependency to ``libb/0.1``, does it mean that a new ``libb/0.2`` should produce a re-build of ``libd/0.1`` to link with the new version? Not always, if ``libd`` had a pinned dependency and not a version range, it will never resolve to the new version, and then it doesn't and it cannot be rebuilt unless some developer makes some changes to ``libd`` and bumps the requirement. diff --git a/versioning/lockfiles/conan_lock_bundle.png b/versioning/lockfiles/conan_lock_bundle.png new file mode 100644 index 0000000000000000000000000000000000000000..829c1dfbf83bd25916752606f535ff580e497d7e GIT binary patch literal 40933 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 ss-l1Sf}r%PZn>e_|DSSYR;N^{SSpWb4 literal 0 HcmV?d00001 diff --git a/versioning/lockfiles/introduction.rst b/versioning/lockfiles/introduction.rst index 5a861bc97250..b28de62a648b 100644 --- a/versioning/lockfiles/introduction.rst +++ b/versioning/lockfiles/introduction.rst @@ -27,7 +27,7 @@ Locking dependencies This example uses ``full_version_mode``, that is, if a package changes any part of its version, its consumers will need to build a new binary because a new ``package_id`` will be computed. This example will use version ranges, and -it is not necessary to have revisions enabled. It also do not require a server, everything can be reproduced locally. +it is not necessary to have revisions enabled. It also does not require a server, everything can be reproduced locally. .. code-block:: bash From 1c8081de009423df4c3bb008fc1a664d789b4e6b Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Fri, 26 Feb 2021 13:11:22 +0100 Subject: [PATCH 065/681] Merge master to develop (#2036) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido * Remove misleading message about ConanCenter in shared_library_package_id() (#2000) * Update yocto docs (#2022) * Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido * Release 1.34.0 (#2035) * buildroot.rst: Fix a typo (#1996) Artifatory --> Artifactory * - meson : add target argument (#2011) Signed-off-by: SSE4 * Update develop with master (#2020) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner * Fix multiple minor spelling mistakes (#2019) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix multiple minor spelling mistakes * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: Carlos Zoido * Rename QbsToolchain to QbsProfile (#2027) * Rename QbsToolchain to QbsProfile * Rename use_profile to profile * conan_v2_error update (#2031) * lock bundle (#2030) * lock bundle * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido Co-authored-by: Carlos Zoido * release 1.34.0 * fix changelog * Merge master to release branch (#2034) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido * Remove misleading message about ConanCenter in shared_library_package_id() (#2000) * Update yocto docs (#2022) * Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: rico-chet Co-authored-by: SSE4 Co-authored-by: James Co-authored-by: chausner Co-authored-by: Psy-Kai Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: James Co-authored-by: chausner Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: rico-chet Co-authored-by: SSE4 Co-authored-by: Psy-Kai --- .ci/publish.jenkins | 1 + changelog.rst | 30 +++++++++++++++++++++++++++++- conf.py | 4 ++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index 5b827df43167..74248d458e4a 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,6 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ + 'release/1.34.0': '1.34', 'release/1.33.1': '1.33', 'release/1.32.1': '1.32', 'release/1.31.4': '1.31', diff --git a/changelog.rst b/changelog.rst index 1dbfe9c4ee60..979f5dcf1522 100644 --- a/changelog.rst +++ b/changelog.rst @@ -18,9 +18,37 @@ Check https://github.com/conan-io/conan for issues and more details about develo .. important:: - Conan 1.33 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please + Conan 1.34 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.34.0 (26-Feb-2021) +-------------------- + +- Feature: Add `path` and `repository` properties to conan_build_info v2. `#8436 `_ +- Feature: Setting _conan_ as name for `buildAgent` in `conan_build_info`. `#8433 `_ +- Feature: Using actual conan version in version for `buildAgent` in `conan_build_info` instead of 1.X. `#8433 `_ +- Feature: Add `type` _conan_ to Conan build info modules. `#8433 `_ +- Feature: Add ``scm`` output in :command:`conan info` command. `#8380 `_ +- Feature: Forked ``cmake_find_package_multi`` into ``CMakeDeps``, to allow evolution without breaking. `#8371 `_ +- Feature: Use built-in retries in requests lib to retry http requests with _5xx_ response code. `#8352 `_ +- Feature: New lockfile "bundle" feature that can integrate different lockfiles for different configurations and different graphs into a single lockfile bundle that can be used to vastly optimize CI (specially for multiple products), implementing bundle build-order and bundle update operations. `#8344 `_ . Docs `here `__ +- Fix: Renamed generator `QbsToolchain` to `QbsProfile`. `#8537 `_ . Docs `here `__ +- Fix: Renamed default filename of _QbsProfile_ generated file to _conan_toolchain_profile_.qbs. `#8537 `_ . Docs `here `__ +- Fix: Renamed Qbs attribute `use_toolchain_profile` to `profile`. `#8537 `_ . Docs `here `__ +- Fix: Remove extra spaces in flags and colons in path variables. `#8496 `_ +- Fix: `conan_v2_error` if `scm_to_conandata` is not enabled. `#8447 `_ +- Fix: `CONAN_V2_MODE` env-var does not longer alter behavior, only raises errors for Conan 2.0 incompatibilities `#8399 `_ . Docs `here `__ +- Fix: meson : Add target and jobs arguments. `#8384 `_ . Docs `here `__ +- Fix: Set `qbs.targetPlatform` with qbs toolchain. `#8372 `_ +- Fix: Remove warnings for old toolchains imports and ``generate_toolchain_files()`` calls (use new imports and ``generate()`` calls. `#8361 `_ +- BugFix: Improve `tools.unix_path` for Cygwin. `#8509 `_ +- BugFix: Allow `run_in_windows_bash` in MSYS/Cygwin. `#8506 `_ +- BugFix: Add some sanity check to avoid a vague error for custom architectures. `#8502 `_ +- BugFix: Fix Apple M1 detection. `#8501 `_ +- Bugfix: Fix repeated ``build_requires``, including conflicting versions in profile composition or inclusion that repeats ``[build_requires]`` values. `#8463 `_ +- Bugfix: Fixing a `CMakeDeps` bug with components, not finding the _conan_macros.cmake_ file. `#8445 `_ +- Bugfix: Fix exit code for `conan_build_info`. `#8408 `_ + 1.33.1 (02-Feb-2021) -------------------- diff --git a/conf.py b/conf.py index cbad054deaf9..0f0e47059d2f 100644 --- a/conf.py +++ b/conf.py @@ -41,9 +41,9 @@ ] # The short X.Y version. -version = "1.33" +version = "1.34" # The full version, including alpha/beta/rc tags. -release = u'1.33.1' +release = u'1.34.0' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): From a773ba1636ca030e80285ecb1602a015dc6c7e6a Mon Sep 17 00:00:00 2001 From: melak47 Date: Mon, 1 Mar 2021 09:20:00 +0100 Subject: [PATCH 066/681] update constrained settings example error message (#2032) --- faq/troubleshooting.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/faq/troubleshooting.rst b/faq/troubleshooting.rst index 4070a2d3fb0d..b8192fa3807f 100644 --- a/faq/troubleshooting.rst +++ b/faq/troubleshooting.rst @@ -8,7 +8,7 @@ When you install or create a package you might have error like the following one .. code-block:: text - ERROR: The recipe is constraining settings. Invalid setting 'Linux' is not a valid 'settings.os' value. + ERROR: The recipe wtl/10.0.9163 is constraining settings. Invalid setting 'Linux' is not a valid 'settings.os' value. Possible values are ['Windows'] Read "http://docs.conan.io/en/latest/faq/troubleshooting.html#error-the-recipe-is-contraining-settings" From b41fe91c83efc304c50e3fdc177d8469a9ad9a7a Mon Sep 17 00:00:00 2001 From: jsinge Date: Mon, 1 Mar 2021 10:05:44 +0100 Subject: [PATCH 067/681] Make the instructions in the note about gcc libcxx ABI compatibility more explicit. (#2037) * More explicit instructions on the Getting Started page * Provide a command to check gccs default configuration value on the Manage gcc >= 5 ABI page. --- getting_started.rst | 4 +++- howtos/manage_gcc_abi.rst | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/getting_started.rst b/getting_started.rst index 4c73e0c7e29c..a62036485d25 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -119,7 +119,9 @@ An MD5 hash calculator using the Poco Libraries .. important:: If you are using **GCC compiler >= 5.1**, Conan will set the ``compiler.libcxx`` to the old - ABI for backwards compatibility. You can change this with the following commands: + ABI for backwards compatibility. In the context of this getting started example, this is a bad choice though: + Recent gcc versions will compile the example by default with the new ABI and linking will fail without further + customization of your cmake configuration. You can avoid this with the following commands: .. code-block:: bash diff --git a/howtos/manage_gcc_abi.rst b/howtos/manage_gcc_abi.rst index d7de167f4502..8d35eb2ca9c0 100644 --- a/howtos/manage_gcc_abi.rst +++ b/howtos/manage_gcc_abi.rst @@ -15,6 +15,13 @@ You can choose which ABI to use in your Conan packages by adjusting the ``compil When Conan creates the default profile the first time it runs, it adjusts the ``compiler.libcxx`` setting to ``libstdc++`` for backwards compatibility. However, if you are using GCC >= 5 your compiler is likely to be using the new CXX11 ABI by default (libstdc++11). +This can be checked with the following command: + +.. code-block:: bash + + $ gcc -v 2>&1 | sed -n 's/.*\(--with-default-libstdcxx-abi=new\).*/\1/p' + --with-default-libstdcxx-abi=new + If you want Conan to use the new ABI, edit the default profile at ``~/.conan/profiles/default`` adjusting ``compiler.libcxx=libstdc++11`` or override this setting in the profile you are using. From d16fd38d9ada801d0b6b8a6ca34b984c42727bac Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 1 Mar 2021 15:20:22 +0100 Subject: [PATCH 068/681] Document CONAN_SYSTEM_INCLUDES (#2038) --- reference/generators/cmake.rst | 1 + reference/generators/cmakemulti.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/reference/generators/cmake.rst b/reference/generators/cmake.rst index 37c08eb5f840..8d27405ede1c 100644 --- a/reference/generators/cmake.rst +++ b/reference/generators/cmake.rst @@ -211,6 +211,7 @@ conan_global_flags() ++++++++++++++++++++ Sets the corresponding variables to CMake's ``include_directories()`` and ``link_directories()``. +You can enable the variable `CONAN_SYSTEM_INCLUDES` in order to get directories included with the `SYSTEM` option. conan_define_targets() ++++++++++++++++++++++ diff --git a/reference/generators/cmakemulti.rst b/reference/generators/cmakemulti.rst index 99d7022c6a4b..dd3e8a893c1d 100644 --- a/reference/generators/cmakemulti.rst +++ b/reference/generators/cmakemulti.rst @@ -90,6 +90,7 @@ conan_global_flags() ++++++++++++++++++++ Set the corresponding variables to CMake's ``include_directories()`` and ``link_directories()``. +You can enable the variable `CONAN_SYSTEM_INCLUDES` in order to get directories included with the `SYSTEM` option. conan_define_targets() ++++++++++++++++++++++ From 9015e2118d21fced7182a466a4a0913ad4b30215 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Mon, 1 Mar 2021 12:00:05 -0300 Subject: [PATCH 069/681] #2025 Replace Bintray by Artifactory (#2029) Signed-off-by: Uilian Ries Co-authored-by: James --- .../conan-artifactory_ce.png | Bin .../conan-artifactory_create_account.png | Bin 0 -> 111267 bytes .../conan-artifactory_setme_up.png | Bin 0 -> 35510 bytes .../artifactory/conan-artifactory_token.png | Bin 0 -> 85328 bytes uploading_packages.rst | 3 +- .../{ => artifactory}/artifactory_ce.rst | 2 +- .../artifactory/artifactory_cloud.rst | 65 +++++++++++++++ .../conan_center_guide.rst | 0 .../bintray/uploading_bintray.rst | 75 ------------------ uploading_packages/remotes.rst | 40 +--------- uploading_packages/using_artifactory.rst | 18 +++++ uploading_packages/using_bintray.rst | 19 ----- 12 files changed, 89 insertions(+), 133 deletions(-) rename images/{ => artifactory}/conan-artifactory_ce.png (100%) create mode 100644 images/artifactory/conan-artifactory_create_account.png create mode 100644 images/artifactory/conan-artifactory_setme_up.png create mode 100644 images/artifactory/conan-artifactory_token.png rename uploading_packages/{ => artifactory}/artifactory_ce.rst (98%) create mode 100644 uploading_packages/artifactory/artifactory_cloud.rst rename uploading_packages/{bintray => artifactory}/conan_center_guide.rst (100%) delete mode 100644 uploading_packages/bintray/uploading_bintray.rst create mode 100644 uploading_packages/using_artifactory.rst delete mode 100644 uploading_packages/using_bintray.rst diff --git a/images/conan-artifactory_ce.png b/images/artifactory/conan-artifactory_ce.png similarity index 100% rename from images/conan-artifactory_ce.png rename to images/artifactory/conan-artifactory_ce.png diff --git a/images/artifactory/conan-artifactory_create_account.png b/images/artifactory/conan-artifactory_create_account.png new file mode 100644 index 0000000000000000000000000000000000000000..c1518e53ad98cec62896dd385ea8932e93d8b1a0 GIT binary patch literal 111267 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 U0rOjxD{j~8fZu+y+gG{20K1kai2wiq literal 0 HcmV?d00001 diff --git a/images/artifactory/conan-artifactory_setme_up.png b/images/artifactory/conan-artifactory_setme_up.png new file mode 100644 index 0000000000000000000000000000000000000000..4166762e3f69121715d23967d0333731e9a8ed05 GIT binary patch literal 35510 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 KT-G@yGywo`krfUA literal 0 HcmV?d00001 diff --git a/images/artifactory/conan-artifactory_token.png b/images/artifactory/conan-artifactory_token.png new file mode 100644 index 0000000000000000000000000000000000000000..b473cdf18fc8b146698856baad796c155985af23 GIT binary patch literal 85328 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 G2K*liFp}>8 literal 0 HcmV?d00001 diff --git a/uploading_packages.rst b/uploading_packages.rst index 8770cd55a1fc..6e88daf78927 100644 --- a/uploading_packages.rst +++ b/uploading_packages.rst @@ -11,6 +11,5 @@ you can use. uploading_packages/remotes uploading_packages/uploading_to_remotes - uploading_packages/using_bintray - uploading_packages/artifactory_ce + uploading_packages/using_artifactory uploading_packages/running_your_server diff --git a/uploading_packages/artifactory_ce.rst b/uploading_packages/artifactory/artifactory_ce.rst similarity index 98% rename from uploading_packages/artifactory_ce.rst rename to uploading_packages/artifactory/artifactory_ce.rst index beccb93ff810..3f8014f237ef 100644 --- a/uploading_packages/artifactory_ce.rst +++ b/uploading_packages/artifactory/artifactory_ce.rst @@ -21,7 +21,7 @@ subfolder, depending on the OS. Java 8 update 45 or later runtime is required. If you don't have it, please install it first (newer Java versions preferred). -.. image:: ../images/conan-artifactory_ce.png +.. image:: ../../images/artifactory/conan-artifactory_ce.png Once Artifactory has started, navigate to the default URL `http://localhost:8081`, where the Web UI should be running. The default user and password are ``admin:password``. diff --git a/uploading_packages/artifactory/artifactory_cloud.rst b/uploading_packages/artifactory/artifactory_cloud.rst new file mode 100644 index 000000000000..11a2b1bb8082 --- /dev/null +++ b/uploading_packages/artifactory/artifactory_cloud.rst @@ -0,0 +1,65 @@ +.. _artifactory_cloud: + +Uploading to Artifactory Cloud Instance +======================================= + +Conan packages can be uploaded to Artifactory under your own users or organizations. To create a +repository follow these steps: + +1. **Create an Artifactory Free-Tier account** + + Browse to https://jfrog.com/artifactory/start-free/?isConan=true and submit the form to create your account. Note that + you don't have to use the same username that you use for your Conan account. + + .. image:: ../../images/artifactory/conan-artifactory_create_account.png + +2. **Add your Artifactory repository** + + To get the correct address, click on ``Application -> Artifactory -> Artifacts -> Set Me Up``: + + .. image:: ../../images/artifactory/conan-artifactory_setme_up.png + + Add a Conan remote in your Conan client pointing to your Artifactory repository. + + .. code-block:: bash + + $ conan remote add + +4. **Get your API key** + + Your API key is the “password” used to authenticate the Conan client to Artifactory, NOT your Artifatory + password. To get your API key, go to “Set Me Up” and enter your account password. Your API key will + appear on conan user command line listed on Set Me Up box: + + .. image:: ../../images/artifactory/conan-artifactory_token.png + +5. **Set your user credentials** + + Add your Conan user with the API Key, your remote and your Artifatory user name: + + .. code-block:: bash + + $ conan user -p -r + +Setting the remotes in this way will cause your Conan client to resolve packages and install them from +repositories in the following order of priority: + + 1. `conan-center`_ + 2. Your own repository + +If you want to have your own repository first, please use the ``--insert`` command line option +when adding it: + +.. code-block:: bash + + $ conan remote add --insert 0 + $ conan remote list + : [Verify SSL: True] + conan-center: https://conan.bintray.com [Verify SSL: True] + +.. tip:: + + Check the full reference of :ref:`$ conan remote` command. + + +.. _`conan-center`: https://conan.io/center diff --git a/uploading_packages/bintray/conan_center_guide.rst b/uploading_packages/artifactory/conan_center_guide.rst similarity index 100% rename from uploading_packages/bintray/conan_center_guide.rst rename to uploading_packages/artifactory/conan_center_guide.rst diff --git a/uploading_packages/bintray/uploading_bintray.rst b/uploading_packages/bintray/uploading_bintray.rst deleted file mode 100644 index c9d212d9639d..000000000000 --- a/uploading_packages/bintray/uploading_bintray.rst +++ /dev/null @@ -1,75 +0,0 @@ -.. _uploading_to_bintray: - -Uploading to Bintray -==================== - -Conan packages can be uploaded to Bintray under your own users or organizations. To create a -repository follow these steps: - -1. **Create a Bintray Open Source account** - - Browse to https://bintray.com/signup/oss and submit the form to create your account. Note that - you don't have to use the same username that you use for your Conan account. - - .. warning:: - - Please **make sure you use the Open Source Software OSS account**. - Follow this link: https://bintray.com/signup/oss. - Bintray provides free Conan repositories for OSS projects, so there is no need to open a Pro or - Enterprise Trial account. - -2. **Create a Conan repository** - - If you intend to collaborate with other users, you first need to create a Bintray organization, - and create your repository under the organization’s profile rather than under your own user - profile. - - In your user profile (or organization profile), click “Add new repository” and fill in the Create - Repository form. Make sure to select Conan as the Type. - -3. **Add your Bintray repository** - - Add a Conan remote in your Conan client pointing to your Bintray repository - - .. code-block:: bash - - $ conan remote add - - Use the Set Me Up button on your repository page on Bintray to get its URL. - -4. **Get your API key** - - Your API key is the “password” used to authenticate the Conan client to Bintray, NOT your Bintray - password. To get your API key, go to “Edit Your Profile” in your Bintray account and - check the API Key section. - -5. **Set your user credentials** - - Add your Conan user with the API Key, your remote and your Bintray user name: - - .. code-block:: bash - - $ conan user -p -r - -Setting the remotes in this way will cause your Conan client to resolve packages and install them from -repositories in the following order of priority: - - 1. `conan-center`_ - 2. Your own repository - -If you want to have your own repository first, please use the ``--insert`` command line option -when adding it: - -.. code-block:: bash - - $ conan remote add --insert 0 - $ conan remote list - : [Verify SSL: True] - conan-center: https://conan.bintray.com [Verify SSL: True] - -.. tip:: - - Check the full reference of :ref:`$ conan remote` command. - - -.. _`conan-center`: https://bintray.com/conan/conan-center diff --git a/uploading_packages/remotes.rst b/uploading_packages/remotes.rst index 1b365568c749..794e1224ba3e 100644 --- a/uploading_packages/remotes.rst +++ b/uploading_packages/remotes.rst @@ -29,12 +29,10 @@ For private development: For distribution: -- **Bintray**: Bintray is a cloud platform that gives you full control over how you publish, store, - promote, and distribute software. You can create binary repositories in Bintray to share Conan - packages or even create an organization. It is free for open source packages, and the recommended - server to distribute to the C and C++ communities. Check :ref:`using_bintray` for more information. - -.. _bintray_repositories: +- **Artifactory Cloud-hosted instance**: Artifactory Cloud, where JFrog manages, maintains and scales + the infrastructure and provides automated server backups with free updates and guaranteed uptime. + It's offered with a free tier designed for individual with reduced usage. + Check :ref:`artifactory_cloud` for more information. .. _conan_center: @@ -62,35 +60,5 @@ There are 2 different types of packages right now in Conan-center: To contribute packages to Conan-center, read the :ref:`conan-center guide ` for more information. -Bintray Community Repositories ------------------------------- - -There are a number of popular community repositories that may be of interest for Conan users for retrieving -open source packages. These repositories are not affiliated with the Conan team. - -Bincrafters -+++++++++++ - -**bincrafters** : https://bintray.com/bincrafters/public-conan - -.. pull-quote:: - - The `Bincrafters `_ team builds binary software packages for the - OSS community. This repository contains a wide and growing variety of Conan packages from - contributors. - - Use the following command to add this remote to Conan: - - .. code-block:: bash - - $ conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan - -.. note:: - - If you are working in a team, you probably want to use the same remotes everywhere: developer machines, CI. The ``conan config install`` - command can automatically define the remotes in a Conan client, as well as other resources as profiles. Have a look at the - :ref:`conan_config_install` command. - - .. _`conan-center`: https://bintray.com/conan/conan-center .. _Artifactory documentation: https://www.jfrog.com/confluence/display/JFROG/JFrog+Artifactory diff --git a/uploading_packages/using_artifactory.rst b/uploading_packages/using_artifactory.rst new file mode 100644 index 000000000000..0ce4feaed4c6 --- /dev/null +++ b/uploading_packages/using_artifactory.rst @@ -0,0 +1,18 @@ +.. _using_artifactory: + +Using Artifactory +----------------- + +In Artifactory, you can create and manage as many free, personal Conan repositories as you like. +On an `Free-Tier`_ account, all packages you upload are public, and anyone can use them by simply adding your +repository to their Conan remotes. You still can create private repositories using :ref:`Artifatory CE` +or Artifactory Cloud Premium account. + +.. toctree:: + :maxdepth: 2 + + artifactory/artifactory_cloud + artifactory/artifactory_ce + artifactory/conan_center_guide + +.. _Free-Tier: https://jfrog.com/artifactory/start-free/?pipelines=true&isConan=true \ No newline at end of file diff --git a/uploading_packages/using_bintray.rst b/uploading_packages/using_bintray.rst deleted file mode 100644 index e86e4325d51d..000000000000 --- a/uploading_packages/using_bintray.rst +++ /dev/null @@ -1,19 +0,0 @@ -.. _using_bintray: - -Using Bintray -------------- - -In Bintray, you can create and manage as many free, personal Conan repositories as you like. -On an OSS account, all packages you upload are public, and anyone can use them by simply adding your -repository to their Conan remotes. - -To allow collaboration on open source projects, you can also create -`Organizations `_ -in Bintray and add members who will be able to create and edit packages in your organization's -repositories. - -.. toctree:: - :maxdepth: 2 - - bintray/uploading_bintray - bintray/conan_center_guide From fb6c3134d9a71a2793e2856846976d7e10f14f59 Mon Sep 17 00:00:00 2001 From: "Javier G. Sogo" Date: Tue, 2 Mar 2021 10:08:45 +0100 Subject: [PATCH 070/681] Rework docs related to options (#1867) * rework docs around options * Update reference/conanfile/attributes.rst Co-authored-by: Jerry * Update reference/conanfile/attributes.rst Co-authored-by: Jerry * add condition in configure * review * Update reference/conanfile/attributes.rst * Update reference/conanfile/attributes.rst Co-authored-by: Alexandr Timofeev * note about assigning options in config_options method * Update reference/conanfile/attributes.rst Co-authored-by: Jerry Co-authored-by: Alexandr Timofeev Co-authored-by: Daniel Co-authored-by: James --- mastering/conditional.rst | 19 ++- reference/conanfile/attributes.rst | 234 +++++++++++++++++------------ reference/conanfile/methods.rst | 8 +- 3 files changed, 155 insertions(+), 106 deletions(-) diff --git a/mastering/conditional.rst b/mastering/conditional.rst index 3cb9b8ba7abf..15911825b843 100644 --- a/mastering/conditional.rst +++ b/mastering/conditional.rst @@ -3,25 +3,26 @@ Conditional settings, options and requirements ============================================== -Remember, in your ``conanfile.py`` you also have access to the options of your dependencies, -and you can use them to: +Remember, in your ``conanfile.py`` you can use the value of your options to: * Add requirements dynamically -* Change values of options +* Change values of other options +* Assign values to options of your requirements -The **configure** method might be used to hardcode dependencies options values. +The ``configure()`` method might be used to hardcode values for options of the requirements. It is strongly discouraged to use it to change the settings values. Please remember that ``settings`` are a configuration *input*, so it doesn't make sense to modify it in the recipes. Also, for options, a more flexible solution is to define dependencies options values in the ``default_options``, -not in the ``configure()`` method, as this would allow to override them. Hardcoding them in the ``configure()`` -method won't allow that and thus won't easily allow conflict resolution. Use it only when it is absolutely +not in the ``configure()`` method. Setting the values in ``configure()`` won't allow to override them and it +will make really hard (even impossible) to resolve some conflicts. Use it only when it is absolutely necessary that the package dependencies use those options. Here is an example of what we could do in our **configure method**: .. code-block:: python + class Recipe(ConanFile): ... requires = "poco/1.9.4" # We will add OpenSSL dynamically "openssl/1.0.2t" ... @@ -48,6 +49,12 @@ Here is an example of what we could do in our **configure method**: else: self.requires("openssl/1.0.2u") + def build(self): + # We can check the final values of options of our requirements + if self.options['poco'].that_option != "bar": + raise ConanInvalidConfiguration("Who modified this option?!") + + Constrain settings and options ------------------------------ diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 0407d9a23ab9..d844e4b615f7 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -320,77 +320,104 @@ The ``get_safe()`` method will return ``None`` if that setting or subsetting doe options ------- -Conan packages recipes can generate different binary packages when different settings are used, but can also customize, per-package any other configuration that will produce a different binary. +Conan provides this attribute to declare traits which will affect only one reference, unlike the settings that are typically the +same for all the recipes in a Conan graph. Options are declared per recipe, this attribute consist on a dictionary where the key is the +option name and the value is the list of different values that the option can take. -A typical option would be being shared or static for a certain library. Note that this is optional, different packages can have this option, or not (like header-only packages), and different packages can have different values for this option, as opposed to settings, which typically have the same values for all packages being installed (though this can be controlled too, defining different settings for specific packages) - -Options are defined in package recipes as dictionaries of name and allowed values: - -.. code-block:: python - - class MyPkg(ConanFile): - ... - options = {"shared": [True, False]} - -Options are defined as a python dictionary inside the ``ConanFile`` where each key must be a -string with the identifier of the option and the value be a list with all the possible option -values: +.. important:: + + All the options with their values are encoded into the package ID, as everything that affects the generated binary. + See :ref:`method_configure_config_options` and :ref:`method_package_id` methods for information about removing certain + options for some configurations. -.. code-block:: python - class MyPkg(ConanFile): - ... - options = {"shared": [True, False], - "option1": ["value1", "value2"],} +A very common one is the option ``shared`` with allowed values of ``[True, False]`` that many recipes declare and use to configure the +build system to produce a static library or a shared library. -Values for each option can be typed or plain strings, and there is a special value, ``ANY``, for +Values for each option can be typed or plain strings (``"value"``, ``True``, ``None``, ``42``,...) and there is a special value, ``"ANY"``, for options that can take any value. -The attribute ``default_options`` has the purpose of defining the default values for the options -if the consumer (consuming recipe, project, profile or the user through the command line) does -not define them. It is worth noticing that **an uninitialized option will get the value** ``None`` -**and it will be a valid value if its contained in the list of valid values**. This attribute -should be defined as a python dictionary too, although other definitions could be valid for -legacy reasons. - .. code-block:: python class MyPkg(ConanFile): ... - options = {"shared": [True, False], - "option1": ["value1", "value2"], - "option2": "ANY"} - default_options = {"shared": True, - "option1": "value1", - "option2": 42} - - def build(self): - shared = "-DBUILD_SHARED_LIBS=ON" if self.options.shared else "" - cmake = CMake(self) - self.run("cmake . %s %s" % (cmake.command_line, shared)) - ... + options = { + "shared": [True, False], + "option1": ["value1", "value2"], + "option2": "ANY", + "option3": [None, "value1", "value2"], + "option4": [True, False, "value"], + } + +Every option in a recipe needs to be assigned a value from the ones declared in the ``options`` attribute. The +consumer can define options using different methods: command line, profile or consumer +recipes; **an uninitialized option will get the value** ``None`` **and it will be a valid value if it is contained +in the list of valid values**. Invalid values will produce an error. See attribute :ref:`conanfile_default_options` +for a way to declare a default value for options in a recipe. .. tip:: - You can inspect available package options reading the package recipe, which can be done with the command :command:`conan inspect mypkg/0.1@user/channel`. + +.. tip:: + - Options ``"shared": [True, False]`` and ``"fPIC": [True, False]`` are automatically managed in :ref:`cmake_reference` and :ref:`autotools_reference` build helpers. + +**Define the value of an option** + As we mentioned before, values for options in a recipe can be defined using different ways, let's go over all of them for the example recipe ``mypkg`` defined above: -- Using the attribute ``default_options`` in the recipe itself. -- In the ``default_options`` of a recipe that requires this one: the values defined here - will override the default ones in the recipe. +- In the recipe that declares the option: + + + Using the attribute ``default_options`` in the recipe itself. + + + In the ``config_options()`` method of the recipe. + + + In the ``configure()`` method of the recipe itself (**this one has the highest precedence**, this + value can't be overriden) + + .. code-block:: python + + class MyPkg(ConanFile): + + options = { + "shared": [True, False], + "option1": ["value1", "value2"], + "option2": "ANY", + } + + def configure(self): + if some_condition: + self.options.shared = False + +- From a recipe that requires this one: - .. code-block:: python + + using the ``default_options`` attribute of the consumer: - class OtherPkg(ConanFile): - requires = "mypkg/0.1@user/channel" - default_options = {"mypkg:shared": False} + .. code-block:: python - Of course, this will work in the same way working with a *conanfile.txt*: + class OtherPkg(ConanFile): + requires = "mypkg/0.1@user/channel" + default_options = {"mypkg:shared": False} + + + in the ``configure()`` method of the consumer (**highest precedence after** ``configure()`` **in the recipe itself**): + + .. code-block:: python + + class OtherPkg(ConanFile): + requires = "mypkg/0.1@user/channel" + + def configure(self): + self.options['mypkg'].shared = False + + This method allows to assign values based on other conditions, it can have some drawbacks + as it is explainded in the :ref:`mastering section`. + +- In the *conanfile.txt* file: .. code-block:: text @@ -405,32 +432,57 @@ go over all of them for the example recipe ``mypkg`` defined above: .. code-block:: text - # file "myprofile" - # use it as $ conan install -pr=myprofile [settings] setting=value [options] mypkg:shared=False -- Last way of defining values for options, with the highest priority over them all, is to pass - these values using the command argument :command:`-o` in the command line: +- Last way of defining values for options is to pass these values using the command argument :command:`-o,--option` in the command line: .. code-block:: bash - $ conan install . -o mypkg:shared=True -o otherpkg:option=value + $ conan install . -o mypkg:shared=True + +Regarding the precedence of all these ways of assigning a value to an option, it works like any other configuration element in Conan: +the closer to the consumer and the command line the higher the precedence. The list above is ordered from the less priority to the +highest one (with the exceptional assignment in ``configure()`` method which cannot be overridden). + + +**Get the value of an option** + +Values from options can be retrieved after they are assigned. For options that belong to the same recipe, the value can +be retrieved in any method to run logic conditional to their values. **Options from required packages can be +retrieved only after the full graph has been resolved**, this means that the value will be available in the methods +``build()``, ``package()``, ``package_info()``. Accessing those values in other methods can lead to unexpected results. + -Values for options can be also conditionally assigned (or even deleted) in the methods -``configure()`` and ``config_options()``, the -:ref:`corresponding section` has examples documenting these -use cases. However, conditionally assigning values to options can have it drawbacks as it is -explained in the :ref:`mastering section`. +.. code-block:: python + + class OtherPkg(ConanFile): + requires = "mypkg/0.1@user/channel" + + def build(self): + if self.options['mypkg'].shared: + raise ConanInvalidConfiguration("Cannot use shared library of requirement 'mypkg'") + +If you want to retrieve the value of an option and fallback to a known value if the option doesn't exist +you can use the ``get_safe()`` method: -One important notice is how these options values are evaluated and how the different conditionals -that we can implement in Python will behave. As seen before, values for options can be defined -in Python code (assigning a dictionary to ``default_options``) or through strings (using a -``conanfile.txt``, a profile file, or through the command line). In order to provide a -consistent implementation take into account these considerations: +.. code-block:: python + + def build(self): + # Will return None if doesn't exist + fpic = self.options.get_safe("fPIC") + # Will return the default value if the return is None + shared = self.options.get_safe("shared", default=False) + +The ``get_safe()`` method will return ``None`` if that option doesn't exist and there is no default value assigned. + +**Evaluate options** + +It is very important to know how the options are evaluated in conditional expressions and how the +comparaison operator works with them: - Evaluation for the typed value and the string one is the same, so all these inputs would behave the same: @@ -448,7 +500,7 @@ consistent implementation take into account these considerations: string and for ``0`` and ``"0"`` as expected. - Comparison using ``is`` is always equals to ``False`` because the types would be different as - the option value is encapsulated inside a Conan class. + the option value is encapsulated inside a Python class. - Explicit comparisons with the ``==`` symbol **are case sensitive**, so: @@ -458,17 +510,6 @@ consistent implementation take into account these considerations: - A different behavior has ``self.options.option = None``, because ``assert self.options.option != None``. -If you want to do a safe check of options values, you could use the ``get_safe()`` method: - -.. code-block:: python - - def build(self): - # Will be None if doesn't exist - fpic = self.options.get_safe("fPIC") - # Will be the default version if the return is None - shared = self.options.get_safe("shared", default=False) - -The ``get_safe()`` method will return ``None`` if that option doesn't exist and there is no default value assigned. .. _conanfile_default_options: @@ -476,30 +517,31 @@ The ``get_safe()`` method will return ``None`` if that option doesn't exist and default_options --------------- -As you have seen in the examples above, recipe's default options are declared as a dictionary with the initial desired value of the options. -However, you can also specify default option values of the required dependencies: - -.. code-block:: python - - class OtherPkg(ConanFile): - requires = "pkg/0.1@user/channel" - default_options = {"pkg:pkg_option": "value"} - -And it also works with default option values of conditional required dependencies: +The attribute ``default_options`` has the purpose of defining the default values for the options +if the consumer (consuming recipe, project, profile or the user through the command line) does +not define them. This attribute should be defined as a python dictionary: .. code-block:: python - class OtherPkg(ConanFile): - default_options = {"pkg:pkg_option": "value"} + class MyPkg(ConanFile): + ... + options = {"build_tests": [True, False], + "option1": ["value1", "value2"], + "option2": "ANY"} + default_options = {"build_tests": True, + "option1": "value1", + "option2": 42} - def requirements(self): - if self.settings.os != "Windows": - self.requires("pkg/0.1@user/channel") + def build(self): + cmake = CMake(self) + cmake.definitions['BUILD_TESTS'] = self.options.build_tests + cmake.configure() + ... -For this example running in Windows, the `default_options` for the `pkg/0.1@user/channel` will be ignored, they will only be used on every -other OS. +Remember that you can also assign default values for options of your requirements as we've seen in +the attribute :ref:`conanfile_options`. -You can also set the options conditionally to a final value with ``config_options()`` instead of using ``default_options``: +You can also set the options conditionally to a final value with ``configure()`` instead of using ``default_options``: .. code-block:: python @@ -508,18 +550,14 @@ You can also set the options conditionally to a final value with ``config_option options = {"some_option": [True, False]} # Do NOT declare 'default_options', use 'config_options()' - def config_options(self): + def configure(self): if self.options.some_option == None: if self.settings.os == 'Android': self.options.some_option = True else: self.options.some_option = False -.. important:: - - Setting options conditionally without a default value works only to define a default value if not defined in command line. However, - doing it this way will assign a final value to the option and not an initial one, so those option values will not be overridable from - downstream dependent packages. +Take into account that if a value is assigned in the ``configure()`` method it cannot be overridden. .. important:: diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 723536073271..852262f9f075 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -398,8 +398,6 @@ recipe has requirements, you can access to your requirements ``user_info`` using jars = self.deps_user_info["pkg"].jars jar_list = jars.replace(" ", "").split(",") -.. _method_configure_config_options: - set_name(), set_version() -------------------------- @@ -450,6 +448,9 @@ To define a relative path to the *conanfile.py*, irrespective of the current wor See more examples :ref:`in this howto `. +.. _method_configure_config_options: + + configure(), config_options() ----------------------------- @@ -501,6 +502,9 @@ This will be executed before the actual assignment of ``options`` (then, such `` the command :command:`conan install -o pkg:shared=True` will raise an exception in Windows saying that ``shared`` is not an option for such package. +These methods can also be used to assign values to options as seen in :ref:`conanfile_options`. Values assigned +in the ``configure()`` method cannot be overriden, while values assigned in ``config_options()`` can. + .. _invalid_configuration: Invalid configuration From 91aa535859d97663d67c7388e95cda41e6542632 Mon Sep 17 00:00:00 2001 From: Jerry Wiltse Date: Wed, 3 Mar 2021 04:04:19 -0500 Subject: [PATCH 071/681] add note about revisions and line endings (#2028) --- versioning/revisions.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/versioning/revisions.rst b/versioning/revisions.rst index d9fda3602b32..9672ea7f5c51 100644 --- a/versioning/revisions.rst +++ b/versioning/revisions.rst @@ -76,6 +76,24 @@ Take into account that it changes the default Conan behavior. e.g: - If you generate and upload N binary packages for a recipe with a given revision, then if you modify the recipe, and thus the recipe revision, you need to build and upload N new binaries matching that new recipe revision. +GIT and Line Endings on Windows +------------------------------- + +.. warning:: + + **Problem** + + Git will (by default) checkout files in Windows systems using CRLF line endings, effectively producing different files. As files are different, the Conan revisions will be different from the revisions computed in other platforms such as Linux, resulting in missing the respective binaries in the other revision. + +**Solution** + +It is necessary to instruct Git to do the checkout with the same line endings. This can be done several ways, for example, by adding a .gitattributes file: + +.. code-block:: ini + + [auto] + crlf = false + Server support -------------- From 76764126c530a4ac7f469402985f81acea798dcf Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Wed, 10 Mar 2021 11:28:10 +0100 Subject: [PATCH 072/681] release 1.34.1 (#2041) --- .ci/publish.jenkins | 2 +- changelog.rst | 7 +++++++ conf.py | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index 74248d458e4a..80995d585d22 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,7 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ - 'release/1.34.0': '1.34', + 'release/1.34.1': '1.34', 'release/1.33.1': '1.33', 'release/1.32.1': '1.32', 'release/1.31.4': '1.31', diff --git a/changelog.rst b/changelog.rst index 979f5dcf1522..66304e19049c 100644 --- a/changelog.rst +++ b/changelog.rst @@ -21,6 +21,13 @@ Check https://github.com/conan-io/conan for issues and more details about develo Conan 1.34 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.34.1 (10-Mar-2021) +-------------------- + +- Fix: Allow ``cmake_find_package_multi`` and ``CMakeDeps`` to be aliases for ``cpp_info.names`` and ``cpp_info.filenames`` to allow easy migration. `#8568 `_ +- Bugfix: Restoring the behavior that `exports` and `exports_sources` were case sensitive by default. `#8621 `_ +- BugFix: Solved issues with already existing packages appearing in ``conan lock bundle build-order``. `#8579 `_ + 1.34.0 (26-Feb-2021) -------------------- diff --git a/conf.py b/conf.py index 0f0e47059d2f..9c92c37dfa9c 100644 --- a/conf.py +++ b/conf.py @@ -43,7 +43,7 @@ # The short X.Y version. version = "1.34" # The full version, including alpha/beta/rc tags. -release = u'1.34.0' +release = u'1.34.1' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): From c5cb780e8a38115f30610b01858b058260f4685f Mon Sep 17 00:00:00 2001 From: Jerry Wiltse Date: Tue, 16 Mar 2021 13:45:41 -0400 Subject: [PATCH 073/681] Warn about set name and version methods (#2043) * Warn about using both "set" attributes and methods Based on : https://github.com/conan-io/conan/issues/8646 * Update reference/conanfile/methods.rst Co-authored-by: James --- reference/conanfile/methods.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 852262f9f075..53a37e07e593 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -443,6 +443,14 @@ To define a relative path to the *conanfile.py*, irrespective of the current wor git = tools.Git(folder=self.recipe_folder) self.version = "%s_%s" % (git.get_branch(), git.get_revision()) + +.. warning:: + + The ``set_name()`` and ``set_version()`` methods are alternatives to the ``name`` and ``version`` attributes. It is + not advised or supported to define both a ``name`` attribute and a ``set_name()`` method. Likewise, it is + not advised or supported to define both a ``version`` attribute and a ``set_version()`` method. If you define both, + you may experience unexpected behavior. + .. seealso:: See more examples :ref:`in this howto `. From 23057236eec6c57841c6734c034233fc6d4d7f4d Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Mon, 22 Mar 2021 08:54:32 +0000 Subject: [PATCH 074/681] Remove need to update an out-of-date number (#2047) The text said "and declares two variables" - but there seems to be three variables in the table. This PR changes the text to "and declares these variables" - to remove the need to update the number in future... --- reference/generators/cmake_paths.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/generators/cmake_paths.rst b/reference/generators/cmake_paths.rst index caed9d1df766..216ea6754229 100644 --- a/reference/generators/cmake_paths.rst +++ b/reference/generators/cmake_paths.rst @@ -9,7 +9,7 @@ cmake_paths This is the reference page for ``cmake_paths`` generator. Go to :ref:`Integrations/CMake` if you want to learn how to integrate your project or recipes with CMake. -It generates a file named ``conan_paths.cmake`` and declares two variables: +It generates a file named ``conan_paths.cmake`` and declares these variables: .. _conan_paths_cmake_variables: From 538555eb8fb7e5ae3e2edb71a23873e642a2763b Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Mon, 22 Mar 2021 18:39:37 -0300 Subject: [PATCH 075/681] Add relative path for profiles Signed-off-by: Uilian Ries --- reference/profiles.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reference/profiles.rst b/reference/profiles.rst index 9770c5394e1e..fc445a7ac9fd 100644 --- a/reference/profiles.rst +++ b/reference/profiles.rst @@ -39,8 +39,9 @@ relative path: .. code-block:: bash - $ conan install . --profile /abs/path/to/profile # abs path - $ conan install . --profile ./relpath/to/profile # resolved to current dir + $ conan install . --profile /abs/path/to/profile # abs path + $ conan install . --profile ./relpath/to/profile # resolved to current dir + $ conan install . --profile ../relpath/to/profile # resolved to relative dir $ conan install . --profile profile # resolved to user/.conan/profiles/profile Listing existing profiles in the *profiles* folder can be done like this: From f2507185a699870aa70a00381501d8ea75347086 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Tue, 23 Mar 2021 14:36:18 -0300 Subject: [PATCH 076/681] #2046 Add feature date release (#2048) Signed-off-by: Uilian Ries --- reference/conanfile/attributes.rst | 13 +++++++++---- reference/conanfile/methods.rst | 4 +++- reference/conanfile/other.rst | 4 +++- reference/conanfile/tools/cmake.rst | 3 ++- reference/conanfile/tools/meson.rst | 1 + reference/conanfile/tools/qbs.rst | 1 + reference/generators/pkg_config.rst | 4 +++- reference/tools.rst | 10 ++++++---- 8 files changed, 28 insertions(+), 12 deletions(-) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index d844e4b615f7..0f53fc767cff 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -321,11 +321,11 @@ options ------- Conan provides this attribute to declare traits which will affect only one reference, unlike the settings that are typically the -same for all the recipes in a Conan graph. Options are declared per recipe, this attribute consist on a dictionary where the key is the +same for all the recipes in a Conan graph. Options are declared per recipe, this attribute consist on a dictionary where the key is the option name and the value is the list of different values that the option can take. .. important:: - + All the options with their values are encoded into the package ID, as everything that affects the generated binary. See :ref:`method_configure_config_options` and :ref:`method_package_id` methods for information about removing certain options for some configurations. @@ -349,7 +349,7 @@ options that can take any value. "option4": [True, False, "value"], } -Every option in a recipe needs to be assigned a value from the ones declared in the ``options`` attribute. The +Every option in a recipe needs to be assigned a value from the ones declared in the ``options`` attribute. The consumer can define options using different methods: command line, profile or consumer recipes; **an uninitialized option will get the value** ``None`` **and it will be a valid value if it is contained in the list of valid values**. Invalid values will produce an error. See attribute :ref:`conanfile_default_options` @@ -482,7 +482,7 @@ The ``get_safe()`` method will return ``None`` if that option doesn't exist and **Evaluate options** It is very important to know how the options are evaluated in conditional expressions and how the -comparaison operator works with them: +comparison operator works with them: - Evaluation for the typed value and the string one is the same, so all these inputs would behave the same: @@ -911,6 +911,8 @@ specified in the command line. recipe_folder ------------- +Available since: `1.28.0 `_ + The folder where the recipe *conanfile.py* is stored, either in the local folder or in the cache. This is useful in order to access files that are exported along with the recipe. @@ -1531,6 +1533,7 @@ deprecated This is an **experimental** feature subject to breaking changes in future releases. +Available since: `1.28.0 `_ This attribute declares that the recipe is deprecated, causing a user-friendly warning message to be emitted whenever it is used. For example, the following code: @@ -1577,6 +1580,8 @@ provides This is an **experimental** feature subject to breaking changes in future releases. +Available since: `1.28.0 `_ + This attribute declares that the recipe provides the same functionality as other recipe(s). The attribute is usually needed if two or more libraries implement the same API to prevent link-time and run-time conflicts (ODR violations). One typical situation is forked libraries. diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 53a37e07e593..303fd517f2df 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -447,7 +447,7 @@ To define a relative path to the *conanfile.py*, irrespective of the current wor .. warning:: The ``set_name()`` and ``set_version()`` methods are alternatives to the ``name`` and ``version`` attributes. It is - not advised or supported to define both a ``name`` attribute and a ``set_name()`` method. Likewise, it is + not advised or supported to define both a ``name`` attribute and a ``set_name()`` method. Likewise, it is not advised or supported to define both a ``version`` attribute and a ``set_version()`` method. If you define both, you may experience unexpected behavior. @@ -545,6 +545,8 @@ validate() This is an **experimental** feature subject to breaking changes in future releases. +Available since: `1.32.0 `_ + The ``validate()`` method can be used to mark a binary as "impossible" or invalid for a given configuration. For example, if a given library does not build or work at all in Windows it can be defined as: diff --git a/reference/conanfile/other.rst b/reference/conanfile/other.rst index 8172ba44ec44..de38874f5f60 100644 --- a/reference/conanfile/other.rst +++ b/reference/conanfile/other.rst @@ -95,6 +95,8 @@ Optional parameters: Requiring a Conan version for the recipe ---------------------------------------- +Available since: `1.28.0 `_ + A required Conan version can be declared in the `conanfile.py` using ``required_conan_version`` to throw an error when the Conan version installed does not meet the criteria established by the variable. To add ``required_conan_version`` to a `conanfile.py` just declare it before the recipe @@ -102,7 +104,7 @@ class definition: .. code-block:: python :emphasize-lines: 3 - + from conans import ConanFile required_conan_version = ">=1.27.1" diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 6395c4daa87b..958db8b39cea 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -11,6 +11,8 @@ conan.tools.cmake CMakeDeps --------- +Available since: `1.33.0 `_ + The ``CMakeDeps`` helper will generate one **xxxx-config.cmake** file per dependency, together with other necessary .cmake files like version, or configuration. It can be used like: @@ -312,4 +314,3 @@ conf - ``tools.microsoft:msbuild_verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed to the ``CMake.build()`` command, when a Visual Studio generator (MSBuild build system) is being used for CMake. It is passed as an argument to the underlying build system via the call ``cmake --build . --config Release -- /verbosity:Diagnostic`` - diff --git a/reference/conanfile/tools/meson.rst b/reference/conanfile/tools/meson.rst index 98be9ea6ee83..b0753be27560 100644 --- a/reference/conanfile/tools/meson.rst +++ b/reference/conanfile/tools/meson.rst @@ -10,6 +10,7 @@ MesonToolchain This is an **experimental** feature subject to breaking changes in future releases. +Available since: `1.33.0 `_ The ``MesonToolchain`` can be used in the ``generate()`` method: diff --git a/reference/conanfile/tools/qbs.rst b/reference/conanfile/tools/qbs.rst index 786b00008a0e..fa3e685848bc 100644 --- a/reference/conanfile/tools/qbs.rst +++ b/reference/conanfile/tools/qbs.rst @@ -10,6 +10,7 @@ QbsProfile This is an **experimental** feature subject to breaking changes in future releases. +Available since: `1.33.0 `_ The ``QbsProfile`` can be used in the ``generate()`` method: diff --git a/reference/generators/pkg_config.rst b/reference/generators/pkg_config.rst index 080767e41e87..ce34be5cc6c7 100644 --- a/reference/generators/pkg_config.rst +++ b/reference/generators/pkg_config.rst @@ -4,13 +4,15 @@ pkg_config ========== -Generates pkg-config files named *.pc* (where ``.pc* (where ```_ + If a recipe uses :ref:`components`, the files generated will be *.pc* with their corresponding flags and require relations. diff --git a/reference/tools.rst b/reference/tools.rst index 048aac1c9a7b..4337d194fb8c 100644 --- a/reference/tools.rst +++ b/reference/tools.rst @@ -855,7 +855,7 @@ different sources: use settings in that profile (read more about :ref:`build_requires_context`). * otherwise, the values for the ``build`` context will come from (in this order of precedence): ``self_os`` and ``self_arch`` if they are given to the function, the values for ``os_build`` - and ``arch_build`` from ``conanfile.settings`` or auto-detected. + and ``arch_build`` from ``conanfile.settings`` or auto-detected. This tool can be used to run special actions depending on its return value: @@ -1189,11 +1189,13 @@ Parameters: tools.rename() ---------------------------- +Available since: `1.29.0 `_ + .. code-block:: python def rename(src, dst) -Utility functions to rename a file or folder *src* to *dst* with retrying. ``os.rename()`` frequently raises "Access is denied" exception on windows. This function renames file or folder using robocopy to avoid the exception on windows. +Utility functions to rename a file or folder *src* to *dst* with retrying. ``os.rename()`` frequently raises "Access is denied" exception on windows. This function renames file or folder using robocopy to avoid the exception on windows. .. code-block:: python @@ -1595,7 +1597,7 @@ tools.apple_sdk_name() def apple_sdk_name(settings) Returns proper SDK name suitable for OS and architecture you are building for (considering simulators). -If ``self.settings.os.sdk`` setting is defined, it is used, otherwise the function tries to auto-detect based on +If ``self.settings.os.sdk`` setting is defined, it is used, otherwise the function tries to auto-detect based on ``self.settings.os`` and ``self.settings.arch``. Parameters: @@ -1803,7 +1805,7 @@ tools.cppstd_flag(): def cppstd_flag(settings) -Returns the corresponding C++ standard flag based on the settings. For instance, it may return ``-std=c++17`` +Returns the corresponding C++ standard flag based on the settings. For instance, it may return ``-std=c++17`` for ``compiler.cppstd=17``, and so on. Parameters: From d1efac0c645c72e6b82e453d3c34591f6f7e6d4b Mon Sep 17 00:00:00 2001 From: SSE4 Date: Tue, 30 Mar 2021 17:42:08 +0700 Subject: [PATCH 077/681] - document custom template definitions (#2051) Signed-off-by: SSE4 --- extending/template_system/command_new.rst | 35 +++++++++++++++++++++++ reference/commands/creator/new.rst | 4 ++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/extending/template_system/command_new.rst b/extending/template_system/command_new.rst index fe32bf5904f0..b9bd40205c92 100644 --- a/extending/template_system/command_new.rst +++ b/extending/template_system/command_new.rst @@ -100,3 +100,38 @@ This is a very simple example for a header only library: def package_id(self): self.info.header_only() + +Custom definitions +------------------ + +Sometimes it's needed to provide additional variables for the custom templates. For instance, if +it's desired to have ``description`` and ``homepage`` to be templated as well: + + + .. code-block:: text + + # Recipe autogenerated with Conan {{ conan_version }} using `conan new --template` command + + from conans import ConanFile + + + class {{package_name}}Conan(ConanFile): + name = "{{ name }}" + version = "{{ version }}" + description = "{{ description }}" + homepage = "{{ homepage }}" + settings = "os", "arch", "compiler", "build_type" + exports_sources = "include/*" + + def package(self): + self.copy("*.hpp", dst="include") + self.copy("LICENSE.txt", dst="licenses") + + def package_id(self): + self.info.header_only() + +now it's easy to overwrite these values from the command line: + + .. code-block:: bash + + $ conan new mypackage/version --template=header_only -d homepage=https://www.example.com -d description="the best package" diff --git a/reference/commands/creator/new.rst b/reference/commands/creator/new.rst index e8ba26bfde41..abddd1f18576 100644 --- a/reference/commands/creator/new.rst +++ b/reference/commands/creator/new.rst @@ -58,6 +58,9 @@ Creates a new package recipe template with a 'conanfile.py' and optionally, excluded -ciu CI_UPLOAD_URL, --ci-upload-url CI_UPLOAD_URL Define URL of the repository to upload + -d DEFINE, --define DEFINE + Define additional variables to be processed within + template **Examples**: @@ -93,5 +96,4 @@ Creates a new package recipe template with a 'conanfile.py' and optionally, $ conan new mypackage/1.0 --template=myconanfile.py # Single template file $ conan new mypackage/1.0 --template=header_only # Template directory - Refer to the section :ref:`template_command_new` for more information about these templates. From c31da0b5828a0e2245506b5e14074fe573cd2672 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 30 Mar 2021 13:11:45 +0200 Subject: [PATCH 078/681] Docs for lockfiles features from 1.35 (#2053) * modify command reference * update lock reference * wip * document clean-modified for lockfiles * update bundle docs * document conan lock install --- reference/commands/misc/lock.rst | 110 +++++++++++++++++++++++++- versioning/lockfiles/bundle.rst | 6 +- versioning/lockfiles/ci.rst | 14 ++++ versioning/lockfiles/introduction.rst | 11 ++- 4 files changed, 133 insertions(+), 8 deletions(-) diff --git a/reference/commands/misc/lock.rst b/reference/commands/misc/lock.rst index 28daba64d6d7..44456ed7271d 100644 --- a/reference/commands/misc/lock.rst +++ b/reference/commands/misc/lock.rst @@ -5,14 +5,16 @@ conan lock .. code-block:: bash - $ conan lock [-h] {update,build-order,clean-modified,create} ... + $ conan lock [-h] + {update,build-order,clean-modified,install,create,bundle} + ... Generates and manipulates lock files. .. code-block:: text positional arguments: - {update,build-order,clean-modified,create} + {update,build-order,clean-modified,install,create,bundle} sub-command help update Complete missing information in the first lockfile with information defined in the second lockfile. Both @@ -22,7 +24,9 @@ Generates and manipulates lock files. first one build-order Returns build-order clean-modified Clean modified flags + install Install a lockfile create Create a lockfile from a conanfile or a reference + bundle Manages lockfile bundles optional arguments: -h, --help show this help message and exit @@ -144,4 +148,104 @@ conan lock clean-modified lockfile Path to the lockfile optional arguments: - -h, --help show this help message and exit \ No newline at end of file + -h, --help show this help message and exit + +conan lock install +------------------ + +.. code-block:: bash + + $ conan lock install [-h] [--recipes] [-g GENERATOR] lockfile + +.. code-block:: text + + positional arguments: + lockfile Path to the lockfile + + optional arguments: + -h, --help show this help message and exit + --recipes Install only recipes, not binaries + -g GENERATOR, --generator GENERATOR + Generators to use + +conan lock bundle +================= + +.. code-block:: bash + + $ conan lock bundle [-h] {create,build-order,update,clean-modified} ... + +.. code-block:: text + + positional arguments: + {create,build-order,update,clean-modified} + sub-command help + create Create lockfile bundle + build-order Returns build-order + update Complete missing information in the first lockfile with information defined in the second lockfile. + Both lockfiles must represent the same graph, and have the same topology with the same identifiers, + i.e. the second lockfile must be an evolution based on the first one + clean-modified Clean modified flag + +conan lock bundle create +------------------------ + +.. code-block:: bash + + $ conan lock bundle create [-h] [--bundle-out BUNDLE_OUT] lockfiles [lockfiles ...] + +.. code-block:: text + + positional arguments: + lockfiles Path to lockfiles + + optional arguments: + -h, --help show this help message and exit + --bundle-out BUNDLE_OUT + Filename of the created bundle + +conan lock bundle build-order +----------------------------- + +.. code-block:: bash + + $ conan lock bundle build-order [-h] [--json JSON] bundle + +.. code-block:: text + + positional arguments: + bundle Path to lockfile bundle + + optional arguments: + -h, --help show this help message and exit + --json JSON generate output file in json format + +conan lock bundle update +------------------------ + +.. code-block:: bash + + $ conan lock bundle update [-h] bundle + +.. code-block:: text + + positional arguments: + bundle Path to lockfile bundle + + optional arguments: + -h, --help show this help message and exit + +conan lock bundle clean-modified +-------------------------------- + +.. code-block:: bash + + $ conan lock bundle clean-modified [-h] bundle + +.. code-block:: text + + positional arguments: + bundle Path to lockfile bundle + + optional arguments: + -h, --help show this help message and exit diff --git a/versioning/lockfiles/bundle.rst b/versioning/lockfiles/bundle.rst index ac98b496b10f..eef59cbe46a7 100644 --- a/versioning/lockfiles/bundle.rst +++ b/versioning/lockfiles/bundle.rst @@ -191,5 +191,7 @@ updated package revision and status. The ``conan lock bundle update`` does this - Scan all connected lockfiles for every ``ref`` recipe reference and ``package_id``, and collect those that have been modified. - Propagate the modified information to all the other connected lockfiles. -After ``conan lock bundle update``, all packages sharing the same reference and ``package_id`` should have the same status (marked -"modified" and same package revision) +After ``conan lock bundle update``, all packages sharing the same reference and ``package_id`` should +have the same status (marked "modified" and same package revision). The "modified" state for the +lockfile bundles can be cleaned using the command ``conan lock bundle clean-modified`` that will +clean that flag from both the *.bundle* file and the individual *.lock* files. diff --git a/versioning/lockfiles/ci.rst b/versioning/lockfiles/ci.rst index 66ee33cb39f8..ca03de01a8e2 100644 --- a/versioning/lockfiles/ci.rst +++ b/versioning/lockfiles/ci.rst @@ -259,3 +259,17 @@ product packages without problems. When the Pull Request is merged there might b than the source used in this CI job. Then it is necessary to fire again a new job that will build these packages. - If the merge is a clean fast-forward, then the packages that were built in this job would be valid, and could be copied from the repository ``conan-build`` to the ``conan-develop``. + +After the ``app1`` lockfile is created it could be possible to install all the binaries referenced in +that lockfile using the :command:`conan lock install`: + +.. code:: bash + + $ conan lock install app1_release_updated.lock -g deploy + +It is also possible to use this command for just installing the recipes but not the binaries adding +the ``--recipes`` argument: + +.. code:: bash + + $ conan lock install app1_release_updated.lock --recipes diff --git a/versioning/lockfiles/introduction.rst b/versioning/lockfiles/introduction.rst index b28de62a648b..4018143171b2 100644 --- a/versioning/lockfiles/introduction.rst +++ b/versioning/lockfiles/introduction.rst @@ -213,9 +213,14 @@ And if we inspect the new *locks/pkgb.lock* file: ... } -It can be appreciated in *locks/pkgb.lock* that now ``pkgb/0.1@user/testing`` is fully locked, as a package (not a local *conanfile.py*), -and contains a ``package_id``. So if we try to use this new file for creating the package again, it will error, -as a package that is fully locked cannot be rebuilt: +Note that some fields of the lockfile are now completed, as the modified flag, that indicates that +``pkgb`` was built in the conan create command. That information can be useful in the CI environment +to know which packages were built by different jobs. Those modified flags can be reset using the +:command:`conan lock clean-modified`. +Also, it can be appreciated in *locks/pkgb.lock* that now ``pkgb/0.1@user/testing`` is fully locked, as a +package (not a local *conanfile.py*), and contains a ``package_id``. So if we try to use this new +file for creating the package again, it will error, as a package that is fully locked cannot be +rebuilt: .. code-block:: bash From ed7460000f9da243a8368d3e957f5f3442943587 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 30 Mar 2021 13:37:49 +0200 Subject: [PATCH 079/681] Docs for automatically handle CONAN_RUN_TESTS environment variable (#2056) * wip * wip * update bh docs --- howtos/header_only.rst | 11 +++-------- reference/build_helpers/cmake.rst | 4 +++- reference/build_helpers/meson.rst | 3 ++- reference/env_vars.rst | 5 ++--- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/howtos/header_only.rst b/howtos/header_only.rst index bf515a9d943f..d61eb6dcecb7 100644 --- a/howtos/header_only.rst +++ b/howtos/header_only.rst @@ -81,14 +81,9 @@ If you want to run the library unit test while packaging, you would need this re If you are :ref:`cross-building ` your **library** or **app** you'll probably need to skip the **unit tests** because your target binary cannot be executed in current building host. - To do it you can use :ref:`tools_get_env` in combination with - :ref:`env_vars_conan_run_tests` environment variable, defined as **False** - in profile for cross-building and replace ``cmake.test()`` with: - - .. code-block:: python - - if tools.get_env("CONAN_RUN_TESTS", True): - cmake.test() + To do it you can use :ref:`env_vars_conan_run_tests` environment variable, defined as **False** + in profile for cross-building in the call to ``cmake.test()`` this variable will be evaluated and + the tests will not run. Which will use a ``CMakeLists.txt`` file in the root folder: diff --git a/reference/build_helpers/cmake.rst b/reference/build_helpers/cmake.rst index 01c6bcb5a75b..de82e0ba824a 100644 --- a/reference/build_helpers/cmake.rst +++ b/reference/build_helpers/cmake.rst @@ -335,7 +335,9 @@ test() def test(args=None, build_dir=None, target=None, output_on_failure=False) -Build `CMake` test target (could be RUN_TESTS in multi-config projects or ``test`` in single-config projects), which usually means building and running unit tests +Build `CMake` test target (could be RUN_TESTS in multi-config projects or ``test`` in single-config +projects), which usually means building and running unit tests. When this function is called +:ref:`env_vars_conan_run_tests` will be evaluated to check if tests should run. Parameters: - **args** (Optional, Defaulted to ``None``): A list of additional arguments to be passed to the ``cmake`` command. Each argument will be escaped according to the current shell. No extra arguments will be added if ``args=None``. diff --git a/reference/build_helpers/meson.rst b/reference/build_helpers/meson.rst index 2007c0e3469a..343498c1f273 100644 --- a/reference/build_helpers/meson.rst +++ b/reference/build_helpers/meson.rst @@ -89,7 +89,8 @@ test() def test(args=None, build_dir=None, target=None) -Executes ninja test target, which usually means building and running unit tests. +Executes ninja test target, which usually means building and running unit tests. When this function +is called :ref:`env_vars_conan_run_tests` will be evaluated to check if tests should run. Parameters: - **args** (Optional, Defaulted to ``None``): A list of additional arguments to be passed to the ``ninja`` command. Each argument will be escaped diff --git a/reference/env_vars.rst b/reference/env_vars.rst index 0e0d094b26de..71de2bb63d8d 100644 --- a/reference/env_vars.rst +++ b/reference/env_vars.rst @@ -477,7 +477,7 @@ or declared in command line when invoking :command:`conan install` to reduce the See how to retrieve the value with :ref:`tools.get_env() ` and check a use case with :ref:`a header only with unit tests recipe ` while cross building. -See example of build method in ``conanfile.py`` to enable/disable running tests with CMake: +This variable is evaluated inside the build helper call to ``test()`` and will not run the tests if set to ``False``. .. code-block:: python @@ -491,8 +491,7 @@ See example of build method in ``conanfile.py`` to enable/disable running tests cmake = CMake(self) cmake.configure() cmake.build() - if tools.get_env("CONAN_RUN_TESTS", True): - cmake.test() + cmake.test() .. _env_vars_conan_skip_vs_project_upgrade: From fe107d8306fa33c1c1de8ef7dad916eaa5e37916 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 30 Mar 2021 13:58:44 +0200 Subject: [PATCH 080/681] Add docs for CMAKE_SH and data in cmakedeps (#2055) * Add docs for CMAKE_SH and data in cmakedeps * remove note box --- reference/conanfile/tools/cmake.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 958db8b39cea..6e073a28a136 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -13,8 +13,8 @@ CMakeDeps Available since: `1.33.0 `_ -The ``CMakeDeps`` helper will generate one **xxxx-config.cmake** file per dependency, together with other necessary .cmake files -like version, or configuration. It can be used like: +The ``CMakeDeps`` helper will generate one **xxxx-config.cmake** file per dependency, together with other necessary *.cmake* files +like version, flags and directory data or configuration. It can be used like: .. code-block:: python @@ -231,6 +231,9 @@ when a package is being built directly by Conan (create, install) cmake.configure() cmake.build() +**Note:** This helper includes the additional flag `-DCMAKE_SH="CMAKE_SH-NOTFOUND"` when using the `MinGW Makefiles` CMake's +generator, to avoid the error of `sh` being in the PATH (CMake version < 3.17.0). + It supports the following methods: constructor From 71022d664f0d781049d4a26ffdba57e970573135 Mon Sep 17 00:00:00 2001 From: Jerry Wiltse Date: Tue, 30 Mar 2021 09:43:15 -0400 Subject: [PATCH 081/681] Update lockfile bundle docs for 1.34.1 (#2040) * Update lockfile bundle docs for 1.34.1 * Remove erroneous colon Co-authored-by: Carlos Zoido --- versioning/lockfiles/bundle.rst | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/versioning/lockfiles/bundle.rst b/versioning/lockfiles/bundle.rst index ac98b496b10f..6f64630d7170 100644 --- a/versioning/lockfiles/bundle.rst +++ b/versioning/lockfiles/bundle.rst @@ -61,8 +61,8 @@ Inspecting the resulting lockfile bundle file, we can see it is a json file with "lock_bundle": { "app1/1.1@#584778f98ba1d0eb7c80a5ae1fe12fe2": { - "package_id": { - "3bcd6800847f779e0883ee91b411aad9ddd8e83c": { + "packages": [{ + "package_id": "3bcd6800847f779e0883ee91b411aad9ddd8e83c" , "lockfiles": { "app1_windows.lock": [ "1" @@ -70,8 +70,8 @@ Inspecting the resulting lockfile bundle file, we can see it is a json file with }, "prev": null, "modified": null - }, - "60fbb0a22359b4888f7ecad69bcdfcd6e70e2784": { + }, { + "package_id": "60fbb0a22359b4888f7ecad69bcdfcd6e70e2784", "lockfiles": { "app1_linux.lock": [ "1" @@ -80,11 +80,12 @@ Inspecting the resulting lockfile bundle file, we can see it is a json file with "prev": null, "modified": null } - }, + ], "requires": [ "pkgb/0.1@#cd8f22d6f264f65398d8c534046e8e20" ] - }, + } + } The bundle groups items per "recipe reference", included the recipe revision, like ``app1/1.1@#584778f98ba1d0eb7c80a5ae1fe12fe2``. For each one, it will list all different binaries, identified by their ``package_id`` that are involved in the different @@ -104,8 +105,8 @@ The interesting part is in the ``pkga/0.1`` information in the bundle: .. code:: json "pkga/0.1@#f096d7d54098b7ad7012f9435d9c33f3": { - "package_id": { - "3475bd55b91ae904ac96fde0f106a136ab951a5e": { + "packages": [{ + "package_id": "3475bd55b91ae904ac96fde0f106a136ab951a5e", "lockfiles": { "app1_windows.lock": [ "3" @@ -116,7 +117,10 @@ The interesting part is in the ``pkga/0.1`` information in the bundle: }, "prev": null, "modified": null - }, + } + ] + } + Now we can see that for one ``package_id`` there are actually 2 different lockfiles that require it. Both ``app1`` and ``app2`` depend in this case on ``pkga/0.1``. From 50010a332d1f61dda24d4784cf6359685647044d Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 30 Mar 2021 16:25:07 +0200 Subject: [PATCH 082/681] Update lockfile bundle docs for 1.34.1 (#2040) (#2058) * Update lockfile bundle docs for 1.34.1 * Remove erroneous colon Co-authored-by: Carlos Zoido Co-authored-by: Jerry Wiltse --- versioning/lockfiles/bundle.rst | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/versioning/lockfiles/bundle.rst b/versioning/lockfiles/bundle.rst index eef59cbe46a7..c6382fb88091 100644 --- a/versioning/lockfiles/bundle.rst +++ b/versioning/lockfiles/bundle.rst @@ -61,8 +61,8 @@ Inspecting the resulting lockfile bundle file, we can see it is a json file with "lock_bundle": { "app1/1.1@#584778f98ba1d0eb7c80a5ae1fe12fe2": { - "package_id": { - "3bcd6800847f779e0883ee91b411aad9ddd8e83c": { + "packages": [{ + "package_id": "3bcd6800847f779e0883ee91b411aad9ddd8e83c" , "lockfiles": { "app1_windows.lock": [ "1" @@ -70,8 +70,8 @@ Inspecting the resulting lockfile bundle file, we can see it is a json file with }, "prev": null, "modified": null - }, - "60fbb0a22359b4888f7ecad69bcdfcd6e70e2784": { + }, { + "package_id": "60fbb0a22359b4888f7ecad69bcdfcd6e70e2784", "lockfiles": { "app1_linux.lock": [ "1" @@ -80,11 +80,12 @@ Inspecting the resulting lockfile bundle file, we can see it is a json file with "prev": null, "modified": null } - }, + ], "requires": [ "pkgb/0.1@#cd8f22d6f264f65398d8c534046e8e20" ] - }, + } + } The bundle groups items per "recipe reference", included the recipe revision, like ``app1/1.1@#584778f98ba1d0eb7c80a5ae1fe12fe2``. For each one, it will list all different binaries, identified by their ``package_id`` that are involved in the different @@ -104,8 +105,8 @@ The interesting part is in the ``pkga/0.1`` information in the bundle: .. code:: json "pkga/0.1@#f096d7d54098b7ad7012f9435d9c33f3": { - "package_id": { - "3475bd55b91ae904ac96fde0f106a136ab951a5e": { + "packages": [{ + "package_id": "3475bd55b91ae904ac96fde0f106a136ab951a5e", "lockfiles": { "app1_windows.lock": [ "3" @@ -116,7 +117,10 @@ The interesting part is in the ``pkga/0.1`` information in the bundle: }, "prev": null, "modified": null - }, + } + ] + } + Now we can see that for one ``package_id`` there are actually 2 different lockfiles that require it. Both ``app1`` and ``app2`` depend in this case on ``pkga/0.1``. From 6d78bfe6425ed61c7628411abd86daa2a7bbf456 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 30 Mar 2021 17:07:19 +0200 Subject: [PATCH 083/681] update cconf (#2059) --- reference/conanfile/tools/cmake.rst | 2 +- reference/conanfile/tools/microsoft.rst | 2 +- reference/config_files/global_conf.rst | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 6e073a28a136..8585a3957420 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -314,6 +314,6 @@ Equivalent to running :command:`cmake --build . --target=RUN_TESTS`. conf ++++ -- ``tools.microsoft:msbuild_verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed +- ``tools.microsoft.msbuild:verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed to the ``CMake.build()`` command, when a Visual Studio generator (MSBuild build system) is being used for CMake. It is passed as an argument to the underlying build system via the call ``cmake --build . --config Release -- /verbosity:Diagnostic`` diff --git a/reference/conanfile/tools/microsoft.rst b/reference/conanfile/tools/microsoft.rst index 163af330f23c..04dce9956d8d 100644 --- a/reference/conanfile/tools/microsoft.rst +++ b/reference/conanfile/tools/microsoft.rst @@ -210,5 +210,5 @@ Where: conf ++++ -- ``tools.microsoft:msbuild_verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed +- ``tools.microsoft.msbuild:verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed to the ``MSBuild.build()`` call as ``msbuild .... /verbosity:XXX`` diff --git a/reference/config_files/global_conf.rst b/reference/config_files/global_conf.rst index ba26cc4f34dc..9773bb090ca0 100644 --- a/reference/config_files/global_conf.rst +++ b/reference/config_files/global_conf.rst @@ -30,11 +30,11 @@ have priority over globally defined ones in *global.conf*, and can be defined as ... [conf] - tools.microsoft:msbuild_verbosity=Diagnostic + tools.microsoft.msbuild:verbosity=Diagnostic Existing configurations: -- ``tools.microsoft:msbuild_verbosity`` allows defining a value from ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` for build using the +- ``tools.microsoft.msbuild:verbosity`` allows defining a value from ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` for build using the MSBuild system, it could be with the ``tools.microsoft.MSBuild`` or with the ``tools.cmake.CMake`` helpers. From 9b7a9cf586aedde0c3e2455769964c63a0b9c1b8 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 30 Mar 2021 17:18:12 +0200 Subject: [PATCH 084/681] add confs (#2061) --- reference/conanfile/tools/cmake.rst | 6 ++++++ reference/conanfile/tools/gnu.rst | 5 +++++ reference/conanfile/tools/meson.rst | 6 ++++++ reference/config_files/global_conf.rst | 21 ++++++++++++++++++--- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 8585a3957420..ad3420b2fd52 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -317,3 +317,9 @@ conf - ``tools.microsoft.msbuild:verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed to the ``CMake.build()`` command, when a Visual Studio generator (MSBuild build system) is being used for CMake. It is passed as an argument to the underlying build system via the call ``cmake --build . --config Release -- /verbosity:Diagnostic`` + +- ``tools.ninja:jobs`` argument for the ``--jobs`` parameter when running Ninja generator. (overrides + the general ``tools.build:processes``). + +- ``tools.microsoft.msbuild:max_cpu_count`` argument for the ``/m`` (``/maxCpuCount``) when running + ``MSBuild`` (overrides the general ``tools.build:processes``). diff --git a/reference/conanfile/tools/gnu.rst b/reference/conanfile/tools/gnu.rst index 213d17d53bd5..60baf16956c8 100644 --- a/reference/conanfile/tools/gnu.rst +++ b/reference/conanfile/tools/gnu.rst @@ -156,6 +156,11 @@ consistent conventions and strategy, however they are currently completely independent from each other. Thus, you can use this toolchain without using the ``MakeGenerator``. +conf +++++ + +- ``tools.gnu.make:jobs``: argument for the ``--jobs`` parameter when running ``make`` + (overrides the general ``tools.build:processes``). Using the toolchain in developer flow +++++++++++++++++++++++++++++++++++++ diff --git a/reference/conanfile/tools/meson.rst b/reference/conanfile/tools/meson.rst index b0753be27560..7879b48991d0 100644 --- a/reference/conanfile/tools/meson.rst +++ b/reference/conanfile/tools/meson.rst @@ -187,3 +187,9 @@ test() def test(self): Runs project's tests. Equivalent to running :command:`meson test -v -C .` in the build folder.. + +conf +++++ + +- ``tools.ninja:jobs`` argument for the ``--jobs`` parameter when running Ninja. (overrides + the general ``tools.build:processes``). diff --git a/reference/config_files/global_conf.rst b/reference/config_files/global_conf.rst index 9773bb090ca0..d2b9a75ed5f8 100644 --- a/reference/config_files/global_conf.rst +++ b/reference/config_files/global_conf.rst @@ -31,10 +31,25 @@ have priority over globally defined ones in *global.conf*, and can be defined as [conf] tools.microsoft.msbuild:verbosity=Diagnostic - + tools.microsoft.msbuild:max_cpu_count=20 + tools.build:processes=10 + tools.ninja:jobs=30 + tools.gnu.make:jobs=40 Existing configurations: -- ``tools.microsoft.msbuild:verbosity`` allows defining a value from ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` for build using the - MSBuild system, it could be with the ``tools.microsoft.MSBuild`` or with the ``tools.cmake.CMake`` helpers. +- ``tools.microsoft.msbuild:verbosity`` allows defining a value from ``"Quiet", "Minimal", "Normal", + "Detailed", "Diagnostic"`` for build using the + MSBuild system, it could be with the ``tools.microsoft.MSBuild`` or with the ``tools.cmake.CMake`` + helpers. + +- ``tools.microsoft.msbuild:max_cpu_count`` argument for the ``/m`` (``/maxCpuCount``) when running + ``MSBuild`` standalone or via CMake (overrides the general ``tools.build:processes``). + +- ``tools.build:processes``: number of processes to use for every build-helper. + +- ``tools.ninja:jobs`` argument for the ``--jobs`` parameter when running Ninja generator via CMake + or Meson. (overrides the general ``tools.build:processes``). +- ``tools.gnu.make:jobs``: argument for the ``--jobs`` parameter when running ``make`` + (overrides the general ``tools.build:processes``). From efef6207892eefaabb31fc5691a3efb360999cd9 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 30 Mar 2021 17:29:42 +0200 Subject: [PATCH 085/681] docs for new msbuilddeps transitivity (#2052) * docs for new msbuilddeps transitivity * fix ci Co-authored-by: czoido --- reference/conanfile/tools/microsoft.rst | 27 ++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/reference/conanfile/tools/microsoft.rst b/reference/conanfile/tools/microsoft.rst index 04dce9956d8d..f00322647a6f 100644 --- a/reference/conanfile/tools/microsoft.rst +++ b/reference/conanfile/tools/microsoft.rst @@ -64,13 +64,15 @@ above: This is a multi-configuration generator, and will generate different files for the different Debug/Release configuration. The above commands the following files will be generated: -- *conan_zlib_release_x64.props*: Properties file for the ``zlib`` dependency, Release config -- *conan_zlib_debug_x64.props*: Properties file for the ``zlib`` dependency, Debug config +- *conan_zlib_vars_release_x64.props*: ``Conanzlibxxxx`` variables definitions for the ``zlib`` dependency, Release config, like ``ConanzlibIncludeDirs``, ``ConanzlibLibs``, etc. +- *conan_zlib_vars_debug_x64.props*: Same ``Conanzlib``variables for ``zlib`` dependency, Debug config +- *conan_zlib_release_x64.props*: Activation of ``Conanzlibxxxx`` variables in the current build as standard C/C++ build configuration, Release config. This file contains also the transitive dependencies definitions. +- *conan_zlib_debug_x64.props*: Same activation of ``Conanzlibxxxx`` variables, Debug config, also inclusion of transitive dependencies. - *conan_zlib.props*: Properties file for ``zlib``. It conditionally includes, depending on the configuration, - one of the above Release/Debug properties files. -- Same 3 files will be generated for every dependency in the graph, in this case ``conan_bzip.props`` too, which + one of the two immediately above Release/Debug properties files. +- Same 5 files will be generated for every dependency in the graph, in this case ``conan_bzip.props`` too, which will conditionally include the Release/Debug bzip properties files. -- *conan_deps.props*: Properties files including all direct dependencies, in this case, it includes ``conan_zlib.props`` +- *conandeps.props*: Properties files including all direct dependencies, in this case, it includes ``conan_zlib.props`` and ``conan_bzip2.props`` You will be adding the *conan_deps.props* to your solution project files if you want to depend on all the declared @@ -109,6 +111,21 @@ This will manage to generate new properties files for this custom configuration, in the IDE allows to be switching dependencies configuration like Debug/Release, it could be also switching dependencies from static to shared libraries. +Included dependencies ++++++++++++++++++++++ + +``MSBuildDeps`` uses the new experimental ``self.dependencies`` access to dependencies. The following +dependencies will be translated to properties files: + +- All direct dependencies, that is, the ones declared by the current ``conanfile``, that lives in the + host context: all regular ``requires``, plus the ``build_requires`` that are in the host context, + for example test frameworks as ``gtest`` or ``catch``. +- All transitive ``requires`` of those direct dependencies (all in the host context) + +Then, the ``build_requires`` of build context (like ``cmake`` packages as build_requires), plus the +transitive ``build_requires`` (irrespective of the context) are not translated to properties files, +as they shouldn't be necessary for the build. + MSBuildToolchain ---------------- From 6fd3eda21bf9b78a659b91bd52d1a212da5891a6 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 30 Mar 2021 18:27:08 +0200 Subject: [PATCH 086/681] add docs for patches (#2062) --- reference/conanfile/tools.rst | 1 + reference/conanfile/tools/files.rst | 69 +++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 reference/conanfile/tools/files.rst diff --git a/reference/conanfile/tools.rst b/reference/conanfile/tools.rst index fd6afef55d2a..5ef1fcc21468 100644 --- a/reference/conanfile/tools.rst +++ b/reference/conanfile/tools.rst @@ -40,3 +40,4 @@ Contents: tools/meson tools/microsoft tools/qbs + tools/files diff --git a/reference/conanfile/tools/files.rst b/reference/conanfile/tools/files.rst new file mode 100644 index 000000000000..8c493c4c55fd --- /dev/null +++ b/reference/conanfile/tools/files.rst @@ -0,0 +1,69 @@ +.. _conan_tools_files: + +conan.tools.files +================= + +.. _conan_tools_files_patch: + +conan.tools.files.patch() +------------------------- + +.. code-block:: python + + def patch(conanfile, base_path=None, patch_file=None, patch_string=None, + strip=0, fuzz=False, **kwargs): + +Applies a diff from file (*patch_file*) or string (*patch_string*) in *base_path* directory. If +*base_path* is not passed it is applied in the current directory. + +Parameters: + - **base_path**: Base path where the patch should be applied. + - **patch_file**: Patch file that should be applied. + - **patch_string**: Patch string that should be applied. + - **strip**: Number of folders to be stripped from the path. + - **output**: Stream object. + - **fuzz**: Should accept fuzzy patches. + - **kwargs**: Extra parameters that can be added and will contribute to output information. + +.. _conan_tools_files_apply_conandata_patches: + +conan.tools.files.apply_conandata_patches() +------------------------------------------- + +.. code-block:: python + + def apply_conandata_patches(conanfile): + +Applies patches stored in ``conanfile.conan_data`` (read from ``conandata.yml`` file). It will apply +all the patches under ``patches`` entry that matches the given ``conanfile.version``. If versions are +not defined in ``conandata.yml`` it will apply all the patches directly under ``patches`` keyword. + +Example of ``conandata.yml`` without versions defined: + +.. code-block:: yaml + + patches: + - patch_file: "patches/0001-buildflatbuffers-cmake.patch" + base_path: "source_subfolder" + - patch_file: "patches/0002-implicit-copy-constructor.patch" + base_path: "source_subfolder" + patch_type: backport + patch_source: https://github.com/google/flatbuffers/pull/5650 + patch_description: Needed to build with modern clang compilers. + +Example of ``conandata.yml`` with different patches for different versions: + +.. code-block:: yaml + + patches: + "1.11.0": + - patch_file: "patches/0001-buildflatbuffers-cmake.patch" + base_path: "source_subfolder" + - patch_file: "patches/0002-implicit-copy-constructor.patch" + base_path: "source_subfolder" + patch_type: backport + patch_source: https://github.com/google/flatbuffers/pull/5650 + patch_description: Needed to build with modern clang compilers. + "1.12.0": + - patch_file: "patches/0001-buildflatbuffers-cmake.patch" + base_path: "source_subfolder" From 0a73d5b5c1021b1735580a26ad7281f7a7ff0322 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 30 Mar 2021 18:30:28 +0200 Subject: [PATCH 087/681] autotools docs (#2057) * autotools docs * add marker Co-authored-by: czoido --- reference/conanfile/tools/gnu.rst | 197 +----------------- reference/conanfile/tools/gnu/autotools.rst | 30 +++ .../conanfile/tools/gnu/autotoolsdeps.rst | 52 +++++ .../conanfile/tools/gnu/autotoolsgen.rst | 58 ++++++ .../tools/gnu/autotoolstoolchain.rst | 50 +++++ .../conanfile/tools/gnu/maketoolchain.rst | 188 +++++++++++++++++ 6 files changed, 385 insertions(+), 190 deletions(-) create mode 100644 reference/conanfile/tools/gnu/autotools.rst create mode 100644 reference/conanfile/tools/gnu/autotoolsdeps.rst create mode 100644 reference/conanfile/tools/gnu/autotoolsgen.rst create mode 100644 reference/conanfile/tools/gnu/autotoolstoolchain.rst create mode 100644 reference/conanfile/tools/gnu/maketoolchain.rst diff --git a/reference/conanfile/tools/gnu.rst b/reference/conanfile/tools/gnu.rst index 60baf16956c8..5a89a07e94d6 100644 --- a/reference/conanfile/tools/gnu.rst +++ b/reference/conanfile/tools/gnu.rst @@ -1,195 +1,12 @@ -.. _make_toolchain: - conan.tools.gnu =============== -.. warning:: - - This is an **experimental** feature subject to breaking changes in future releases. - -MakeToolchain -------------- - -The `MakeToolchain` can be used in the ``generate()`` method of ``conanfile.py``: - -.. code:: python - - from conans import ConanFile - from conan.tools.gnu import MakeToolchain - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} - - def generate(self): - tc = MakeToolchain(self) - tc.generate() - - -The ``MakeToolchain`` will generate the following file during ``conan install`` -command (or before calling the ``build()`` method when the package is being -built in the cache): ``conan_toolchain.mak``. To use the variables generated by -Conan, include this file in your existing ``Makefile`` such as: - -.. code:: makefile - - include conan_toolchain.mak - -Or to make it optional: - - -.. code:: makefile - - -include conan_toolchain.mak - - -``conan_toolchain.mak`` will contain the definitions of all the Make variables -related to the Conan options and settings for the current package, platform, -etc. This includes but is not limited to the following: - -* Detection of target type: "executable", "shared" or "static" - - * Based on existance/value of a option named ``shared`` - - * Based on result, defines ``-shared`` linker flag - -* Detection of ``fPIC`` - - * Based on existance/value of a option named ``fPIC`` - - * Combines with detection of target type above - - * Sets ``-fPIC`` flag for compiler - - * Sets ``-fPIC`` flag for linker when building shared library - - * Sets ``-pie`` flag for linker when building executable - -* Detection of ``build_type`` from Conan settings - - * Sets -DNDEBUG flag for ``Release`` builds - -* Definition of the C++ standard as necessary - -* Definition of the standard library used for C++ - -* Definition of rpaths based on libpaths in conan cache - -**NOTE**: Simply including this file will have no effect on your ``Makefile`` -build. - -All variables in this file are prefixed with ``CONAN_TC_`` and so existing -makefiles will robably makes no references to variables with these names. Users -can modify their makefiles to make use of these variables by name. That is -certainly supported, however such a process tighly couples Makefiles to Conan -which can be undesirable, so Conan provides an alternative. There is list of -well-known "standard"/"conventional" variables used within **GnuMake**, -**Autotools**, and other related tools: - -`Gnu Make Well-Known Variables `_ - -The relevant content from the GnuMake manual is provided here for convenience: - - CFLAGS - Extra flags to give to the C compiler. - - CXXFLAGS - Extra flags to give to the C++ compiler. - - CPPFLAGS - Extra flags to give to the C preprocessor and programs that use it (the C and Fortran compilers). - - LDFLAGS Extra flags to give to compilers when they are supposed to invoke the - linker, ‘ld’, such as -L. Libraries (-lfoo) should be added to the LDLIBS - variable instead. - - LDLIBS - Library flags or names given to compilers when they are supposed to invoke the - linker, ‘ld’. LOADLIBES is a deprecated (but still supported) alternative to - LDLIBS. Non-library linker flags, such as -L, should go in the LDFLAGS - variable. - -To have the ``CONAN_TC_`` variables appended to these standard GnuMake -variables, simply add the following function call to your ``Makefile`` somewhere -after the ``include`` statement: - -* ``$(call CONAN_TC_SETUP)`` - -To be clear, this only has the desired "automatic" effect if your -``Makefile(s)`` all use of these standard variables in the conventional way. If -your ``Makefile(s)`` use custom variables, you would need to teach them to -append/include/use the ``CONAN_TC_`` variables manually. - -Also, while we are appending "standard" variables in a seemingly sensible way, -this function makes a lot of assumptions which are likely not going to hold true -in many environments. The goal is to make as much of the behavior configurable -as possible. Based on user requests, we will continue to add parameters to the -constructor. If you would like a behavior added to the list of configurable -items, please provide feedback at: https://github.com/conan-io/conan/issues - - -definitions -+++++++++++ - -This attribute allows defining preprocessor definitions the same way that build helpers do: - -.. code:: python - - def generate(self): - tc = MakeToolchain(self) - tc.preprocessor_definitions["MYVAR"] = "MyValue" - tc.generate() - -This will be translated to: - -- ``-DMYVAR=MYVAL`` being appended to the ``CONAN_TC_CPPFLAGS`` variable - - -generators -++++++++++ - -The ``MakeGenerator`` is being developed in-tandem with this toolchain because -ideally they would be used in the same recipes and workflows. They have -consistent conventions and strategy, however they are currently completely -independent from each other. Thus, you can use this toolchain without using the -``MakeGenerator``. - -conf -++++ - -- ``tools.gnu.make:jobs``: argument for the ``--jobs`` parameter when running ``make`` - (overrides the general ``tools.build:processes``). - -Using the toolchain in developer flow -+++++++++++++++++++++++++++++++++++++ - -One of the advantages of using Conan toolchains is that it provides -exact same "toolchain-related" variables that Conan will have within a recipe's -``build()`` method to the build system when the user calls the build system -directly in their workspace. This was not possible prior to Conan's toolchain -feature. Here's an example: - -.. code:: bash - - # Lets start in the folder containing a conanfile.py - # Add the toolchain method with the MakeToolchain as shown in the example - $ mkdir build && cd build - # Install both debug and release deps and create the toolchain - $ conan install .. - # Add the following lines to Makefile: - # -include build/conan_toolchain.mak - # $(call CONAN_TC_SETUP) - $ make - -**NOTE** As stated previously, this will only have the desired effect if the -``Makefile`` makes conventional use of the standard variables. - -We can actually achieve the same goal without modifying the ``Makefile`` at all, -it simply requires passing a few more parameters to **GnuMake**. -.. code:: bash +.. toctree:: + :maxdepth: 2 - $ conan install .. - $ make -E='include build/conan_toolchain.mak' -E='$(call CONAN_TC_SETUP)' + gnu/autotoolsdeps + gnu/autotoolstoolchain + gnu/autotoolsgen + gnu/autotools + gnu/maketoolchain diff --git a/reference/conanfile/tools/gnu/autotools.rst b/reference/conanfile/tools/gnu/autotools.rst new file mode 100644 index 000000000000..a46c7698ce6c --- /dev/null +++ b/reference/conanfile/tools/gnu/autotools.rst @@ -0,0 +1,30 @@ +Autotools +========= + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The ``Autotools`` build helper is a wrapper around the command line invocation of autotools. It will abstract the +calls like ``./configure`` or ``make`` into Python method calls. + +The ``Autotools`` helper can be used like: + +.. code:: python + + from conans import conanfile + from conan.tools.gnu import Autotools + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + + def build(self): + autotools = Autotools(self) + autotools.configure() + autotools.make() + + +The current support is limited: +- It does not support cross-building or --target, --host, --build definitions +- It does not handle install functionality \ No newline at end of file diff --git a/reference/conanfile/tools/gnu/autotoolsdeps.rst b/reference/conanfile/tools/gnu/autotoolsdeps.rst new file mode 100644 index 000000000000..aa7ad18dd24a --- /dev/null +++ b/reference/conanfile/tools/gnu/autotoolsdeps.rst @@ -0,0 +1,52 @@ +AutotoolsDeps +============= + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The ``AutotoolsDeps`` is the dependencies generator for Autotools. It will generate shell scripts containing +environment variable definitions that the autotools build system can understand. + +The ``AutotoolsDeps`` generator can be used by name in conanfiles: + +.. code-block:: python + :caption: conanfile.py + + class Pkg(ConanFile): + generators = "AutotoolsDeps" + +.. code-block:: text + :caption: conanfile.txt + + [generators] + AutotoolsDeps + +And it can also be fully instantiated in the conanfile ``generate()`` method: + +.. code:: python + + from conans import ConanFile + from conan.tools.gnu import AutotoolsDeps + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + + def generate(self): + tc = AutotoolsDeps(self) + tc.generate() + +The ``AutotoolsDeps`` will generate after a ``conan install`` command the *conanautotoolsdeps.sh* or *conanautotoolsdeps.bat* files: + +.. code-block:: bash + + $ conan install conanfile.py # default is Release + $ source conanautotoolsdeps.sh + # or in Windows + $ conanautotoolsdeps.bat + +This generator will define aggregated variables ``CPPFLAGS``, ``LIBS``, ``LDFLAGS``, ``CXXFLAGS``, ``CFLAGS`` that +accumulate all dependencies information, including transitive dependencies, with flags like ``-I``, ``-L``, etc. + +At this moment, only the ``requires`` information is generated, the ``build_requires`` one is not managed by this generator yet. diff --git a/reference/conanfile/tools/gnu/autotoolsgen.rst b/reference/conanfile/tools/gnu/autotoolsgen.rst new file mode 100644 index 000000000000..6f80cd45c273 --- /dev/null +++ b/reference/conanfile/tools/gnu/autotoolsgen.rst @@ -0,0 +1,58 @@ +AutotoolsGen +============ + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The ``AutotoolsGen`` is a complete generator for the whole autotools system. It aggregates the +functionality of ``AutotoolsDeps``, ``AutotoolsToolchain`` and ``VirtualEnv`` into a single generator. + +It will generate shell scripts containing environment variable definitions that the autotools build system can understand. + +The ``AutotoolsGen`` generator can be used by name in conanfiles: + +.. code-block:: python + :caption: conanfile.py + + class Pkg(ConanFile): + generators = "AutotoolsGen" + +.. code-block:: text + :caption: conanfile.txt + + [generators] + AutotoolsGen + +And it can also be fully instantiated in the conanfile ``generate()`` method: + +.. code:: python + + from conans import ConanFile + from conan.tools.gnu import AutotoolsGen + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + + def generate(self): + tc = AutotoolsGen(self) + tc.generate() + + +Its implementation is straightforward: + +.. code:: python + + class AutotoolsGen: + def __init__(self, conanfile): + self.toolchain = AutotoolsToolchain(conanfile) + self.deps = AutotoolsDeps(conanfile) + self.env = VirtualEnv(conanfile) + +And it will output the same files as ``VirtualEnv``: + +- *conanbuildenv* .bat or .sh scripts, that are automatically loaded if existing by the ``self.run()`` recipes methods +- *conanrunenv* .bat or .sh scripts, that can be explicitly opted-in in ``self.run()`` recipes methods with ``self.run(..., env=["conanrunenv"])`` + +These files will contain the necessary accumulated information from all the 3 internal generators. diff --git a/reference/conanfile/tools/gnu/autotoolstoolchain.rst b/reference/conanfile/tools/gnu/autotoolstoolchain.rst new file mode 100644 index 000000000000..a377558c2416 --- /dev/null +++ b/reference/conanfile/tools/gnu/autotoolstoolchain.rst @@ -0,0 +1,50 @@ +AutotoolsToolchain +================== + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The ``AutotoolsToolchain`` is the toolchain generator for Autotools. It will generate shell scripts containing +environment variable definitions that the autotools build system can understand. + +The ``AutotooAutotoolsToolchainlsDeps`` generator can be used by name in conanfiles: + +.. code-block:: python + :caption: conanfile.py + + class Pkg(ConanFile): + generators = "AutotoolsToolchain" + +.. code-block:: text + :caption: conanfile.txt + + [generators] + AutotoolsToolchain + +And it can also be fully instantiated in the conanfile ``generate()`` method: + +.. code:: python + + from conans import ConanFile + from conan.tools.gnu import AutotoolsToolchain + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + + def generate(self): + tc = AutotoolsToolchain(self) + tc.generate() + +The ``AutotoolsToolchain`` will generate after a ``conan install`` command the *conanautotoolstoolchain.sh* or *conanautotoolstoolchain.bat* files: + +.. code-block:: bash + + $ conan install conanfile.py # default is Release + $ source conanautotoolstoolchain.sh + # or in Windows + $ conanautotoolstoolchain.bat + +This generator will define aggregated variables ``CPPFLAGS``, ``LDFLAGS``, ``CXXFLAGS``, ``CFLAGS`` that +accumulate all dependencies information, including transitive dependencies, with flags like ``-stdlib=libstdc++``, ``-std=gnu14``, architecture flags, etc. diff --git a/reference/conanfile/tools/gnu/maketoolchain.rst b/reference/conanfile/tools/gnu/maketoolchain.rst new file mode 100644 index 000000000000..19faa00fe86a --- /dev/null +++ b/reference/conanfile/tools/gnu/maketoolchain.rst @@ -0,0 +1,188 @@ +.. _make_toolchain: + +MakeToolchain +------------- + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The `MakeToolchain` can be used in the ``generate()`` method of ``conanfile.py``: + +.. code:: python + + from conans import ConanFile + from conan.tools.gnu import MakeToolchain + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + options = {"shared": [True, False], "fPIC": [True, False]} + default_options = {"shared": False, "fPIC": True} + + def generate(self): + tc = MakeToolchain(self) + tc.generate() + + +The ``MakeToolchain`` will generate the following file during ``conan install`` +command (or before calling the ``build()`` method when the package is being +built in the cache): ``conan_toolchain.mak``. To use the variables generated by +Conan, include this file in your existing ``Makefile`` such as: + +.. code:: makefile + + include conan_toolchain.mak + +Or to make it optional: + + +.. code:: makefile + + -include conan_toolchain.mak + + +``conan_toolchain.mak`` will contain the definitions of all the Make variables +related to the Conan options and settings for the current package, platform, +etc. This includes but is not limited to the following: + +* Detection of target type: "executable", "shared" or "static" + + * Based on existance/value of a option named ``shared`` + + * Based on result, defines ``-shared`` linker flag + +* Detection of ``fPIC`` + + * Based on existance/value of a option named ``fPIC`` + + * Combines with detection of target type above + + * Sets ``-fPIC`` flag for compiler + + * Sets ``-fPIC`` flag for linker when building shared library + + * Sets ``-pie`` flag for linker when building executable + +* Detection of ``build_type`` from Conan settings + + * Sets -DNDEBUG flag for ``Release`` builds + +* Definition of the C++ standard as necessary + +* Definition of the standard library used for C++ + +* Definition of rpaths based on libpaths in conan cache + +**NOTE**: Simply including this file will have no effect on your ``Makefile`` +build. + +All variables in this file are prefixed with ``CONAN_TC_`` and so existing +makefiles will robably makes no references to variables with these names. Users +can modify their makefiles to make use of these variables by name. That is +certainly supported, however such a process tighly couples Makefiles to Conan +which can be undesirable, so Conan provides an alternative. There is list of +well-known "standard"/"conventional" variables used within **GnuMake**, +**Autotools**, and other related tools: + +`Gnu Make Well-Known Variables `_ + +The relevant content from the GnuMake manual is provided here for convenience: + + CFLAGS + Extra flags to give to the C compiler. + + CXXFLAGS + Extra flags to give to the C++ compiler. + + CPPFLAGS + Extra flags to give to the C preprocessor and programs that use it (the C and Fortran compilers). + + LDFLAGS Extra flags to give to compilers when they are supposed to invoke the + linker, ‘ld’, such as -L. Libraries (-lfoo) should be added to the LDLIBS + variable instead. + + LDLIBS + Library flags or names given to compilers when they are supposed to invoke the + linker, ‘ld’. LOADLIBES is a deprecated (but still supported) alternative to + LDLIBS. Non-library linker flags, such as -L, should go in the LDFLAGS + variable. + +To have the ``CONAN_TC_`` variables appended to these standard GnuMake +variables, simply add the following function call to your ``Makefile`` somewhere +after the ``include`` statement: + +* ``$(call CONAN_TC_SETUP)`` + +To be clear, this only has the desired "automatic" effect if your +``Makefile(s)`` all use of these standard variables in the conventional way. If +your ``Makefile(s)`` use custom variables, you would need to teach them to +append/include/use the ``CONAN_TC_`` variables manually. + +Also, while we are appending "standard" variables in a seemingly sensible way, +this function makes a lot of assumptions which are likely not going to hold true +in many environments. The goal is to make as much of the behavior configurable +as possible. Based on user requests, we will continue to add parameters to the +constructor. If you would like a behavior added to the list of configurable +items, please provide feedback at: https://github.com/conan-io/conan/issues + + +definitions ++++++++++++ + +This attribute allows defining preprocessor definitions the same way that build helpers do: + +.. code:: python + + def generate(self): + tc = MakeToolchain(self) + tc.preprocessor_definitions["MYVAR"] = "MyValue" + tc.generate() + +This will be translated to: + +- ``-DMYVAR=MYVAL`` being appended to the ``CONAN_TC_CPPFLAGS`` variable + + +generators +++++++++++ + +The ``MakeGenerator`` is being developed in-tandem with this toolchain because +ideally they would be used in the same recipes and workflows. They have +consistent conventions and strategy, however they are currently completely +independent from each other. Thus, you can use this toolchain without using the +``MakeGenerator``. + + +Using the toolchain in developer flow ++++++++++++++++++++++++++++++++++++++ + +One of the advantages of using Conan toolchains is that it provides +exact same "toolchain-related" variables that Conan will have within a recipe's +``build()`` method to the build system when the user calls the build system +directly in their workspace. This was not possible prior to Conan's toolchain +feature. Here's an example: + +.. code:: bash + + # Lets start in the folder containing a conanfile.py + # Add the toolchain method with the MakeToolchain as shown in the example + $ mkdir build && cd build + # Install both debug and release deps and create the toolchain + $ conan install .. + # Add the following lines to Makefile: + # -include build/conan_toolchain.mak + # $(call CONAN_TC_SETUP) + $ make + +**NOTE** As stated previously, this will only have the desired effect if the +``Makefile`` makes conventional use of the standard variables. + +We can actually achieve the same goal without modifying the ``Makefile`` at all, +it simply requires passing a few more parameters to **GnuMake**. + +.. code:: bash + + $ conan install .. + $ make -E='include build/conan_toolchain.mak' -E='$(call CONAN_TC_SETUP)' From 0e066404253bb8f69ed5b13dffd32e3418a558b9 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 30 Mar 2021 18:35:43 +0200 Subject: [PATCH 088/681] Feature/tools virtualenv (#2060) * add virtualenv and environment docs * removing env from .gitignore * fix contents Co-authored-by: czoido --- .gitignore | 1 - reference/conanfile/tools.rst | 1 + reference/conanfile/tools/env.rst | 9 +++ reference/conanfile/tools/env/environment.rst | 78 +++++++++++++++++++ reference/conanfile/tools/env/virtualenv.rst | 44 +++++++++++ 5 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 reference/conanfile/tools/env.rst create mode 100644 reference/conanfile/tools/env/environment.rst create mode 100644 reference/conanfile/tools/env/virtualenv.rst diff --git a/.gitignore b/.gitignore index 0567a562d542..f3af9eb4a0c7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ __pycache__/ # Distribution / packaging .Python -env/ _build/ develop-eggs/ dist/ diff --git a/reference/conanfile/tools.rst b/reference/conanfile/tools.rst index 5ef1fcc21468..b62a59f77045 100644 --- a/reference/conanfile/tools.rst +++ b/reference/conanfile/tools.rst @@ -40,4 +40,5 @@ Contents: tools/meson tools/microsoft tools/qbs + tools/env tools/files diff --git a/reference/conanfile/tools/env.rst b/reference/conanfile/tools/env.rst new file mode 100644 index 000000000000..1c557f07577b --- /dev/null +++ b/reference/conanfile/tools/env.rst @@ -0,0 +1,9 @@ +conan.tools.env +=============== + + +.. toctree:: + :maxdepth: 2 + + env/environment + env/virtualenv diff --git a/reference/conanfile/tools/env/environment.rst b/reference/conanfile/tools/env/environment.rst new file mode 100644 index 000000000000..a6daf0b93ec9 --- /dev/null +++ b/reference/conanfile/tools/env/environment.rst @@ -0,0 +1,78 @@ +Environment +=========== + +.. warning:: + + This is a **very experimental** feature and it will have breaking changes in future releases. + + +``Environment`` is a class that helps defining modifications to the environment variables. This class is +used by other tools like the ``conan.tools.gnu`` autotools helpers. + +It allows different operations like: + +.. code:: python + + from conan.tools.env import Environment + + env = Environment() + env.define("MYVAR1", "MyValue1") # Overwrite previously existing MYVAR1 with new value + env.append("MYVAR2", "MyValue2") # Append to existing MYVAR2 the new value + env.prepend("MYVAR3", "MyValue3") # Prepend to existing MYVAR3 the new value + env.unset("MYVAR4") # Remove MYVAR4 definition from environment + + # And the equivalent with paths + env.define_path("MYPATH1", "path/one") # Overwrite previously existing MYPATH1 with new value + env.append_path("MYPATH2", "path/two") # Append to existing MYPATH2 the new value + env.prepend_path("MYPATH3", "path/three") # Prepend to existing MYPATH3 the new value + +Normal variables will be appended by default with space, but ``separator`` argument can be provided to define +a custom one. +Path variables will be appended with the default system path separator, either ``:`` or ``;``, but it also +allows defining which one. + +Environments can compose: + +.. code:: python + + from conan.tools.env import Environment + + env1 = Environment() + env1.define(...) + env2 = Environment() + env2.append(...) + + env1.compose(env2) # env1 has priority, and its modifications will prevail + + +There are some places where this ``Environment`` is used: + +- In recipes ``package_info()`` method, in new ``self.buildenv_info`` and ``self.runenv_info``. +- In other generators like ``AutootoolsDeps`` and ``AutotoolsToolchain`` that need to define environment +- In profiles new ``[buildenv]`` and ``[runenv]`` sections. + + +The definition in ``package_info()`` is as follow, taking into account that both ``self.buildenv_info`` and ``self.runenv_info`` +are objects of ``Environment()`` class. + + +.. code:: python + + from conans import ConanFile + + class App(ConanFile): + name = "mypkg" + version = "1.0" + settings = "os", "arch", "compiler", "build_type" + + def package_info(self): + # This is information needed by consumers to build using this package + self.buildenv_info.append("MYVAR", "MyValue") + self.buildenv_info.prepend_path("MYPATH", "some/path/folder") + + # This is information needed by consumers to run apps that depends on this package + # at runtime + self.runenv_info.define("MYPKG_DATA_DIR", os.path.join(self.package_folder, + "datadir")) + + diff --git a/reference/conanfile/tools/env/virtualenv.rst b/reference/conanfile/tools/env/virtualenv.rst new file mode 100644 index 000000000000..98ba7d9900a2 --- /dev/null +++ b/reference/conanfile/tools/env/virtualenv.rst @@ -0,0 +1,44 @@ +VirtualEnv +========== + +.. warning:: + + This is a **very experimental** feature and it will have breaking changes in future releases. + + +The ``VirtualEnv`` generator can be used by name in conanfiles: + +.. code-block:: python + :caption: conanfile.py + + class Pkg(ConanFile): + generators = "VirtualEnv" + +.. code-block:: text + :caption: conanfile.txt + + [generators] + VirtualEnv + +And it can also be fully instantiated in the conanfile ``generate()`` method: + +.. code-block:: python + :caption: conanfile.py + + from conans import ConanFile + from conan.tools.env import VirtualEnv + + class Pkg(ConanFile): + settings = "os", "compiler", "arch", "build_type" + requires = "zlib/1.2.11", "bzip2/1.0.8" + + def generate(self): + ms = VirtualEnv(self) + ms.generate() + +When the ``VirtualEnv`` generator is used, calling ``conan install`` will generate files containing environment variables information: + + +- *conanbuildenv* .bat or .sh scripts, that are automatically loaded if existing by the ``self.run()`` recipes methods. *conanbuildenv* is the build time environment information. It is collected from the direct ``build_requires`` in "build" context recipes from the ``self.buildenv_info`` definition plus the ``self.runenv_info`` of the transitive dependencies of those ``build_requires``. +- *conanrunenv* .bat or .sh scripts, that can be explicitly opted-in in ``self.run()`` recipes methods with ``self.run(..., env=["conanrunenv"])``. *conanrunenv* is the runtime environment information, anything that is necessary in the environment to actually run the compiled executables and applications. +- In both cases, whenever the runtime environment information is necessary, it wil also be automatically deduced from the ``self.cpp_info`` definition of the package, to define ``PATH``, ``LD_LIBRARY_PATH``, ``DYLD_LIBRARY_PATH`` and ``DYLD_FRAMEWORK_PATH`` environment variables. From c95a31652c9d92e9109155f659370274d84f12fe Mon Sep 17 00:00:00 2001 From: James Date: Tue, 30 Mar 2021 18:47:24 +0200 Subject: [PATCH 089/681] [conf] to define vs version for msvc (#2054) * [conf] to define vs version for msvc * notes about ``conanvcvars.bat`` file creation * fix ci * Update reference/config_files/settings.yml.rst Co-authored-by: Carlos Zoido * add to conf Co-authored-by: Carlos Zoido --- reference/conanfile/tools/microsoft.rst | 6 +++++- reference/config_files/global_conf.rst | 3 +++ reference/config_files/settings.yml.rst | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/reference/conanfile/tools/microsoft.rst b/reference/conanfile/tools/microsoft.rst index f00322647a6f..55d9a80121e4 100644 --- a/reference/conanfile/tools/microsoft.rst +++ b/reference/conanfile/tools/microsoft.rst @@ -163,7 +163,7 @@ And it can also be fully instantiated in the conanfile ``generate()`` method: tc.generate() -The ``MSBuildToolchain`` will generate two files after a ``conan install`` command: +The ``MSBuildToolchain`` will generate three files after a ``conan install`` command: .. code-block:: bash @@ -175,6 +175,10 @@ The ``MSBuildToolchain`` will generate two files after a ``conan install`` comma - A *conantoolchain_.props* file, that will be conditionally included from the previous *conantoolchain.props* file based on the configuration and platform, e.g.: *conantoolchain_release_x86.props* +- A *conanvcvars.bat* file with the necessary ``vcvars`` invocation to define the build environment if necessary + to build from the command line or from automated tools (might not be necessary if opening the IDE). This file + will be automatically called by the ``tools.microsoft.MSBuild`` helper ``build()`` method. + Every invocation to ``conan install`` with different configuration will create a new properties ``.props`` file, that will also be conditionally included. This allows to install different configurations, diff --git a/reference/config_files/global_conf.rst b/reference/config_files/global_conf.rst index d2b9a75ed5f8..be1f3a423fb0 100644 --- a/reference/config_files/global_conf.rst +++ b/reference/config_files/global_conf.rst @@ -32,6 +32,7 @@ have priority over globally defined ones in *global.conf*, and can be defined as [conf] tools.microsoft.msbuild:verbosity=Diagnostic tools.microsoft.msbuild:max_cpu_count=20 + tools.microsoft.msbuild:vs_version = 16 tools.build:processes=10 tools.ninja:jobs=30 tools.gnu.make:jobs=40 @@ -46,6 +47,8 @@ Existing configurations: - ``tools.microsoft.msbuild:max_cpu_count`` argument for the ``/m`` (``/maxCpuCount``) when running ``MSBuild`` standalone or via CMake (overrides the general ``tools.build:processes``). +- ``tools.microsoft.msbuild:vs_version`` defines the compiler version when using using the new ``msvc`` compiler. + - ``tools.build:processes``: number of processes to use for every build-helper. - ``tools.ninja:jobs`` argument for the ``--jobs`` parameter when running Ninja generator via CMake diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index 77e51210a5f2..ea75a09f94ae 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -152,8 +152,31 @@ The new ``msvc`` compiler is a new, **experimental** one, that is intended to de - It is only used by the new build integrations in :ref:`conan_tools_cmake` and :ref:`conan_tools_microsoft`, but not the previous ones. - At the moment it implements a ``compatible_packages`` fallback to Visual Studio compiled packages, that is, previous existing binaries compiled with ``settings.compiler="Visual Studio"`` can be used for the ``msvc`` compiler if no binaries exist for it yet. + This behavior can be opted-out with ``core.package_id:msvc_visual_incompatible`` :ref:`global_conf` configuration. - It is not detected by the profile auto-detect, it needs to explicitly be defined in profiles. +When using the ``msvc`` compiler, the Visual Studio toolset version (the actual ``vcvars`` activation and ``MSBuild`` location) will be +defined by the default provide of that compiler version: + +- ``msvc`` compiler version '19.0': Visual Studio 14 2015 +- ``msvc`` compiler version '19.1': Visual Studio 15 2017 +- ``msvc`` compiler version '19.2': Visual Studio 16 2019 + +This can be configured in your profiles with the ``tools.microsoft.msbuild:vs_version`` configuration: + +.. code-block:: text + + [settings] + compiler=msvc + compiler.version=19.0 + + [conf] + tools.microsoft.msbuild:vs_version = 16 + + +In this case, the ``vcvars`` will activate the Visual Studio 16 installation, but the ``19.0`` compiler version will still be used +because the necessary ``toolset=v140`` will be set. + Architectures ------------- From 7398981b27c3572eb83f2a538ee2110c6d5114c3 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 30 Mar 2021 19:26:15 +0200 Subject: [PATCH 090/681] Release/1.35.0 (#2063) * buildroot.rst: Fix a typo (#1996) Artifatory --> Artifactory * - meson : add target argument (#2011) Signed-off-by: SSE4 * Update develop with master (#2020) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner * Fix multiple minor spelling mistakes (#2019) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix multiple minor spelling mistakes * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: Carlos Zoido * Rename QbsToolchain to QbsProfile (#2027) * Rename QbsToolchain to QbsProfile * Rename use_profile to profile * conan_v2_error update (#2031) * lock bundle (#2030) * lock bundle * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido Co-authored-by: Carlos Zoido * Merge master to develop (#2033) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido * Remove misleading message about ConanCenter in shared_library_package_id() (#2000) * Update yocto docs (#2022) * Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner Co-authored-by: Daniel Co-authored-by: Uilian Ries * Merge master to develop (#2036) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido * Remove misleading message about ConanCenter in shared_library_package_id() (#2000) * Update yocto docs (#2022) * Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido * Release 1.34.0 (#2035) * buildroot.rst: Fix a typo (#1996) Artifatory --> Artifactory * - meson : add target argument (#2011) Signed-off-by: SSE4 * Update develop with master (#2020) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner * Fix multiple minor spelling mistakes (#2019) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix multiple minor spelling mistakes * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: Carlos Zoido * Rename QbsToolchain to QbsProfile (#2027) * Rename QbsToolchain to QbsProfile * Rename use_profile to profile * conan_v2_error update (#2031) * lock bundle (#2030) * lock bundle * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido Co-authored-by: Carlos Zoido * release 1.34.0 * fix changelog * Merge master to release branch (#2034) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido * Remove misleading message about ConanCenter in shared_library_package_id() (#2000) * Update yocto docs (#2022) * Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: rico-chet Co-authored-by: SSE4 Co-authored-by: James Co-authored-by: chausner Co-authored-by: Psy-Kai Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: James Co-authored-by: chausner Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: rico-chet Co-authored-by: SSE4 Co-authored-by: Psy-Kai * update constrained settings example error message (#2032) * Make the instructions in the note about gcc libcxx ABI compatibility more explicit. (#2037) * More explicit instructions on the Getting Started page * Provide a command to check gccs default configuration value on the Manage gcc >= 5 ABI page. * - document custom template definitions (#2051) Signed-off-by: SSE4 * Docs for lockfiles features from 1.35 (#2053) * modify command reference * update lock reference * wip * document clean-modified for lockfiles * update bundle docs * document conan lock install * Docs for automatically handle CONAN_RUN_TESTS environment variable (#2056) * wip * wip * update bh docs * Add docs for CMAKE_SH and data in cmakedeps (#2055) * Add docs for CMAKE_SH and data in cmakedeps * remove note box * Update lockfile bundle docs for 1.34.1 (#2040) (#2058) * Update lockfile bundle docs for 1.34.1 * Remove erroneous colon Co-authored-by: Carlos Zoido Co-authored-by: Jerry Wiltse * update cconf (#2059) * add confs (#2061) * docs for new msbuilddeps transitivity (#2052) * docs for new msbuilddeps transitivity * fix ci Co-authored-by: czoido * add docs for patches (#2062) * autotools docs (#2057) * autotools docs * add marker Co-authored-by: czoido * Feature/tools virtualenv (#2060) * add virtualenv and environment docs * removing env from .gitignore * fix contents Co-authored-by: czoido * [conf] to define vs version for msvc (#2054) * [conf] to define vs version for msvc * notes about ``conanvcvars.bat`` file creation * fix ci * Update reference/config_files/settings.yml.rst Co-authored-by: Carlos Zoido * add to conf Co-authored-by: Carlos Zoido * version 1.35.0 * update changelog Co-authored-by: rico-chet Co-authored-by: SSE4 Co-authored-by: James Co-authored-by: chausner Co-authored-by: Psy-Kai Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: melak47 Co-authored-by: jsinge Co-authored-by: Jerry Wiltse --- .ci/publish.jenkins | 3 +- .gitignore | 1 - changelog.rst | 47 ++++- conf.py | 4 +- extending/template_system/command_new.rst | 35 ++++ faq/troubleshooting.rst | 2 +- getting_started.rst | 4 +- howtos/header_only.rst | 11 +- howtos/manage_gcc_abi.rst | 7 + reference/build_helpers/cmake.rst | 4 +- reference/build_helpers/meson.rst | 3 +- reference/commands/creator/new.rst | 4 +- reference/commands/misc/lock.rst | 110 +++++++++- reference/conanfile/attributes.rst | 4 +- reference/conanfile/tools.rst | 2 + reference/conanfile/tools/cmake.rst | 15 +- reference/conanfile/tools/env.rst | 9 + reference/conanfile/tools/env/environment.rst | 78 +++++++ reference/conanfile/tools/env/virtualenv.rst | 44 ++++ reference/conanfile/tools/files.rst | 69 +++++++ reference/conanfile/tools/gnu.rst | 192 +----------------- reference/conanfile/tools/gnu/autotools.rst | 30 +++ .../conanfile/tools/gnu/autotoolsdeps.rst | 52 +++++ .../conanfile/tools/gnu/autotoolsgen.rst | 58 ++++++ .../tools/gnu/autotoolstoolchain.rst | 50 +++++ .../conanfile/tools/gnu/maketoolchain.rst | 188 +++++++++++++++++ reference/conanfile/tools/meson.rst | 6 + reference/conanfile/tools/microsoft.rst | 35 +++- reference/config_files/global_conf.rst | 26 ++- reference/config_files/settings.yml.rst | 23 +++ reference/env_vars.rst | 5 +- versioning/lockfiles/bundle.rst | 6 +- versioning/lockfiles/ci.rst | 14 ++ versioning/lockfiles/introduction.rst | 11 +- 34 files changed, 921 insertions(+), 231 deletions(-) create mode 100644 reference/conanfile/tools/env.rst create mode 100644 reference/conanfile/tools/env/environment.rst create mode 100644 reference/conanfile/tools/env/virtualenv.rst create mode 100644 reference/conanfile/tools/files.rst create mode 100644 reference/conanfile/tools/gnu/autotools.rst create mode 100644 reference/conanfile/tools/gnu/autotoolsdeps.rst create mode 100644 reference/conanfile/tools/gnu/autotoolsgen.rst create mode 100644 reference/conanfile/tools/gnu/autotoolstoolchain.rst create mode 100644 reference/conanfile/tools/gnu/maketoolchain.rst diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index 80995d585d22..34b3c44a8cb3 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,6 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ + 'release/1.35.0': '1.35', 'release/1.34.1': '1.34', 'release/1.33.1': '1.33', 'release/1.32.1': '1.32', @@ -89,7 +90,7 @@ node('Linux') { image.inside { stage('Prepare sources') { writeJSON json: versions, file: "${folderName}/versions.json" - if (folderName != 'latest') { + if (folderName != 'latest') { sh "rm -fr ${folderName}/_themes/conan" sh "cp -a latest/_themes/. ${folderName}/_themes/" } diff --git a/.gitignore b/.gitignore index 0567a562d542..f3af9eb4a0c7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ __pycache__/ # Distribution / packaging .Python -env/ _build/ develop-eggs/ dist/ diff --git a/changelog.rst b/changelog.rst index 66304e19049c..7360b240c7e3 100644 --- a/changelog.rst +++ b/changelog.rst @@ -18,9 +18,52 @@ Check https://github.com/conan-io/conan for issues and more details about develo .. important:: - Conan 1.34 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please + Conan 1.35 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.35.0 (30-Mar-2021) +-------------------- + +- Feature: ``MSBuildDeps`` generator uses new visitor model and handles conditional requirements correctly. `#8733 `_ . Docs `here `__ +- Feature: CMake toolchain supports include_guard() feature `#8728 `_ +- Feature: New ``conan lock bundle clean-modified`` command. `#8726 `_ . Docs `here `__ +- Feature: Use ``conancvvars.bat`` file for Meson toolchain `#8719 `_ +- Feature: Allow arbitrary defines in :command:`conan new` templates. `#8718 `_ . Docs `here `__ +- Feature: Automatically handle `CONAN_RUN_TESTS` to avoid extra boilerplate. `#8687 `_ . Docs `here `__ +- Feature: More fine-grained control (using [conf]) for build parallelization. `#8665 `_ . Docs `here `__ +- Feature: Add support for testing with different tools versions. `#8656 `_ +- Feature: Add different CMake versions for testing. `#8656 `_ +- Feature: Move the definition of CMakeDeps variables to its own file `#8655 `_ . Docs `here `__ +- Feature: Added `conan.tools.files.patch` to apply a single patch (new interface for legacy `conans.tools.patch` function. `#8650 `_ . Docs `here `__ +- Feature: Added `conan.tools.files.apply_conandata_patches` to apply patches defined in `conandata.yml`. `#8650 `_ . Docs `here `__ +- Feature: Allow integers as ``preprocessor_definitions`` in ``CMakeToolchain``. `#8645 `_ +- Feature: New ``Environment`` model for recipes and profiles `#8630 `_ . Docs `here `__ +- Feature: Do not remove sh from the path in the new CMake helper. `#8625 `_ . Docs `here `__ +- Feature: Allow definition of custom Visual Studio version for msvc compiler in MSBuild helpers. `#8603 `_ . Docs `here `__ +- Feature: MSBuildToolchain creates conanvcvars.bat containing vcvars command for command line building. `#8603 `_ . Docs `here `__ +- Feature: Set `CMAKE_FIND_PACKAGE_PREFER_CONFIG=ON`. `#8599 `_ +- Feature: Include the recipe name when constrained settings prevent install. `#8559 `_ . Docs `here `__ +- Feature: Create new conan.tools.files for 2.0. `#8550 `_ +- Feature: New AutotoolsDeps, AutotoolsToolchain helpers in conan.tools.gnu `#8457 `_ . Docs `here `__ +- Feature: Experimental ``conan lock install`` that can install a lockfile in the cache, all the binaries or only the recipes with ``--recipes``, intended for CI flows. `#8021 `_ . Docs `here `__ +- Fix: Fix incorrect output of ``default_user`` and ``default_channel`` in ``export``. `#8732 `_ +- Fix: remotes not being loaded for the :command:`conan alias` command, which was preventing :command:`conan alias` from working if python_requires is used. `#8704 `_ +- Fix: Improve error message for ``lock create`` providing a path instead of full path with filename. `#8695 `_ +- Fix: Rename `tools.microsoft:msbuild_verbosity` to `tools.microsoft.msbuild:verbosity` `#8692 `_ . Docs `here `__ +- Fix: Simplifications to ``CMakeDeps`` generator to remove legacy code. `#8666 `_ +- Fix: Add dirty management in download cache, so interrupted downloads doesn't need a manual cleaning of such download cache. `#8664 `_ +- Fix: Build helper qbs install now installs directly into package_folder. `#8660 `_ +- Fix: Allow arbitrary template structure. `#8641 `_ +- Fix: Restoring the behavior that `exports` and `exports_sources` were case sensitive by default. `#8585 `_ +- Fix: Remove default dummy value for iOS XCode signature. `#8576 `_ +- Fix: Do not order Settings lists, so error messages are in declared order. `#8573 `_ +- BugFix: Command :command:`conan new` accepts short reference with address sign. `#8721 `_ +- Bugfix: Fix profile definitions of env-vars per-package using patterns, not only the package name. `#8688 `_ +- Bugfix: Preserve the explicit value `None` for SCM attributes if the default is a different value. `#8622 `_ +- Bugfix: Properly detect Amazon Linux 2 distro. `#8612 `_ +- Bugfix: Fix config install not working when .git* folder is in the path. `#8605 `_ +- Bugfix: Fix: Transitive python requires not working with the new syntax. `#8604 `_ + 1.34.1 (10-Mar-2021) -------------------- @@ -573,7 +616,7 @@ Check https://github.com/conan-io/conan for issues and more details about develo 1.22.0 (05-Feb-2020) -------------------- - + - Feature: Set conan generated CMake targets as `GLOBAL` so that they can be used with an `ALIAS` for consumers. `#6438 `_ . Docs `here `__ - Feature: Deduce `compiler.base.runtime` for Intel compiler settings when using Visual Studio as the base compiler. `#6424 `_ - Feature: Allow defining an extra user-defined properties .props file in ``MSBuild`` build helper. `#6374 `_ . Docs `here `__ diff --git a/conf.py b/conf.py index 9c92c37dfa9c..f14f73f79a4d 100644 --- a/conf.py +++ b/conf.py @@ -41,9 +41,9 @@ ] # The short X.Y version. -version = "1.34" +version = "1.35" # The full version, including alpha/beta/rc tags. -release = u'1.34.1' +release = u'1.35.0' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): diff --git a/extending/template_system/command_new.rst b/extending/template_system/command_new.rst index fe32bf5904f0..b9bd40205c92 100644 --- a/extending/template_system/command_new.rst +++ b/extending/template_system/command_new.rst @@ -100,3 +100,38 @@ This is a very simple example for a header only library: def package_id(self): self.info.header_only() + +Custom definitions +------------------ + +Sometimes it's needed to provide additional variables for the custom templates. For instance, if +it's desired to have ``description`` and ``homepage`` to be templated as well: + + + .. code-block:: text + + # Recipe autogenerated with Conan {{ conan_version }} using `conan new --template` command + + from conans import ConanFile + + + class {{package_name}}Conan(ConanFile): + name = "{{ name }}" + version = "{{ version }}" + description = "{{ description }}" + homepage = "{{ homepage }}" + settings = "os", "arch", "compiler", "build_type" + exports_sources = "include/*" + + def package(self): + self.copy("*.hpp", dst="include") + self.copy("LICENSE.txt", dst="licenses") + + def package_id(self): + self.info.header_only() + +now it's easy to overwrite these values from the command line: + + .. code-block:: bash + + $ conan new mypackage/version --template=header_only -d homepage=https://www.example.com -d description="the best package" diff --git a/faq/troubleshooting.rst b/faq/troubleshooting.rst index 4070a2d3fb0d..b8192fa3807f 100644 --- a/faq/troubleshooting.rst +++ b/faq/troubleshooting.rst @@ -8,7 +8,7 @@ When you install or create a package you might have error like the following one .. code-block:: text - ERROR: The recipe is constraining settings. Invalid setting 'Linux' is not a valid 'settings.os' value. + ERROR: The recipe wtl/10.0.9163 is constraining settings. Invalid setting 'Linux' is not a valid 'settings.os' value. Possible values are ['Windows'] Read "http://docs.conan.io/en/latest/faq/troubleshooting.html#error-the-recipe-is-contraining-settings" diff --git a/getting_started.rst b/getting_started.rst index 4c73e0c7e29c..a62036485d25 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -119,7 +119,9 @@ An MD5 hash calculator using the Poco Libraries .. important:: If you are using **GCC compiler >= 5.1**, Conan will set the ``compiler.libcxx`` to the old - ABI for backwards compatibility. You can change this with the following commands: + ABI for backwards compatibility. In the context of this getting started example, this is a bad choice though: + Recent gcc versions will compile the example by default with the new ABI and linking will fail without further + customization of your cmake configuration. You can avoid this with the following commands: .. code-block:: bash diff --git a/howtos/header_only.rst b/howtos/header_only.rst index bf515a9d943f..d61eb6dcecb7 100644 --- a/howtos/header_only.rst +++ b/howtos/header_only.rst @@ -81,14 +81,9 @@ If you want to run the library unit test while packaging, you would need this re If you are :ref:`cross-building ` your **library** or **app** you'll probably need to skip the **unit tests** because your target binary cannot be executed in current building host. - To do it you can use :ref:`tools_get_env` in combination with - :ref:`env_vars_conan_run_tests` environment variable, defined as **False** - in profile for cross-building and replace ``cmake.test()`` with: - - .. code-block:: python - - if tools.get_env("CONAN_RUN_TESTS", True): - cmake.test() + To do it you can use :ref:`env_vars_conan_run_tests` environment variable, defined as **False** + in profile for cross-building in the call to ``cmake.test()`` this variable will be evaluated and + the tests will not run. Which will use a ``CMakeLists.txt`` file in the root folder: diff --git a/howtos/manage_gcc_abi.rst b/howtos/manage_gcc_abi.rst index d7de167f4502..8d35eb2ca9c0 100644 --- a/howtos/manage_gcc_abi.rst +++ b/howtos/manage_gcc_abi.rst @@ -15,6 +15,13 @@ You can choose which ABI to use in your Conan packages by adjusting the ``compil When Conan creates the default profile the first time it runs, it adjusts the ``compiler.libcxx`` setting to ``libstdc++`` for backwards compatibility. However, if you are using GCC >= 5 your compiler is likely to be using the new CXX11 ABI by default (libstdc++11). +This can be checked with the following command: + +.. code-block:: bash + + $ gcc -v 2>&1 | sed -n 's/.*\(--with-default-libstdcxx-abi=new\).*/\1/p' + --with-default-libstdcxx-abi=new + If you want Conan to use the new ABI, edit the default profile at ``~/.conan/profiles/default`` adjusting ``compiler.libcxx=libstdc++11`` or override this setting in the profile you are using. diff --git a/reference/build_helpers/cmake.rst b/reference/build_helpers/cmake.rst index 01c6bcb5a75b..de82e0ba824a 100644 --- a/reference/build_helpers/cmake.rst +++ b/reference/build_helpers/cmake.rst @@ -335,7 +335,9 @@ test() def test(args=None, build_dir=None, target=None, output_on_failure=False) -Build `CMake` test target (could be RUN_TESTS in multi-config projects or ``test`` in single-config projects), which usually means building and running unit tests +Build `CMake` test target (could be RUN_TESTS in multi-config projects or ``test`` in single-config +projects), which usually means building and running unit tests. When this function is called +:ref:`env_vars_conan_run_tests` will be evaluated to check if tests should run. Parameters: - **args** (Optional, Defaulted to ``None``): A list of additional arguments to be passed to the ``cmake`` command. Each argument will be escaped according to the current shell. No extra arguments will be added if ``args=None``. diff --git a/reference/build_helpers/meson.rst b/reference/build_helpers/meson.rst index 2007c0e3469a..343498c1f273 100644 --- a/reference/build_helpers/meson.rst +++ b/reference/build_helpers/meson.rst @@ -89,7 +89,8 @@ test() def test(args=None, build_dir=None, target=None) -Executes ninja test target, which usually means building and running unit tests. +Executes ninja test target, which usually means building and running unit tests. When this function +is called :ref:`env_vars_conan_run_tests` will be evaluated to check if tests should run. Parameters: - **args** (Optional, Defaulted to ``None``): A list of additional arguments to be passed to the ``ninja`` command. Each argument will be escaped diff --git a/reference/commands/creator/new.rst b/reference/commands/creator/new.rst index e8ba26bfde41..abddd1f18576 100644 --- a/reference/commands/creator/new.rst +++ b/reference/commands/creator/new.rst @@ -58,6 +58,9 @@ Creates a new package recipe template with a 'conanfile.py' and optionally, excluded -ciu CI_UPLOAD_URL, --ci-upload-url CI_UPLOAD_URL Define URL of the repository to upload + -d DEFINE, --define DEFINE + Define additional variables to be processed within + template **Examples**: @@ -93,5 +96,4 @@ Creates a new package recipe template with a 'conanfile.py' and optionally, $ conan new mypackage/1.0 --template=myconanfile.py # Single template file $ conan new mypackage/1.0 --template=header_only # Template directory - Refer to the section :ref:`template_command_new` for more information about these templates. diff --git a/reference/commands/misc/lock.rst b/reference/commands/misc/lock.rst index 28daba64d6d7..44456ed7271d 100644 --- a/reference/commands/misc/lock.rst +++ b/reference/commands/misc/lock.rst @@ -5,14 +5,16 @@ conan lock .. code-block:: bash - $ conan lock [-h] {update,build-order,clean-modified,create} ... + $ conan lock [-h] + {update,build-order,clean-modified,install,create,bundle} + ... Generates and manipulates lock files. .. code-block:: text positional arguments: - {update,build-order,clean-modified,create} + {update,build-order,clean-modified,install,create,bundle} sub-command help update Complete missing information in the first lockfile with information defined in the second lockfile. Both @@ -22,7 +24,9 @@ Generates and manipulates lock files. first one build-order Returns build-order clean-modified Clean modified flags + install Install a lockfile create Create a lockfile from a conanfile or a reference + bundle Manages lockfile bundles optional arguments: -h, --help show this help message and exit @@ -144,4 +148,104 @@ conan lock clean-modified lockfile Path to the lockfile optional arguments: - -h, --help show this help message and exit \ No newline at end of file + -h, --help show this help message and exit + +conan lock install +------------------ + +.. code-block:: bash + + $ conan lock install [-h] [--recipes] [-g GENERATOR] lockfile + +.. code-block:: text + + positional arguments: + lockfile Path to the lockfile + + optional arguments: + -h, --help show this help message and exit + --recipes Install only recipes, not binaries + -g GENERATOR, --generator GENERATOR + Generators to use + +conan lock bundle +================= + +.. code-block:: bash + + $ conan lock bundle [-h] {create,build-order,update,clean-modified} ... + +.. code-block:: text + + positional arguments: + {create,build-order,update,clean-modified} + sub-command help + create Create lockfile bundle + build-order Returns build-order + update Complete missing information in the first lockfile with information defined in the second lockfile. + Both lockfiles must represent the same graph, and have the same topology with the same identifiers, + i.e. the second lockfile must be an evolution based on the first one + clean-modified Clean modified flag + +conan lock bundle create +------------------------ + +.. code-block:: bash + + $ conan lock bundle create [-h] [--bundle-out BUNDLE_OUT] lockfiles [lockfiles ...] + +.. code-block:: text + + positional arguments: + lockfiles Path to lockfiles + + optional arguments: + -h, --help show this help message and exit + --bundle-out BUNDLE_OUT + Filename of the created bundle + +conan lock bundle build-order +----------------------------- + +.. code-block:: bash + + $ conan lock bundle build-order [-h] [--json JSON] bundle + +.. code-block:: text + + positional arguments: + bundle Path to lockfile bundle + + optional arguments: + -h, --help show this help message and exit + --json JSON generate output file in json format + +conan lock bundle update +------------------------ + +.. code-block:: bash + + $ conan lock bundle update [-h] bundle + +.. code-block:: text + + positional arguments: + bundle Path to lockfile bundle + + optional arguments: + -h, --help show this help message and exit + +conan lock bundle clean-modified +-------------------------------- + +.. code-block:: bash + + $ conan lock bundle clean-modified [-h] bundle + +.. code-block:: text + + positional arguments: + bundle Path to lockfile bundle + + optional arguments: + -h, --help show this help message and exit diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 0f53fc767cff..26f6377fddfe 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -454,7 +454,7 @@ highest one (with the exceptional assignment in ``configure()`` method which can Values from options can be retrieved after they are assigned. For options that belong to the same recipe, the value can be retrieved in any method to run logic conditional to their values. **Options from required packages can be retrieved only after the full graph has been resolved**, this means that the value will be available in the methods -``build()``, ``package()``, ``package_info()``. Accessing those values in other methods can lead to unexpected results. +``validate()``, ``build()``, ``package()``, ``package_info()``. Accessing those values in other methods can lead to unexpected results. .. code-block:: python @@ -462,7 +462,7 @@ retrieved only after the full graph has been resolved**, this means that the val class OtherPkg(ConanFile): requires = "mypkg/0.1@user/channel" - def build(self): + def validate(self): if self.options['mypkg'].shared: raise ConanInvalidConfiguration("Cannot use shared library of requirement 'mypkg'") diff --git a/reference/conanfile/tools.rst b/reference/conanfile/tools.rst index fd6afef55d2a..b62a59f77045 100644 --- a/reference/conanfile/tools.rst +++ b/reference/conanfile/tools.rst @@ -40,3 +40,5 @@ Contents: tools/meson tools/microsoft tools/qbs + tools/env + tools/files diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 958db8b39cea..ad3420b2fd52 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -13,8 +13,8 @@ CMakeDeps Available since: `1.33.0 `_ -The ``CMakeDeps`` helper will generate one **xxxx-config.cmake** file per dependency, together with other necessary .cmake files -like version, or configuration. It can be used like: +The ``CMakeDeps`` helper will generate one **xxxx-config.cmake** file per dependency, together with other necessary *.cmake* files +like version, flags and directory data or configuration. It can be used like: .. code-block:: python @@ -231,6 +231,9 @@ when a package is being built directly by Conan (create, install) cmake.configure() cmake.build() +**Note:** This helper includes the additional flag `-DCMAKE_SH="CMAKE_SH-NOTFOUND"` when using the `MinGW Makefiles` CMake's +generator, to avoid the error of `sh` being in the PATH (CMake version < 3.17.0). + It supports the following methods: constructor @@ -311,6 +314,12 @@ Equivalent to running :command:`cmake --build . --target=RUN_TESTS`. conf ++++ -- ``tools.microsoft:msbuild_verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed +- ``tools.microsoft.msbuild:verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed to the ``CMake.build()`` command, when a Visual Studio generator (MSBuild build system) is being used for CMake. It is passed as an argument to the underlying build system via the call ``cmake --build . --config Release -- /verbosity:Diagnostic`` + +- ``tools.ninja:jobs`` argument for the ``--jobs`` parameter when running Ninja generator. (overrides + the general ``tools.build:processes``). + +- ``tools.microsoft.msbuild:max_cpu_count`` argument for the ``/m`` (``/maxCpuCount``) when running + ``MSBuild`` (overrides the general ``tools.build:processes``). diff --git a/reference/conanfile/tools/env.rst b/reference/conanfile/tools/env.rst new file mode 100644 index 000000000000..1c557f07577b --- /dev/null +++ b/reference/conanfile/tools/env.rst @@ -0,0 +1,9 @@ +conan.tools.env +=============== + + +.. toctree:: + :maxdepth: 2 + + env/environment + env/virtualenv diff --git a/reference/conanfile/tools/env/environment.rst b/reference/conanfile/tools/env/environment.rst new file mode 100644 index 000000000000..a6daf0b93ec9 --- /dev/null +++ b/reference/conanfile/tools/env/environment.rst @@ -0,0 +1,78 @@ +Environment +=========== + +.. warning:: + + This is a **very experimental** feature and it will have breaking changes in future releases. + + +``Environment`` is a class that helps defining modifications to the environment variables. This class is +used by other tools like the ``conan.tools.gnu`` autotools helpers. + +It allows different operations like: + +.. code:: python + + from conan.tools.env import Environment + + env = Environment() + env.define("MYVAR1", "MyValue1") # Overwrite previously existing MYVAR1 with new value + env.append("MYVAR2", "MyValue2") # Append to existing MYVAR2 the new value + env.prepend("MYVAR3", "MyValue3") # Prepend to existing MYVAR3 the new value + env.unset("MYVAR4") # Remove MYVAR4 definition from environment + + # And the equivalent with paths + env.define_path("MYPATH1", "path/one") # Overwrite previously existing MYPATH1 with new value + env.append_path("MYPATH2", "path/two") # Append to existing MYPATH2 the new value + env.prepend_path("MYPATH3", "path/three") # Prepend to existing MYPATH3 the new value + +Normal variables will be appended by default with space, but ``separator`` argument can be provided to define +a custom one. +Path variables will be appended with the default system path separator, either ``:`` or ``;``, but it also +allows defining which one. + +Environments can compose: + +.. code:: python + + from conan.tools.env import Environment + + env1 = Environment() + env1.define(...) + env2 = Environment() + env2.append(...) + + env1.compose(env2) # env1 has priority, and its modifications will prevail + + +There are some places where this ``Environment`` is used: + +- In recipes ``package_info()`` method, in new ``self.buildenv_info`` and ``self.runenv_info``. +- In other generators like ``AutootoolsDeps`` and ``AutotoolsToolchain`` that need to define environment +- In profiles new ``[buildenv]`` and ``[runenv]`` sections. + + +The definition in ``package_info()`` is as follow, taking into account that both ``self.buildenv_info`` and ``self.runenv_info`` +are objects of ``Environment()`` class. + + +.. code:: python + + from conans import ConanFile + + class App(ConanFile): + name = "mypkg" + version = "1.0" + settings = "os", "arch", "compiler", "build_type" + + def package_info(self): + # This is information needed by consumers to build using this package + self.buildenv_info.append("MYVAR", "MyValue") + self.buildenv_info.prepend_path("MYPATH", "some/path/folder") + + # This is information needed by consumers to run apps that depends on this package + # at runtime + self.runenv_info.define("MYPKG_DATA_DIR", os.path.join(self.package_folder, + "datadir")) + + diff --git a/reference/conanfile/tools/env/virtualenv.rst b/reference/conanfile/tools/env/virtualenv.rst new file mode 100644 index 000000000000..98ba7d9900a2 --- /dev/null +++ b/reference/conanfile/tools/env/virtualenv.rst @@ -0,0 +1,44 @@ +VirtualEnv +========== + +.. warning:: + + This is a **very experimental** feature and it will have breaking changes in future releases. + + +The ``VirtualEnv`` generator can be used by name in conanfiles: + +.. code-block:: python + :caption: conanfile.py + + class Pkg(ConanFile): + generators = "VirtualEnv" + +.. code-block:: text + :caption: conanfile.txt + + [generators] + VirtualEnv + +And it can also be fully instantiated in the conanfile ``generate()`` method: + +.. code-block:: python + :caption: conanfile.py + + from conans import ConanFile + from conan.tools.env import VirtualEnv + + class Pkg(ConanFile): + settings = "os", "compiler", "arch", "build_type" + requires = "zlib/1.2.11", "bzip2/1.0.8" + + def generate(self): + ms = VirtualEnv(self) + ms.generate() + +When the ``VirtualEnv`` generator is used, calling ``conan install`` will generate files containing environment variables information: + + +- *conanbuildenv* .bat or .sh scripts, that are automatically loaded if existing by the ``self.run()`` recipes methods. *conanbuildenv* is the build time environment information. It is collected from the direct ``build_requires`` in "build" context recipes from the ``self.buildenv_info`` definition plus the ``self.runenv_info`` of the transitive dependencies of those ``build_requires``. +- *conanrunenv* .bat or .sh scripts, that can be explicitly opted-in in ``self.run()`` recipes methods with ``self.run(..., env=["conanrunenv"])``. *conanrunenv* is the runtime environment information, anything that is necessary in the environment to actually run the compiled executables and applications. +- In both cases, whenever the runtime environment information is necessary, it wil also be automatically deduced from the ``self.cpp_info`` definition of the package, to define ``PATH``, ``LD_LIBRARY_PATH``, ``DYLD_LIBRARY_PATH`` and ``DYLD_FRAMEWORK_PATH`` environment variables. diff --git a/reference/conanfile/tools/files.rst b/reference/conanfile/tools/files.rst new file mode 100644 index 000000000000..8c493c4c55fd --- /dev/null +++ b/reference/conanfile/tools/files.rst @@ -0,0 +1,69 @@ +.. _conan_tools_files: + +conan.tools.files +================= + +.. _conan_tools_files_patch: + +conan.tools.files.patch() +------------------------- + +.. code-block:: python + + def patch(conanfile, base_path=None, patch_file=None, patch_string=None, + strip=0, fuzz=False, **kwargs): + +Applies a diff from file (*patch_file*) or string (*patch_string*) in *base_path* directory. If +*base_path* is not passed it is applied in the current directory. + +Parameters: + - **base_path**: Base path where the patch should be applied. + - **patch_file**: Patch file that should be applied. + - **patch_string**: Patch string that should be applied. + - **strip**: Number of folders to be stripped from the path. + - **output**: Stream object. + - **fuzz**: Should accept fuzzy patches. + - **kwargs**: Extra parameters that can be added and will contribute to output information. + +.. _conan_tools_files_apply_conandata_patches: + +conan.tools.files.apply_conandata_patches() +------------------------------------------- + +.. code-block:: python + + def apply_conandata_patches(conanfile): + +Applies patches stored in ``conanfile.conan_data`` (read from ``conandata.yml`` file). It will apply +all the patches under ``patches`` entry that matches the given ``conanfile.version``. If versions are +not defined in ``conandata.yml`` it will apply all the patches directly under ``patches`` keyword. + +Example of ``conandata.yml`` without versions defined: + +.. code-block:: yaml + + patches: + - patch_file: "patches/0001-buildflatbuffers-cmake.patch" + base_path: "source_subfolder" + - patch_file: "patches/0002-implicit-copy-constructor.patch" + base_path: "source_subfolder" + patch_type: backport + patch_source: https://github.com/google/flatbuffers/pull/5650 + patch_description: Needed to build with modern clang compilers. + +Example of ``conandata.yml`` with different patches for different versions: + +.. code-block:: yaml + + patches: + "1.11.0": + - patch_file: "patches/0001-buildflatbuffers-cmake.patch" + base_path: "source_subfolder" + - patch_file: "patches/0002-implicit-copy-constructor.patch" + base_path: "source_subfolder" + patch_type: backport + patch_source: https://github.com/google/flatbuffers/pull/5650 + patch_description: Needed to build with modern clang compilers. + "1.12.0": + - patch_file: "patches/0001-buildflatbuffers-cmake.patch" + base_path: "source_subfolder" diff --git a/reference/conanfile/tools/gnu.rst b/reference/conanfile/tools/gnu.rst index 213d17d53bd5..5a89a07e94d6 100644 --- a/reference/conanfile/tools/gnu.rst +++ b/reference/conanfile/tools/gnu.rst @@ -1,190 +1,12 @@ -.. _make_toolchain: - conan.tools.gnu =============== -.. warning:: - - This is an **experimental** feature subject to breaking changes in future releases. - -MakeToolchain -------------- - -The `MakeToolchain` can be used in the ``generate()`` method of ``conanfile.py``: - -.. code:: python - - from conans import ConanFile - from conan.tools.gnu import MakeToolchain - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} - - def generate(self): - tc = MakeToolchain(self) - tc.generate() - - -The ``MakeToolchain`` will generate the following file during ``conan install`` -command (or before calling the ``build()`` method when the package is being -built in the cache): ``conan_toolchain.mak``. To use the variables generated by -Conan, include this file in your existing ``Makefile`` such as: - -.. code:: makefile - - include conan_toolchain.mak - -Or to make it optional: - - -.. code:: makefile - - -include conan_toolchain.mak - - -``conan_toolchain.mak`` will contain the definitions of all the Make variables -related to the Conan options and settings for the current package, platform, -etc. This includes but is not limited to the following: - -* Detection of target type: "executable", "shared" or "static" - - * Based on existance/value of a option named ``shared`` - - * Based on result, defines ``-shared`` linker flag - -* Detection of ``fPIC`` - - * Based on existance/value of a option named ``fPIC`` - - * Combines with detection of target type above - - * Sets ``-fPIC`` flag for compiler - - * Sets ``-fPIC`` flag for linker when building shared library - - * Sets ``-pie`` flag for linker when building executable - -* Detection of ``build_type`` from Conan settings - - * Sets -DNDEBUG flag for ``Release`` builds - -* Definition of the C++ standard as necessary - -* Definition of the standard library used for C++ - -* Definition of rpaths based on libpaths in conan cache - -**NOTE**: Simply including this file will have no effect on your ``Makefile`` -build. - -All variables in this file are prefixed with ``CONAN_TC_`` and so existing -makefiles will robably makes no references to variables with these names. Users -can modify their makefiles to make use of these variables by name. That is -certainly supported, however such a process tighly couples Makefiles to Conan -which can be undesirable, so Conan provides an alternative. There is list of -well-known "standard"/"conventional" variables used within **GnuMake**, -**Autotools**, and other related tools: - -`Gnu Make Well-Known Variables `_ - -The relevant content from the GnuMake manual is provided here for convenience: - - CFLAGS - Extra flags to give to the C compiler. - - CXXFLAGS - Extra flags to give to the C++ compiler. - - CPPFLAGS - Extra flags to give to the C preprocessor and programs that use it (the C and Fortran compilers). - - LDFLAGS Extra flags to give to compilers when they are supposed to invoke the - linker, ‘ld’, such as -L. Libraries (-lfoo) should be added to the LDLIBS - variable instead. - - LDLIBS - Library flags or names given to compilers when they are supposed to invoke the - linker, ‘ld’. LOADLIBES is a deprecated (but still supported) alternative to - LDLIBS. Non-library linker flags, such as -L, should go in the LDFLAGS - variable. - -To have the ``CONAN_TC_`` variables appended to these standard GnuMake -variables, simply add the following function call to your ``Makefile`` somewhere -after the ``include`` statement: - -* ``$(call CONAN_TC_SETUP)`` - -To be clear, this only has the desired "automatic" effect if your -``Makefile(s)`` all use of these standard variables in the conventional way. If -your ``Makefile(s)`` use custom variables, you would need to teach them to -append/include/use the ``CONAN_TC_`` variables manually. - -Also, while we are appending "standard" variables in a seemingly sensible way, -this function makes a lot of assumptions which are likely not going to hold true -in many environments. The goal is to make as much of the behavior configurable -as possible. Based on user requests, we will continue to add parameters to the -constructor. If you would like a behavior added to the list of configurable -items, please provide feedback at: https://github.com/conan-io/conan/issues - - -definitions -+++++++++++ - -This attribute allows defining preprocessor definitions the same way that build helpers do: - -.. code:: python - - def generate(self): - tc = MakeToolchain(self) - tc.preprocessor_definitions["MYVAR"] = "MyValue" - tc.generate() - -This will be translated to: - -- ``-DMYVAR=MYVAL`` being appended to the ``CONAN_TC_CPPFLAGS`` variable - - -generators -++++++++++ - -The ``MakeGenerator`` is being developed in-tandem with this toolchain because -ideally they would be used in the same recipes and workflows. They have -consistent conventions and strategy, however they are currently completely -independent from each other. Thus, you can use this toolchain without using the -``MakeGenerator``. - - -Using the toolchain in developer flow -+++++++++++++++++++++++++++++++++++++ - -One of the advantages of using Conan toolchains is that it provides -exact same "toolchain-related" variables that Conan will have within a recipe's -``build()`` method to the build system when the user calls the build system -directly in their workspace. This was not possible prior to Conan's toolchain -feature. Here's an example: - -.. code:: bash - - # Lets start in the folder containing a conanfile.py - # Add the toolchain method with the MakeToolchain as shown in the example - $ mkdir build && cd build - # Install both debug and release deps and create the toolchain - $ conan install .. - # Add the following lines to Makefile: - # -include build/conan_toolchain.mak - # $(call CONAN_TC_SETUP) - $ make - -**NOTE** As stated previously, this will only have the desired effect if the -``Makefile`` makes conventional use of the standard variables. - -We can actually achieve the same goal without modifying the ``Makefile`` at all, -it simply requires passing a few more parameters to **GnuMake**. -.. code:: bash +.. toctree:: + :maxdepth: 2 - $ conan install .. - $ make -E='include build/conan_toolchain.mak' -E='$(call CONAN_TC_SETUP)' + gnu/autotoolsdeps + gnu/autotoolstoolchain + gnu/autotoolsgen + gnu/autotools + gnu/maketoolchain diff --git a/reference/conanfile/tools/gnu/autotools.rst b/reference/conanfile/tools/gnu/autotools.rst new file mode 100644 index 000000000000..a46c7698ce6c --- /dev/null +++ b/reference/conanfile/tools/gnu/autotools.rst @@ -0,0 +1,30 @@ +Autotools +========= + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The ``Autotools`` build helper is a wrapper around the command line invocation of autotools. It will abstract the +calls like ``./configure`` or ``make`` into Python method calls. + +The ``Autotools`` helper can be used like: + +.. code:: python + + from conans import conanfile + from conan.tools.gnu import Autotools + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + + def build(self): + autotools = Autotools(self) + autotools.configure() + autotools.make() + + +The current support is limited: +- It does not support cross-building or --target, --host, --build definitions +- It does not handle install functionality \ No newline at end of file diff --git a/reference/conanfile/tools/gnu/autotoolsdeps.rst b/reference/conanfile/tools/gnu/autotoolsdeps.rst new file mode 100644 index 000000000000..aa7ad18dd24a --- /dev/null +++ b/reference/conanfile/tools/gnu/autotoolsdeps.rst @@ -0,0 +1,52 @@ +AutotoolsDeps +============= + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The ``AutotoolsDeps`` is the dependencies generator for Autotools. It will generate shell scripts containing +environment variable definitions that the autotools build system can understand. + +The ``AutotoolsDeps`` generator can be used by name in conanfiles: + +.. code-block:: python + :caption: conanfile.py + + class Pkg(ConanFile): + generators = "AutotoolsDeps" + +.. code-block:: text + :caption: conanfile.txt + + [generators] + AutotoolsDeps + +And it can also be fully instantiated in the conanfile ``generate()`` method: + +.. code:: python + + from conans import ConanFile + from conan.tools.gnu import AutotoolsDeps + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + + def generate(self): + tc = AutotoolsDeps(self) + tc.generate() + +The ``AutotoolsDeps`` will generate after a ``conan install`` command the *conanautotoolsdeps.sh* or *conanautotoolsdeps.bat* files: + +.. code-block:: bash + + $ conan install conanfile.py # default is Release + $ source conanautotoolsdeps.sh + # or in Windows + $ conanautotoolsdeps.bat + +This generator will define aggregated variables ``CPPFLAGS``, ``LIBS``, ``LDFLAGS``, ``CXXFLAGS``, ``CFLAGS`` that +accumulate all dependencies information, including transitive dependencies, with flags like ``-I``, ``-L``, etc. + +At this moment, only the ``requires`` information is generated, the ``build_requires`` one is not managed by this generator yet. diff --git a/reference/conanfile/tools/gnu/autotoolsgen.rst b/reference/conanfile/tools/gnu/autotoolsgen.rst new file mode 100644 index 000000000000..6f80cd45c273 --- /dev/null +++ b/reference/conanfile/tools/gnu/autotoolsgen.rst @@ -0,0 +1,58 @@ +AutotoolsGen +============ + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The ``AutotoolsGen`` is a complete generator for the whole autotools system. It aggregates the +functionality of ``AutotoolsDeps``, ``AutotoolsToolchain`` and ``VirtualEnv`` into a single generator. + +It will generate shell scripts containing environment variable definitions that the autotools build system can understand. + +The ``AutotoolsGen`` generator can be used by name in conanfiles: + +.. code-block:: python + :caption: conanfile.py + + class Pkg(ConanFile): + generators = "AutotoolsGen" + +.. code-block:: text + :caption: conanfile.txt + + [generators] + AutotoolsGen + +And it can also be fully instantiated in the conanfile ``generate()`` method: + +.. code:: python + + from conans import ConanFile + from conan.tools.gnu import AutotoolsGen + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + + def generate(self): + tc = AutotoolsGen(self) + tc.generate() + + +Its implementation is straightforward: + +.. code:: python + + class AutotoolsGen: + def __init__(self, conanfile): + self.toolchain = AutotoolsToolchain(conanfile) + self.deps = AutotoolsDeps(conanfile) + self.env = VirtualEnv(conanfile) + +And it will output the same files as ``VirtualEnv``: + +- *conanbuildenv* .bat or .sh scripts, that are automatically loaded if existing by the ``self.run()`` recipes methods +- *conanrunenv* .bat or .sh scripts, that can be explicitly opted-in in ``self.run()`` recipes methods with ``self.run(..., env=["conanrunenv"])`` + +These files will contain the necessary accumulated information from all the 3 internal generators. diff --git a/reference/conanfile/tools/gnu/autotoolstoolchain.rst b/reference/conanfile/tools/gnu/autotoolstoolchain.rst new file mode 100644 index 000000000000..a377558c2416 --- /dev/null +++ b/reference/conanfile/tools/gnu/autotoolstoolchain.rst @@ -0,0 +1,50 @@ +AutotoolsToolchain +================== + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The ``AutotoolsToolchain`` is the toolchain generator for Autotools. It will generate shell scripts containing +environment variable definitions that the autotools build system can understand. + +The ``AutotooAutotoolsToolchainlsDeps`` generator can be used by name in conanfiles: + +.. code-block:: python + :caption: conanfile.py + + class Pkg(ConanFile): + generators = "AutotoolsToolchain" + +.. code-block:: text + :caption: conanfile.txt + + [generators] + AutotoolsToolchain + +And it can also be fully instantiated in the conanfile ``generate()`` method: + +.. code:: python + + from conans import ConanFile + from conan.tools.gnu import AutotoolsToolchain + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + + def generate(self): + tc = AutotoolsToolchain(self) + tc.generate() + +The ``AutotoolsToolchain`` will generate after a ``conan install`` command the *conanautotoolstoolchain.sh* or *conanautotoolstoolchain.bat* files: + +.. code-block:: bash + + $ conan install conanfile.py # default is Release + $ source conanautotoolstoolchain.sh + # or in Windows + $ conanautotoolstoolchain.bat + +This generator will define aggregated variables ``CPPFLAGS``, ``LDFLAGS``, ``CXXFLAGS``, ``CFLAGS`` that +accumulate all dependencies information, including transitive dependencies, with flags like ``-stdlib=libstdc++``, ``-std=gnu14``, architecture flags, etc. diff --git a/reference/conanfile/tools/gnu/maketoolchain.rst b/reference/conanfile/tools/gnu/maketoolchain.rst new file mode 100644 index 000000000000..19faa00fe86a --- /dev/null +++ b/reference/conanfile/tools/gnu/maketoolchain.rst @@ -0,0 +1,188 @@ +.. _make_toolchain: + +MakeToolchain +------------- + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The `MakeToolchain` can be used in the ``generate()`` method of ``conanfile.py``: + +.. code:: python + + from conans import ConanFile + from conan.tools.gnu import MakeToolchain + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + options = {"shared": [True, False], "fPIC": [True, False]} + default_options = {"shared": False, "fPIC": True} + + def generate(self): + tc = MakeToolchain(self) + tc.generate() + + +The ``MakeToolchain`` will generate the following file during ``conan install`` +command (or before calling the ``build()`` method when the package is being +built in the cache): ``conan_toolchain.mak``. To use the variables generated by +Conan, include this file in your existing ``Makefile`` such as: + +.. code:: makefile + + include conan_toolchain.mak + +Or to make it optional: + + +.. code:: makefile + + -include conan_toolchain.mak + + +``conan_toolchain.mak`` will contain the definitions of all the Make variables +related to the Conan options and settings for the current package, platform, +etc. This includes but is not limited to the following: + +* Detection of target type: "executable", "shared" or "static" + + * Based on existance/value of a option named ``shared`` + + * Based on result, defines ``-shared`` linker flag + +* Detection of ``fPIC`` + + * Based on existance/value of a option named ``fPIC`` + + * Combines with detection of target type above + + * Sets ``-fPIC`` flag for compiler + + * Sets ``-fPIC`` flag for linker when building shared library + + * Sets ``-pie`` flag for linker when building executable + +* Detection of ``build_type`` from Conan settings + + * Sets -DNDEBUG flag for ``Release`` builds + +* Definition of the C++ standard as necessary + +* Definition of the standard library used for C++ + +* Definition of rpaths based on libpaths in conan cache + +**NOTE**: Simply including this file will have no effect on your ``Makefile`` +build. + +All variables in this file are prefixed with ``CONAN_TC_`` and so existing +makefiles will robably makes no references to variables with these names. Users +can modify their makefiles to make use of these variables by name. That is +certainly supported, however such a process tighly couples Makefiles to Conan +which can be undesirable, so Conan provides an alternative. There is list of +well-known "standard"/"conventional" variables used within **GnuMake**, +**Autotools**, and other related tools: + +`Gnu Make Well-Known Variables `_ + +The relevant content from the GnuMake manual is provided here for convenience: + + CFLAGS + Extra flags to give to the C compiler. + + CXXFLAGS + Extra flags to give to the C++ compiler. + + CPPFLAGS + Extra flags to give to the C preprocessor and programs that use it (the C and Fortran compilers). + + LDFLAGS Extra flags to give to compilers when they are supposed to invoke the + linker, ‘ld’, such as -L. Libraries (-lfoo) should be added to the LDLIBS + variable instead. + + LDLIBS + Library flags or names given to compilers when they are supposed to invoke the + linker, ‘ld’. LOADLIBES is a deprecated (but still supported) alternative to + LDLIBS. Non-library linker flags, such as -L, should go in the LDFLAGS + variable. + +To have the ``CONAN_TC_`` variables appended to these standard GnuMake +variables, simply add the following function call to your ``Makefile`` somewhere +after the ``include`` statement: + +* ``$(call CONAN_TC_SETUP)`` + +To be clear, this only has the desired "automatic" effect if your +``Makefile(s)`` all use of these standard variables in the conventional way. If +your ``Makefile(s)`` use custom variables, you would need to teach them to +append/include/use the ``CONAN_TC_`` variables manually. + +Also, while we are appending "standard" variables in a seemingly sensible way, +this function makes a lot of assumptions which are likely not going to hold true +in many environments. The goal is to make as much of the behavior configurable +as possible. Based on user requests, we will continue to add parameters to the +constructor. If you would like a behavior added to the list of configurable +items, please provide feedback at: https://github.com/conan-io/conan/issues + + +definitions ++++++++++++ + +This attribute allows defining preprocessor definitions the same way that build helpers do: + +.. code:: python + + def generate(self): + tc = MakeToolchain(self) + tc.preprocessor_definitions["MYVAR"] = "MyValue" + tc.generate() + +This will be translated to: + +- ``-DMYVAR=MYVAL`` being appended to the ``CONAN_TC_CPPFLAGS`` variable + + +generators +++++++++++ + +The ``MakeGenerator`` is being developed in-tandem with this toolchain because +ideally they would be used in the same recipes and workflows. They have +consistent conventions and strategy, however they are currently completely +independent from each other. Thus, you can use this toolchain without using the +``MakeGenerator``. + + +Using the toolchain in developer flow ++++++++++++++++++++++++++++++++++++++ + +One of the advantages of using Conan toolchains is that it provides +exact same "toolchain-related" variables that Conan will have within a recipe's +``build()`` method to the build system when the user calls the build system +directly in their workspace. This was not possible prior to Conan's toolchain +feature. Here's an example: + +.. code:: bash + + # Lets start in the folder containing a conanfile.py + # Add the toolchain method with the MakeToolchain as shown in the example + $ mkdir build && cd build + # Install both debug and release deps and create the toolchain + $ conan install .. + # Add the following lines to Makefile: + # -include build/conan_toolchain.mak + # $(call CONAN_TC_SETUP) + $ make + +**NOTE** As stated previously, this will only have the desired effect if the +``Makefile`` makes conventional use of the standard variables. + +We can actually achieve the same goal without modifying the ``Makefile`` at all, +it simply requires passing a few more parameters to **GnuMake**. + +.. code:: bash + + $ conan install .. + $ make -E='include build/conan_toolchain.mak' -E='$(call CONAN_TC_SETUP)' diff --git a/reference/conanfile/tools/meson.rst b/reference/conanfile/tools/meson.rst index b0753be27560..7879b48991d0 100644 --- a/reference/conanfile/tools/meson.rst +++ b/reference/conanfile/tools/meson.rst @@ -187,3 +187,9 @@ test() def test(self): Runs project's tests. Equivalent to running :command:`meson test -v -C .` in the build folder.. + +conf +++++ + +- ``tools.ninja:jobs`` argument for the ``--jobs`` parameter when running Ninja. (overrides + the general ``tools.build:processes``). diff --git a/reference/conanfile/tools/microsoft.rst b/reference/conanfile/tools/microsoft.rst index 163af330f23c..55d9a80121e4 100644 --- a/reference/conanfile/tools/microsoft.rst +++ b/reference/conanfile/tools/microsoft.rst @@ -64,13 +64,15 @@ above: This is a multi-configuration generator, and will generate different files for the different Debug/Release configuration. The above commands the following files will be generated: -- *conan_zlib_release_x64.props*: Properties file for the ``zlib`` dependency, Release config -- *conan_zlib_debug_x64.props*: Properties file for the ``zlib`` dependency, Debug config +- *conan_zlib_vars_release_x64.props*: ``Conanzlibxxxx`` variables definitions for the ``zlib`` dependency, Release config, like ``ConanzlibIncludeDirs``, ``ConanzlibLibs``, etc. +- *conan_zlib_vars_debug_x64.props*: Same ``Conanzlib``variables for ``zlib`` dependency, Debug config +- *conan_zlib_release_x64.props*: Activation of ``Conanzlibxxxx`` variables in the current build as standard C/C++ build configuration, Release config. This file contains also the transitive dependencies definitions. +- *conan_zlib_debug_x64.props*: Same activation of ``Conanzlibxxxx`` variables, Debug config, also inclusion of transitive dependencies. - *conan_zlib.props*: Properties file for ``zlib``. It conditionally includes, depending on the configuration, - one of the above Release/Debug properties files. -- Same 3 files will be generated for every dependency in the graph, in this case ``conan_bzip.props`` too, which + one of the two immediately above Release/Debug properties files. +- Same 5 files will be generated for every dependency in the graph, in this case ``conan_bzip.props`` too, which will conditionally include the Release/Debug bzip properties files. -- *conan_deps.props*: Properties files including all direct dependencies, in this case, it includes ``conan_zlib.props`` +- *conandeps.props*: Properties files including all direct dependencies, in this case, it includes ``conan_zlib.props`` and ``conan_bzip2.props`` You will be adding the *conan_deps.props* to your solution project files if you want to depend on all the declared @@ -109,6 +111,21 @@ This will manage to generate new properties files for this custom configuration, in the IDE allows to be switching dependencies configuration like Debug/Release, it could be also switching dependencies from static to shared libraries. +Included dependencies ++++++++++++++++++++++ + +``MSBuildDeps`` uses the new experimental ``self.dependencies`` access to dependencies. The following +dependencies will be translated to properties files: + +- All direct dependencies, that is, the ones declared by the current ``conanfile``, that lives in the + host context: all regular ``requires``, plus the ``build_requires`` that are in the host context, + for example test frameworks as ``gtest`` or ``catch``. +- All transitive ``requires`` of those direct dependencies (all in the host context) + +Then, the ``build_requires`` of build context (like ``cmake`` packages as build_requires), plus the +transitive ``build_requires`` (irrespective of the context) are not translated to properties files, +as they shouldn't be necessary for the build. + MSBuildToolchain ---------------- @@ -146,7 +163,7 @@ And it can also be fully instantiated in the conanfile ``generate()`` method: tc.generate() -The ``MSBuildToolchain`` will generate two files after a ``conan install`` command: +The ``MSBuildToolchain`` will generate three files after a ``conan install`` command: .. code-block:: bash @@ -158,6 +175,10 @@ The ``MSBuildToolchain`` will generate two files after a ``conan install`` comma - A *conantoolchain_.props* file, that will be conditionally included from the previous *conantoolchain.props* file based on the configuration and platform, e.g.: *conantoolchain_release_x86.props* +- A *conanvcvars.bat* file with the necessary ``vcvars`` invocation to define the build environment if necessary + to build from the command line or from automated tools (might not be necessary if opening the IDE). This file + will be automatically called by the ``tools.microsoft.MSBuild`` helper ``build()`` method. + Every invocation to ``conan install`` with different configuration will create a new properties ``.props`` file, that will also be conditionally included. This allows to install different configurations, @@ -210,5 +231,5 @@ Where: conf ++++ -- ``tools.microsoft:msbuild_verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed +- ``tools.microsoft.msbuild:verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed to the ``MSBuild.build()`` call as ``msbuild .... /verbosity:XXX`` diff --git a/reference/config_files/global_conf.rst b/reference/config_files/global_conf.rst index ba26cc4f34dc..be1f3a423fb0 100644 --- a/reference/config_files/global_conf.rst +++ b/reference/config_files/global_conf.rst @@ -30,11 +30,29 @@ have priority over globally defined ones in *global.conf*, and can be defined as ... [conf] - tools.microsoft:msbuild_verbosity=Diagnostic - + tools.microsoft.msbuild:verbosity=Diagnostic + tools.microsoft.msbuild:max_cpu_count=20 + tools.microsoft.msbuild:vs_version = 16 + tools.build:processes=10 + tools.ninja:jobs=30 + tools.gnu.make:jobs=40 Existing configurations: -- ``tools.microsoft:msbuild_verbosity`` allows defining a value from ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` for build using the - MSBuild system, it could be with the ``tools.microsoft.MSBuild`` or with the ``tools.cmake.CMake`` helpers. +- ``tools.microsoft.msbuild:verbosity`` allows defining a value from ``"Quiet", "Minimal", "Normal", + "Detailed", "Diagnostic"`` for build using the + MSBuild system, it could be with the ``tools.microsoft.MSBuild`` or with the ``tools.cmake.CMake`` + helpers. + +- ``tools.microsoft.msbuild:max_cpu_count`` argument for the ``/m`` (``/maxCpuCount``) when running + ``MSBuild`` standalone or via CMake (overrides the general ``tools.build:processes``). + +- ``tools.microsoft.msbuild:vs_version`` defines the compiler version when using using the new ``msvc`` compiler. + +- ``tools.build:processes``: number of processes to use for every build-helper. + +- ``tools.ninja:jobs`` argument for the ``--jobs`` parameter when running Ninja generator via CMake + or Meson. (overrides the general ``tools.build:processes``). +- ``tools.gnu.make:jobs``: argument for the ``--jobs`` parameter when running ``make`` + (overrides the general ``tools.build:processes``). diff --git a/reference/config_files/settings.yml.rst b/reference/config_files/settings.yml.rst index 77e51210a5f2..ea75a09f94ae 100644 --- a/reference/config_files/settings.yml.rst +++ b/reference/config_files/settings.yml.rst @@ -152,8 +152,31 @@ The new ``msvc`` compiler is a new, **experimental** one, that is intended to de - It is only used by the new build integrations in :ref:`conan_tools_cmake` and :ref:`conan_tools_microsoft`, but not the previous ones. - At the moment it implements a ``compatible_packages`` fallback to Visual Studio compiled packages, that is, previous existing binaries compiled with ``settings.compiler="Visual Studio"`` can be used for the ``msvc`` compiler if no binaries exist for it yet. + This behavior can be opted-out with ``core.package_id:msvc_visual_incompatible`` :ref:`global_conf` configuration. - It is not detected by the profile auto-detect, it needs to explicitly be defined in profiles. +When using the ``msvc`` compiler, the Visual Studio toolset version (the actual ``vcvars`` activation and ``MSBuild`` location) will be +defined by the default provide of that compiler version: + +- ``msvc`` compiler version '19.0': Visual Studio 14 2015 +- ``msvc`` compiler version '19.1': Visual Studio 15 2017 +- ``msvc`` compiler version '19.2': Visual Studio 16 2019 + +This can be configured in your profiles with the ``tools.microsoft.msbuild:vs_version`` configuration: + +.. code-block:: text + + [settings] + compiler=msvc + compiler.version=19.0 + + [conf] + tools.microsoft.msbuild:vs_version = 16 + + +In this case, the ``vcvars`` will activate the Visual Studio 16 installation, but the ``19.0`` compiler version will still be used +because the necessary ``toolset=v140`` will be set. + Architectures ------------- diff --git a/reference/env_vars.rst b/reference/env_vars.rst index 0e0d094b26de..71de2bb63d8d 100644 --- a/reference/env_vars.rst +++ b/reference/env_vars.rst @@ -477,7 +477,7 @@ or declared in command line when invoking :command:`conan install` to reduce the See how to retrieve the value with :ref:`tools.get_env() ` and check a use case with :ref:`a header only with unit tests recipe ` while cross building. -See example of build method in ``conanfile.py`` to enable/disable running tests with CMake: +This variable is evaluated inside the build helper call to ``test()`` and will not run the tests if set to ``False``. .. code-block:: python @@ -491,8 +491,7 @@ See example of build method in ``conanfile.py`` to enable/disable running tests cmake = CMake(self) cmake.configure() cmake.build() - if tools.get_env("CONAN_RUN_TESTS", True): - cmake.test() + cmake.test() .. _env_vars_conan_skip_vs_project_upgrade: diff --git a/versioning/lockfiles/bundle.rst b/versioning/lockfiles/bundle.rst index 6f64630d7170..c6382fb88091 100644 --- a/versioning/lockfiles/bundle.rst +++ b/versioning/lockfiles/bundle.rst @@ -195,5 +195,7 @@ updated package revision and status. The ``conan lock bundle update`` does this - Scan all connected lockfiles for every ``ref`` recipe reference and ``package_id``, and collect those that have been modified. - Propagate the modified information to all the other connected lockfiles. -After ``conan lock bundle update``, all packages sharing the same reference and ``package_id`` should have the same status (marked -"modified" and same package revision) +After ``conan lock bundle update``, all packages sharing the same reference and ``package_id`` should +have the same status (marked "modified" and same package revision). The "modified" state for the +lockfile bundles can be cleaned using the command ``conan lock bundle clean-modified`` that will +clean that flag from both the *.bundle* file and the individual *.lock* files. diff --git a/versioning/lockfiles/ci.rst b/versioning/lockfiles/ci.rst index 66ee33cb39f8..ca03de01a8e2 100644 --- a/versioning/lockfiles/ci.rst +++ b/versioning/lockfiles/ci.rst @@ -259,3 +259,17 @@ product packages without problems. When the Pull Request is merged there might b than the source used in this CI job. Then it is necessary to fire again a new job that will build these packages. - If the merge is a clean fast-forward, then the packages that were built in this job would be valid, and could be copied from the repository ``conan-build`` to the ``conan-develop``. + +After the ``app1`` lockfile is created it could be possible to install all the binaries referenced in +that lockfile using the :command:`conan lock install`: + +.. code:: bash + + $ conan lock install app1_release_updated.lock -g deploy + +It is also possible to use this command for just installing the recipes but not the binaries adding +the ``--recipes`` argument: + +.. code:: bash + + $ conan lock install app1_release_updated.lock --recipes diff --git a/versioning/lockfiles/introduction.rst b/versioning/lockfiles/introduction.rst index b28de62a648b..4018143171b2 100644 --- a/versioning/lockfiles/introduction.rst +++ b/versioning/lockfiles/introduction.rst @@ -213,9 +213,14 @@ And if we inspect the new *locks/pkgb.lock* file: ... } -It can be appreciated in *locks/pkgb.lock* that now ``pkgb/0.1@user/testing`` is fully locked, as a package (not a local *conanfile.py*), -and contains a ``package_id``. So if we try to use this new file for creating the package again, it will error, -as a package that is fully locked cannot be rebuilt: +Note that some fields of the lockfile are now completed, as the modified flag, that indicates that +``pkgb`` was built in the conan create command. That information can be useful in the CI environment +to know which packages were built by different jobs. Those modified flags can be reset using the +:command:`conan lock clean-modified`. +Also, it can be appreciated in *locks/pkgb.lock* that now ``pkgb/0.1@user/testing`` is fully locked, as a +package (not a local *conanfile.py*), and contains a ``package_id``. So if we try to use this new +file for creating the package again, it will error, as a package that is fully locked cannot be +rebuilt: .. code-block:: bash From f0c168e97192d3b823603f97005cfb0e32cd5264 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 30 Mar 2021 19:38:00 +0200 Subject: [PATCH 091/681] Merge master develop 1.35.0 (#2064) * Update lockfile bundle docs for 1.34.1 (#2040) * Update lockfile bundle docs for 1.34.1 * Remove erroneous colon Co-authored-by: Carlos Zoido * Release/1.35.0 (#2063) * buildroot.rst: Fix a typo (#1996) Artifatory --> Artifactory * - meson : add target argument (#2011) Signed-off-by: SSE4 * Update develop with master (#2020) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner * Fix multiple minor spelling mistakes (#2019) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix multiple minor spelling mistakes * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: Carlos Zoido * Rename QbsToolchain to QbsProfile (#2027) * Rename QbsToolchain to QbsProfile * Rename use_profile to profile * conan_v2_error update (#2031) * lock bundle (#2030) * lock bundle * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido Co-authored-by: Carlos Zoido * Merge master to develop (#2033) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido * Remove misleading message about ConanCenter in shared_library_package_id() (#2000) * Update yocto docs (#2022) * Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner Co-authored-by: Daniel Co-authored-by: Uilian Ries * Merge master to develop (#2036) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido * Remove misleading message about ConanCenter in shared_library_package_id() (#2000) * Update yocto docs (#2022) * Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido * Release 1.34.0 (#2035) * buildroot.rst: Fix a typo (#1996) Artifatory --> Artifactory * - meson : add target argument (#2011) Signed-off-by: SSE4 * Update develop with master (#2020) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner * Fix multiple minor spelling mistakes (#2019) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix multiple minor spelling mistakes * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: Carlos Zoido * Rename QbsToolchain to QbsProfile (#2027) * Rename QbsToolchain to QbsProfile * Rename use_profile to profile * conan_v2_error update (#2031) * lock bundle (#2030) * lock bundle * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido * Update versioning/lockfiles/bundle.rst Co-authored-by: Carlos Zoido Co-authored-by: Carlos Zoido * release 1.34.0 * fix changelog * Merge master to release branch (#2034) * fix lowercase package names (#2013) * remove training banner (#2015) * Fix incorrect indentation in define_abi_compatibility.rst (#2017) * Fix spelling (#2018) Co-authored-by: Carlos Zoido * Remove misleading message about ConanCenter in shared_library_package_id() (#2000) * Update yocto docs (#2022) * Troubleshooting: How to fix incompatible requirements (#2016) * How to solve incompatible requirements Signed-off-by: Uilian Ries * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst Co-authored-by: Carlos Zoido * Update faq/troubleshooting.rst * Fix bad indentation Signed-off-by: Uilian Ries Co-authored-by: Carlos Zoido Co-authored-by: James Co-authored-by: chausner Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: rico-chet Co-authored-by: SSE4 Co-authored-by: James Co-authored-by: chausner Co-authored-by: Psy-Kai Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: James Co-authored-by: chausner Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: rico-chet Co-authored-by: SSE4 Co-authored-by: Psy-Kai * update constrained settings example error message (#2032) * Make the instructions in the note about gcc libcxx ABI compatibility more explicit. (#2037) * More explicit instructions on the Getting Started page * Provide a command to check gccs default configuration value on the Manage gcc >= 5 ABI page. * - document custom template definitions (#2051) Signed-off-by: SSE4 * Docs for lockfiles features from 1.35 (#2053) * modify command reference * update lock reference * wip * document clean-modified for lockfiles * update bundle docs * document conan lock install * Docs for automatically handle CONAN_RUN_TESTS environment variable (#2056) * wip * wip * update bh docs * Add docs for CMAKE_SH and data in cmakedeps (#2055) * Add docs for CMAKE_SH and data in cmakedeps * remove note box * Update lockfile bundle docs for 1.34.1 (#2040) (#2058) * Update lockfile bundle docs for 1.34.1 * Remove erroneous colon Co-authored-by: Carlos Zoido Co-authored-by: Jerry Wiltse * update cconf (#2059) * add confs (#2061) * docs for new msbuilddeps transitivity (#2052) * docs for new msbuilddeps transitivity * fix ci Co-authored-by: czoido * add docs for patches (#2062) * autotools docs (#2057) * autotools docs * add marker Co-authored-by: czoido * Feature/tools virtualenv (#2060) * add virtualenv and environment docs * removing env from .gitignore * fix contents Co-authored-by: czoido * [conf] to define vs version for msvc (#2054) * [conf] to define vs version for msvc * notes about ``conanvcvars.bat`` file creation * fix ci * Update reference/config_files/settings.yml.rst Co-authored-by: Carlos Zoido * add to conf Co-authored-by: Carlos Zoido * version 1.35.0 * update changelog Co-authored-by: rico-chet Co-authored-by: SSE4 Co-authored-by: James Co-authored-by: chausner Co-authored-by: Psy-Kai Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: melak47 Co-authored-by: jsinge Co-authored-by: Jerry Wiltse Co-authored-by: Jerry Wiltse Co-authored-by: rico-chet Co-authored-by: SSE4 Co-authored-by: James Co-authored-by: chausner Co-authored-by: Psy-Kai Co-authored-by: Daniel Co-authored-by: Uilian Ries Co-authored-by: melak47 Co-authored-by: jsinge --- .ci/publish.jenkins | 1 + changelog.rst | 45 ++++++++++++++++++++++++++++++++++++++++++++- conf.py | 4 ++-- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index 227425f6dc0c..34b3c44a8cb3 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,6 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ + 'release/1.35.0': '1.35', 'release/1.34.1': '1.34', 'release/1.33.1': '1.33', 'release/1.32.1': '1.32', diff --git a/changelog.rst b/changelog.rst index 15bf8390c342..7360b240c7e3 100644 --- a/changelog.rst +++ b/changelog.rst @@ -18,9 +18,52 @@ Check https://github.com/conan-io/conan for issues and more details about develo .. important:: - Conan 1.34 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please + Conan 1.35 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.35.0 (30-Mar-2021) +-------------------- + +- Feature: ``MSBuildDeps`` generator uses new visitor model and handles conditional requirements correctly. `#8733 `_ . Docs `here `__ +- Feature: CMake toolchain supports include_guard() feature `#8728 `_ +- Feature: New ``conan lock bundle clean-modified`` command. `#8726 `_ . Docs `here `__ +- Feature: Use ``conancvvars.bat`` file for Meson toolchain `#8719 `_ +- Feature: Allow arbitrary defines in :command:`conan new` templates. `#8718 `_ . Docs `here `__ +- Feature: Automatically handle `CONAN_RUN_TESTS` to avoid extra boilerplate. `#8687 `_ . Docs `here `__ +- Feature: More fine-grained control (using [conf]) for build parallelization. `#8665 `_ . Docs `here `__ +- Feature: Add support for testing with different tools versions. `#8656 `_ +- Feature: Add different CMake versions for testing. `#8656 `_ +- Feature: Move the definition of CMakeDeps variables to its own file `#8655 `_ . Docs `here `__ +- Feature: Added `conan.tools.files.patch` to apply a single patch (new interface for legacy `conans.tools.patch` function. `#8650 `_ . Docs `here `__ +- Feature: Added `conan.tools.files.apply_conandata_patches` to apply patches defined in `conandata.yml`. `#8650 `_ . Docs `here `__ +- Feature: Allow integers as ``preprocessor_definitions`` in ``CMakeToolchain``. `#8645 `_ +- Feature: New ``Environment`` model for recipes and profiles `#8630 `_ . Docs `here `__ +- Feature: Do not remove sh from the path in the new CMake helper. `#8625 `_ . Docs `here `__ +- Feature: Allow definition of custom Visual Studio version for msvc compiler in MSBuild helpers. `#8603 `_ . Docs `here `__ +- Feature: MSBuildToolchain creates conanvcvars.bat containing vcvars command for command line building. `#8603 `_ . Docs `here `__ +- Feature: Set `CMAKE_FIND_PACKAGE_PREFER_CONFIG=ON`. `#8599 `_ +- Feature: Include the recipe name when constrained settings prevent install. `#8559 `_ . Docs `here `__ +- Feature: Create new conan.tools.files for 2.0. `#8550 `_ +- Feature: New AutotoolsDeps, AutotoolsToolchain helpers in conan.tools.gnu `#8457 `_ . Docs `here `__ +- Feature: Experimental ``conan lock install`` that can install a lockfile in the cache, all the binaries or only the recipes with ``--recipes``, intended for CI flows. `#8021 `_ . Docs `here `__ +- Fix: Fix incorrect output of ``default_user`` and ``default_channel`` in ``export``. `#8732 `_ +- Fix: remotes not being loaded for the :command:`conan alias` command, which was preventing :command:`conan alias` from working if python_requires is used. `#8704 `_ +- Fix: Improve error message for ``lock create`` providing a path instead of full path with filename. `#8695 `_ +- Fix: Rename `tools.microsoft:msbuild_verbosity` to `tools.microsoft.msbuild:verbosity` `#8692 `_ . Docs `here `__ +- Fix: Simplifications to ``CMakeDeps`` generator to remove legacy code. `#8666 `_ +- Fix: Add dirty management in download cache, so interrupted downloads doesn't need a manual cleaning of such download cache. `#8664 `_ +- Fix: Build helper qbs install now installs directly into package_folder. `#8660 `_ +- Fix: Allow arbitrary template structure. `#8641 `_ +- Fix: Restoring the behavior that `exports` and `exports_sources` were case sensitive by default. `#8585 `_ +- Fix: Remove default dummy value for iOS XCode signature. `#8576 `_ +- Fix: Do not order Settings lists, so error messages are in declared order. `#8573 `_ +- BugFix: Command :command:`conan new` accepts short reference with address sign. `#8721 `_ +- Bugfix: Fix profile definitions of env-vars per-package using patterns, not only the package name. `#8688 `_ +- Bugfix: Preserve the explicit value `None` for SCM attributes if the default is a different value. `#8622 `_ +- Bugfix: Properly detect Amazon Linux 2 distro. `#8612 `_ +- Bugfix: Fix config install not working when .git* folder is in the path. `#8605 `_ +- Bugfix: Fix: Transitive python requires not working with the new syntax. `#8604 `_ + 1.34.1 (10-Mar-2021) -------------------- diff --git a/conf.py b/conf.py index 9c92c37dfa9c..f14f73f79a4d 100644 --- a/conf.py +++ b/conf.py @@ -41,9 +41,9 @@ ] # The short X.Y version. -version = "1.34" +version = "1.35" # The full version, including alpha/beta/rc tags. -release = u'1.34.1' +release = u'1.35.0' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): From 1e143f8128d95ba570dd465096a15221a16fab39 Mon Sep 17 00:00:00 2001 From: Jerry Wiltse Date: Wed, 31 Mar 2021 12:32:05 -0400 Subject: [PATCH 092/681] add banner about bintray sunset pointing to blog post --- _themes/conan/layout.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_themes/conan/layout.html b/_themes/conan/layout.html index 45d11fde4e7f..df267f14b055 100644 --- a/_themes/conan/layout.html +++ b/_themes/conan/layout.html @@ -158,11 +158,11 @@ {% include "breadcrumbs.html" %} - +

JFrog Bintray is being sunset. Please refer this blog post for more detail. +

{% block body %}{% endblock %} From 2e84f95dc898d9a55555cdd53a0b2bf5ae2f7637 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Wed, 7 Apr 2021 11:57:38 -0300 Subject: [PATCH 093/681] Update config_install_interval description Signed-off-by: Uilian Ries --- reference/commands/consumer/config.rst | 8 +++++++- reference/config_files/conan.conf.rst | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/reference/commands/consumer/config.rst b/reference/commands/consumer/config.rst index 8957d3879903..e45f8583d659 100644 --- a/reference/commands/consumer/config.rst +++ b/reference/commands/consumer/config.rst @@ -67,6 +67,12 @@ Used to edit conan.conf, or install config files. $ conan config init --force +- Set config install scheduler for every 1 week: + + .. code-block:: bash + + $ conan config set general.config_install_interval=1w + .. _conan_config_install: conan config install @@ -204,7 +210,7 @@ Conan runs it based on *config_install.json*, including the timestamp of the las .. code-block:: bash $ conan config install my_settings\settings.yml - + - Install the configuration from a local path: .. code-block:: bash diff --git a/reference/config_files/conan.conf.rst b/reference/config_files/conan.conf.rst index 70db4c87eaec..a52c165e4df4 100644 --- a/reference/config_files/conan.conf.rst +++ b/reference/config_files/conan.conf.rst @@ -222,7 +222,8 @@ this value using the environment variable ``CONAN_SCM_TO_CONANDATA``. The ``skip_broken_symlinks_check`` variable (defaulted to ``False``) allows the existence broken symlinks while creating a package. The ``config_install_interval`` variable starts a time scheduler which runs :command:`conan config install` according the time interval -configured. It only accepts the follow time intervals: minutes, hours and days. +configured. It only accepts the follow time intervals: seconds, minutes, hours, days and weeks (e.g 10s, 35m, 48h, 1d, 2w). Empty unit and +not listed units are not acceptable, they are consired an error and will be removed automatically on next execution. The ``required_conan_version`` variable validates if the current Conan client version is valid according to its version. When it's not according to the required version or its range, Conan raises an exception before running any command. It accepts SemVer format, including version range. From d3885007289b03d89b38a4d0beb45a13fd026aaa Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 13 Apr 2021 09:30:03 +0200 Subject: [PATCH 094/681] release 1.35.1 --- .ci/publish.jenkins | 2 +- changelog.rst | 8 ++++++++ conf.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index 34b3c44a8cb3..64454aa60415 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,7 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ - 'release/1.35.0': '1.35', + 'release/1.35.1': '1.35', 'release/1.34.1': '1.34', 'release/1.33.1': '1.33', 'release/1.32.1': '1.32', diff --git a/changelog.rst b/changelog.rst index 7360b240c7e3..7722370c6807 100644 --- a/changelog.rst +++ b/changelog.rst @@ -21,6 +21,14 @@ Check https://github.com/conan-io/conan for issues and more details about develo Conan 1.35 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.35.1 (13-Apr-2021) +-------------------- + +- Fix: Avoid breaking users calling forbidden private api ``conanfile.__init__``. `#8746 `_ +- Bugfix: Fix opensuse SystemPackageTools incorrectly using apt-get when zypper-aptitude. `#8747 `_ +- Bugfix: Fix linker flags in cmake (find_package based) generators. `#8740 `_ +- Bugfix: Fixed bug in transitive build_requires of MSBuildDeps. `#8734 `_ + 1.35.0 (30-Mar-2021) -------------------- diff --git a/conf.py b/conf.py index f14f73f79a4d..2aeb4f698b9a 100644 --- a/conf.py +++ b/conf.py @@ -43,7 +43,7 @@ # The short X.Y version. version = "1.35" # The full version, including alpha/beta/rc tags. -release = u'1.35.0' +release = u'1.35.1' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): From a2e64c1cf4eee2497d24caf2e486b245f4a5bea2 Mon Sep 17 00:00:00 2001 From: czoido Date: Mon, 19 Apr 2021 18:32:10 +0200 Subject: [PATCH 095/681] release 1.35.2 --- .ci/publish.jenkins | 2 +- changelog.rst | 5 +++++ conf.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index 64454aa60415..a739d1260764 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,7 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ - 'release/1.35.1': '1.35', + 'release/1.35.2': '1.35', 'release/1.34.1': '1.34', 'release/1.33.1': '1.33', 'release/1.32.1': '1.32', diff --git a/changelog.rst b/changelog.rst index 7722370c6807..6ac71527c1f9 100644 --- a/changelog.rst +++ b/changelog.rst @@ -21,6 +21,11 @@ Check https://github.com/conan-io/conan for issues and more details about develo Conan 1.35 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.35.2 (19-Apr-2021) +-------------------- + +- Bugfix: Revert regression that replaces first ``/`` by ``-`` in ``cpp_info.xxxxlinkflags`` in _CMake_ generators because it can break passing objects and other paths that start with ``/``. `#8812 `_ + 1.35.1 (13-Apr-2021) -------------------- diff --git a/conf.py b/conf.py index 2aeb4f698b9a..fb672ade807e 100644 --- a/conf.py +++ b/conf.py @@ -43,7 +43,7 @@ # The short X.Y version. version = "1.35" # The full version, including alpha/beta/rc tags. -release = u'1.35.1' +release = u'1.35.2' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): From 9057c6cf40fa626ff76d2cb0fb52b0d3de8e62fc Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 21 Apr 2021 19:11:50 +0200 Subject: [PATCH 096/681] faq git servers --- faq/using.rst | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/faq/using.rst b/faq/using.rst index ecc7e26269be..ef724856bb5e 100644 --- a/faq/using.rst +++ b/faq/using.rst @@ -15,6 +15,30 @@ When to use settings or options? While creating a package, you may want to add different configurations and variants of the package. There are two main inputs that define packages: settings and options. Read more about them in :ref:`this section`. + +Can Conan use git repositories as package servers? +-------------------------------------------------- + +Or put it with other words, can a conan recipe define requirements something like ``requires="git://github.com/someuser/somerepo.git#sometag"``? + +No, it is not possible. There are several technical reasons for this, mainly around the dependency resolution algorithm, but also about performance: + +- Conan manages dependency versions conflicts. These can be efficiently handled from the abstract reference quickly, while a git repo reference would require cloning contents even before deciding. +- The version overriding mechanism from downstream consumers to resolve conflicts cannot be implemented either with git repos, as both the name and the version of the package is not defined. +- Conan support version-ranges, like depending on ``boost/[>1.60 <1.70]``. This is basically impossible to implement in git repos. +- Conan has an “update” concept, that allows to query servers for latest modifications, latest versions, or even latest revisions, which would not work at all with git repos either. +- Binary management is one of the biggest advantages of Conan. Obviously, it is not possible to manage binaries for this case either. + +In summary, whatever could be done would be an extremely limited solution, very likely inefficient and much slower, with a lot of corner cases and rough edges around those said limitations. It would require a big development effort, and the compounded complexity it would induce in the codebase is a liability that will slow down future development, maintenance and support efforts. + +Besides the impossibility on the technical side, there are also other reasons like well known best practices around package management and modern devops in other languages that show evidence that even if this approach looks like convenient, it should be discouraged in practice: + +- Packages should be fully relocatable to a different location. Users should be able to retrieve their dependencies and upload a copy to their own private server, and fully disconnect from the external world. This is critical for robust and secure production environments, and avoid problems that other ecosystems like NPM have had in the past. As a consequence, all recipes dependencies should not be coupled to any location, and be abstract as conan "requires" are. +- Other languages, like Java (which would be the closest one regarding enterprise-ness), never provided this feature. Languages like golang, that based its dependency management on this feature, has also evolved away from it and towards abstract "module" concepts that can be hosted in different servers + +So there are no plans to support this approach, and the client-server architecture will continue to be the proposed solution. There are several alternatives for the servers from different vendors, for public open source packages `ConanCenter `_ is the recommended one, and for private packages, the free `ArtifactoryCE `_ is a simple and powerful solution. + + How to obtain the dependents of a given package? ------------------------------------------------ @@ -90,9 +114,9 @@ In the case of the ```` term, normally OSS package creators use ``testi only in few configurations) and ``stable`` when the recipe is ready enough to be used (e.g. it is built and tested in a wide range of configurations). -From the perspective of a library developer, channels could be used to create different scopes of your library. For example, use ``rc`` -channel for release candidates, maybe ``experimental`` for those kind of features, or even ``qa``/``testing`` before the library is checked -by QA department or testers. +It is strongly recommended that packages are considered immutable. Once a package has been created with a user/channel, it shouldn't be +changed. Instead, a new package with a new user/channel should be created. + What does "outdated from recipe" mean exactly? ---------------------------------------------- @@ -118,6 +142,9 @@ recipe. That means: if the recipe has completely removed an option (it could be that were generated previously with that option, those packages will be impossible to install as their package ID are calculated from the recipe file (and that option does not exist anymore). +When using "revisions" (it is opt-in in Conan 1.X, but it will be always enabled in Conan 2.0), this should never happen, as doing any change +to a recipe or source should create a new revision that will contain its own binaries. + How to configure the remotes priority order ------------------------------------------- From e1e80f3b5648e7b8f8d17749287dbf07db33f453 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Mon, 26 Apr 2021 11:34:41 -0300 Subject: [PATCH 097/681] Add conan config list command Signed-off-by: Uilian Ries --- reference/commands/consumer/config.rst | 9 ++++++++- reference/config_files/global_conf.rst | 6 ++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/reference/commands/consumer/config.rst b/reference/commands/consumer/config.rst index 8957d3879903..2e9e2051b628 100644 --- a/reference/commands/consumer/config.rst +++ b/reference/commands/consumer/config.rst @@ -28,6 +28,7 @@ Used to edit conan.conf, or install config files. rm Remove an existing config element set Set a value for a configuration item init Initializes Conan configuration files + list List Conan configuration properties optional arguments: -h, --help show this help message and exit @@ -67,6 +68,12 @@ Used to edit conan.conf, or install config files. $ conan config init --force +- List all possible properties allowed for :ref:`global.conf` + + .. code-block:: bash + + $ conan config list + .. _conan_config_install: conan config install @@ -204,7 +211,7 @@ Conan runs it based on *config_install.json*, including the timestamp of the las .. code-block:: bash $ conan config install my_settings\settings.yml - + - Install the configuration from a local path: .. code-block:: bash diff --git a/reference/config_files/global_conf.rst b/reference/config_files/global_conf.rst index be1f3a423fb0..eed51263f63d 100644 --- a/reference/config_files/global_conf.rst +++ b/reference/config_files/global_conf.rst @@ -52,7 +52,9 @@ Existing configurations: - ``tools.build:processes``: number of processes to use for every build-helper. - ``tools.ninja:jobs`` argument for the ``--jobs`` parameter when running Ninja generator via CMake - or Meson. (overrides the general ``tools.build:processes``). + or Meson. (overrides the general ``tools.build:processes``). -- ``tools.gnu.make:jobs``: argument for the ``--jobs`` parameter when running ``make`` +- ``tools.gnu.make:jobs``: argument for the ``--jobs`` parameter when running ``make`` (overrides the general ``tools.build:processes``). + +To list all possible configurations available, run :command:`conan config list`. From 054a3e746fed9bcf2452510feac0adc260fe57df Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Tue, 27 Apr 2021 11:55:23 -0300 Subject: [PATCH 098/681] Grammer improvement Co-authored-by: Carlos Zoido --- reference/config_files/conan.conf.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reference/config_files/conan.conf.rst b/reference/config_files/conan.conf.rst index a52c165e4df4..ea4971a701ff 100644 --- a/reference/config_files/conan.conf.rst +++ b/reference/config_files/conan.conf.rst @@ -222,8 +222,7 @@ this value using the environment variable ``CONAN_SCM_TO_CONANDATA``. The ``skip_broken_symlinks_check`` variable (defaulted to ``False``) allows the existence broken symlinks while creating a package. The ``config_install_interval`` variable starts a time scheduler which runs :command:`conan config install` according the time interval -configured. It only accepts the follow time intervals: seconds, minutes, hours, days and weeks (e.g 10s, 35m, 48h, 1d, 2w). Empty unit and -not listed units are not acceptable, they are consired an error and will be removed automatically on next execution. +configured. It only accepts the follow time intervals: seconds, minutes, hours, days and weeks (e.g 10s, 35m, 48h, 1d, 2w). Empty units or not listed units are not valid, they are considered an error and will be removed automatically on the next execution. The ``required_conan_version`` variable validates if the current Conan client version is valid according to its version. When it's not according to the required version or its range, Conan raises an exception before running any command. It accepts SemVer format, including version range. From 268c75fc4a91f9eafbff44c147866e500263198d Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Tue, 27 Apr 2021 12:04:46 -0300 Subject: [PATCH 099/681] Update command help Signed-off-by: Uilian Ries --- reference/commands/consumer/install.rst | 11 +++++++---- reference/commands/creator/create.rst | 11 +++++++---- reference/commands/creator/test.rst | 11 +++++++---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/reference/commands/consumer/install.rst b/reference/commands/consumer/install.rst index acf658e3855a..da925215e05a 100644 --- a/reference/commands/consumer/install.rst +++ b/reference/commands/consumer/install.rst @@ -81,10 +81,13 @@ generators. built from source. --build=[pattern] Build packages from source whose package reference matches the pattern. The pattern uses 'fnmatch' style wildcards. - Default behavior: If you omit the '--build' option, - the 'build_policy' attribute in conanfile.py will be - used if it exists, otherwise the behavior is like '-- - build=never'. + --build=![pattern] Excluded packages, which will not + be built from the source, whose package reference + matches the pattern. The pattern uses 'fnmatch' style + wildcards. Default behavior: If you omit the '--build' + option, the 'build_policy' attribute in conanfile.py + will be used if it exists, otherwise the behavior is + like '--build=never'. -r REMOTE, --remote REMOTE Look in the specified remote server -u, --update Will check the remote and in case a newer version diff --git a/reference/commands/creator/create.rst b/reference/commands/creator/create.rst index c5f3428c2f00..3f514e488193 100644 --- a/reference/commands/creator/create.rst +++ b/reference/commands/creator/create.rst @@ -87,10 +87,13 @@ to know more about 'test_folder' project. built from source. --build=[pattern] Build packages from source whose package reference matches the pattern. The pattern uses 'fnmatch' style wildcards. - Default behavior: If you omit the '--build' option, - the 'build_policy' attribute in conanfile.py will be - used if it exists, otherwise the behavior is like '-- - build=package name'. + --build=![pattern] Excluded packages, which will not + be built from the source, whose package reference + matches the pattern. The pattern uses 'fnmatch' style + wildcards. Default behavior: If you omit the '--build' + option, the 'build_policy' attribute in conanfile.py + will be used if it exists, otherwise the behavior is + like '--build=package name'. -r REMOTE, --remote REMOTE Look in the specified remote server -u, --update Will check the remote and in case a newer version diff --git a/reference/commands/creator/test.rst b/reference/commands/creator/test.rst index 72f945c7b82e..fc3d94ff2e39 100644 --- a/reference/commands/creator/test.rst +++ b/reference/commands/creator/test.rst @@ -54,10 +54,13 @@ to be tested must exist in the local cache or any configured remote. built from source. --build=[pattern] Build packages from source whose package reference matches the pattern. The pattern uses 'fnmatch' style wildcards. - Default behavior: If you omit the '--build' option, - the 'build_policy' attribute in conanfile.py will be - used if it exists, otherwise the behavior is like '-- - build=never'. + --build=![pattern] Excluded packages, which will not + be built from the source, whose package reference + matches the pattern. The pattern uses 'fnmatch' style + wildcards. Default behavior: If you omit the '--build' + option, the 'build_policy' attribute in conanfile.py + will be used if it exists, otherwise the behavior is + like '--build=never'. -r REMOTE, --remote REMOTE Look in the specified remote server -u, --update Will check the remote and in case a newer version From 4315135b0407228404ed896cb4ab093b2ddb69c4 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Tue, 27 Apr 2021 12:08:00 -0300 Subject: [PATCH 100/681] Add list to config help Signed-off-by: Uilian Ries --- reference/commands/consumer/config.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference/commands/consumer/config.rst b/reference/commands/consumer/config.rst index d75275f228e2..5feb0a07a490 100644 --- a/reference/commands/consumer/config.rst +++ b/reference/commands/consumer/config.rst @@ -10,7 +10,7 @@ conan config .. code-block:: bash - $ conan config [-h] {get,home,install,rm,set,init} ... + $ conan config [-h] {get,home,install,rm,set,init,list} ... Manages Conan configuration. @@ -19,7 +19,7 @@ Used to edit conan.conf, or install config files. .. code-block:: text positional arguments: - {get,home,install,rm,set,init} + {get,home,install,rm,set,init,list} sub-command help get Get the value of configuration item home Retrieve the Conan home directory From 976fee56ace31fb4d941a845cbb291e80c34711b Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 27 Apr 2021 17:10:35 +0200 Subject: [PATCH 101/681] vs toolsets --- reference/conanfile/tools/cmake.rst | 48 +++++++++++++++++------------ 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index ad3420b2fd52..9a3a092e5f5c 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -88,21 +88,32 @@ Or fully instantiated in the ``generate()`` method: tc.generate() -This will generate a *conan_toolchain.cmake* file after a ``conan install`` (or when building the package +This will generate a the following files after a ``conan install`` (or when building the package in the cache) with the information provided in the ``generate()`` method as well as information -translated from the current ``settings``. +translated from the current ``settings``: + +- *conan_toolchain.cmake* file, containing the translation of Conan settings to CMake variables. + Some things that will be defined in this file: + - Definition of the CMake generator platform and generator toolset + - Definition of the CMake ``build_type`` + - Definition of the ``CMAKE_POSITION_INDEPENDENT_CODE``, based on ``fPIC`` option. + - Definition of the C++ standard as necessary + - Definition of the standard library used for C++ + - Deactivation of rpaths in OSX +- *conanbuild.json*: The toolchain can also generate a ``conanbuild.json`` file that contains arguments to + the command line ``CMake()`` helper used in the recipe ``build()`` method. At the moment it contains only the CMake + generator. The CMake generator will be deduced from the current Conan compiler settings: + - For ``settings.compiler="Visual Studio"``, the CMake generator is a direct mapping of ``compiler.version``, + as this version represents the IDE version, not the compiler version. + - For ``settings.compiler=msvc``, the CMake generator will be by default the one of the Visual Studio that + introduced this compiler version (``msvc 19.0`` => ``Visual Studio 14``, ``msvc 19.1`` => ``Visual Studio 15``, + etc). This can be changed, using the ``tools.microsoft.msbuild:vs_version`` [conf] configuration. If it is + defined, that Visual Studio version will be used as the CMake generator, and the specific compiler version + and toolset will be defined in the ``conan_toolchain.cmake`` file. +- *conanvcvars.bat*: In some cases, the Visual Studio environment needs to be defined correctly for building, + like when using the Ninja or NMake generators. If necessary, the ``CMakeToolchain`` will generate this script, + so defining the correct Visual Studio prompt is easier. -These file will automatically manage the definition of cmake values according to current Conan -settings: - -- Definition of the CMake generator platform and generator toolset -- Definition of the CMake ``build_type`` -- Definition of the ``CMAKE_POSITION_INDEPENDENT_CODE``, based on ``fPIC`` option. -- Definition of the C++ standard as necessary -- Definition of the standard library used for C++ -- Deactivation of rpaths in OSX - -Most of these things will be configurable, please provide feedback at: https://github.com/conan-io/conan/issues constructor +++++++++++ @@ -241,11 +252,9 @@ constructor .. code:: python - def __init__(self, conanfile, generator=None, build_folder=None): + def __init__(self, conanfile, build_folder=None): - ``conanfile``: the current recipe object. Always use ``self``. -- ``generator``: CMake generator. Define it only to override the default one (like ``Visual Studio 15``). - Note that as the platform (x64, Win32...) is now defined in the toolchain it is not necessary to specify it here. - ``build_folder``: Relative path to a folder to contain the temporary build files @@ -256,10 +265,9 @@ configure() def configure(self, source_folder=None): -Calls ``cmake``, with the given generator and passing ``-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake``. -It will also provide the CMake generator in the command like, like ``-G "Visual Studio 15"``. Note -that it is not necessary to specify the platform, like ``-G "Visual Studio 15 Win64"``, as the -platform is already defined in the toolchain file. +Calls ``cmake``, with the generator defined in the ``cmake_generator`` field of the +``conanbuild.json`` file, and passing ``-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake``. +If not ``conanbuild.json`` file is not there, no generator will be passed. - ``source_folder``: Relative path to the folder containing the root *CMakeLists.txt* From efaa71f558dcbe0c526ab7acbba33f81d53e2ddf Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 27 Apr 2021 17:19:05 +0200 Subject: [PATCH 102/681] fix indents --- reference/conanfile/tools/cmake.rst | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 9a3a092e5f5c..8cd2d588e2f4 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -94,22 +94,21 @@ translated from the current ``settings``: - *conan_toolchain.cmake* file, containing the translation of Conan settings to CMake variables. Some things that will be defined in this file: - - Definition of the CMake generator platform and generator toolset - - Definition of the CMake ``build_type`` - - Definition of the ``CMAKE_POSITION_INDEPENDENT_CODE``, based on ``fPIC`` option. - - Definition of the C++ standard as necessary - - Definition of the standard library used for C++ - - Deactivation of rpaths in OSX + + - Definition of the CMake generator platform and generator toolset + - Definition of the CMake ``build_type`` + - Definition of the ``CMAKE_POSITION_INDEPENDENT_CODE``, based on ``fPIC`` option. + - Definition of the C++ standard as necessary + - Definition of the standard library used for C++ + - Deactivation of rpaths in OSX + - *conanbuild.json*: The toolchain can also generate a ``conanbuild.json`` file that contains arguments to the command line ``CMake()`` helper used in the recipe ``build()`` method. At the moment it contains only the CMake generator. The CMake generator will be deduced from the current Conan compiler settings: - - For ``settings.compiler="Visual Studio"``, the CMake generator is a direct mapping of ``compiler.version``, - as this version represents the IDE version, not the compiler version. - - For ``settings.compiler=msvc``, the CMake generator will be by default the one of the Visual Studio that - introduced this compiler version (``msvc 19.0`` => ``Visual Studio 14``, ``msvc 19.1`` => ``Visual Studio 15``, - etc). This can be changed, using the ``tools.microsoft.msbuild:vs_version`` [conf] configuration. If it is - defined, that Visual Studio version will be used as the CMake generator, and the specific compiler version - and toolset will be defined in the ``conan_toolchain.cmake`` file. + + - For ``settings.compiler="Visual Studio"``, the CMake generator is a direct mapping of ``compiler.version``, as this version represents the IDE version, not the compiler version. + - For ``settings.compiler=msvc``, the CMake generator will be by default the one of the Visual Studio that introduced this compiler version (``msvc 19.0`` => ``Visual Studio 14``, ``msvc 19.1`` => ``Visual Studio 15``, etc). This can be changed, using the ``tools.microsoft.msbuild:vs_version`` [conf] configuration. If it is defined, that Visual Studio version will be used as the CMake generator, and the specific compiler version and toolset will be defined in the ``conan_toolchain.cmake`` file. + - *conanvcvars.bat*: In some cases, the Visual Studio environment needs to be defined correctly for building, like when using the Ninja or NMake generators. If necessary, the ``CMakeToolchain`` will generate this script, so defining the correct Visual Studio prompt is easier. From cb4a7a2aebd68c8098bcdb835c885195b9116359 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Tue, 27 Apr 2021 12:27:10 -0300 Subject: [PATCH 103/681] no_copy_source is a header-only feature Signed-off-by: Uilian Ries --- reference/conanfile/attributes.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 26f6377fddfe..518a72555209 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -851,12 +851,15 @@ no_copy_source -------------- The attribute ``no_copy_source`` tells the recipe that the source code will not be copied from the ``source`` folder to the ``build`` folder. -This is mostly an optimization for packages with large source codebases, to avoid extra copies. It is **mandatory** that the source code must not be modified at all by the configure or build scripts, as the source code will be shared among all builds. +This is mostly an optimization for packages with large source codebases or header-only, to avoid extra copies. It is **mandatory** that the source code must not be modified at all by the configure or build scripts, as the source code will be shared among all builds. -To be able to use it, the package recipe can access the ``self.source_folder`` attribute, which will point to the ``build`` folder when ``no_copy_source=False`` or not defined, and will point to the ``source`` folder when ``no_copy_source=True`` +To be able to use it, the package recipe can access the ``self.source_folder`` attribute, which will point to the ``build`` folder when ``no_copy_source=False`` or not defined, and will point to the ``source`` folder when ``no_copy_source=True``. When this attribute is set to True, the ``self.copy()`` lines will be called twice, one copying from the ``source`` folder and the other copying from the ``build`` folder. +Read :ref:`header-only` section for an example using ``no_copy_source`` attribute. + + .. _folders_attributes_reference: .. _attribute_source_folder: From e25ff3e1cb9f986de6ef1a47bd4025f20b7dc11c Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 27 Apr 2021 18:42:39 +0200 Subject: [PATCH 104/681] add docs --- reference/conanfile/attributes.rst | 72 ++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 26f6377fddfe..a45b8749e40d 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -1028,6 +1028,78 @@ has **the same default directories**. Dependencies among components and to components of other requirements can be defined using the ``requires`` attribute and the name of the component. The dependency graph for components will be calculated and values will be aggregated in the correct order for each field. +There is a new way of setting and accessing ``filenames``, ``names`` and ``build_modules`` starting +in Conan 1.36 using new ``set_property`` and ``get_property`` methods of the ``cpp_info`` object: + +.. code-block:: python + + def set_property(self, property_name, value, generator=None) + def get_property(self, property_name, generator=None): + +New properties ``cmake_target_name``, ``cmake_file_name``, ``pkg_config_name`` and +``cmake_build_modules`` are defined to allow migrating ``names``, ``filenames`` and ``build_modules`` +properties to this model. +In Conan 2.0 this will be the default way of setting these properties and also passing custom +properties to generators. + +For example, setting some cpp_info properties with the current model: + +.. code-block:: python + + def package_info(self): + ... + self.cpp_info.filenames["cmake_find_package"] = "MyFileName" + self.cpp_info.filenames["cmake_find_package_multi"] = "MyFileName" + self.cpp_info.components["mycomponent"].names["cmake_find_package"] = "mycomponent-name" + self.cpp_info.components["mycomponent"].names["cmake_find_package_multi"] = "mycomponent-name" + self.cpp_info.components["mycomponent"].build_modules.append(os.path.join("lib", "mypkg_bm.cmake")) + ... + self.cpp_info.components["mycomponent"].names["pkg_config"] = "mypkg-config-name" + +Could be declared like this in the new one: + +.. code-block:: python + + def package_info(self): + ... + self.cpp_info.set_property("cmake_file_name", "MyFileName") + self.cpp_info.components["mycomponent"].set_property("cmake_target_name", "mycomponent-name") + self.cpp_info.components["mycomponent"].set_property("cmake_build_modules", [os.path.join("lib", "mypkg_bm.cmake")]) + self.cpp_info.components["mycomponent"].set_property("custom_name", "mycomponent-name", "custom_generator") + ... + self.cpp_info.components["mycomponent"].set_property("pkg_config_name", "mypkg-config-name") + +New properties defined: +- **cmake_file_name** property will affect all cmake generators that accept the ``filenames`` +property (``cmake_find_package`` and ``cmake_find_package_multi``). +- **cmake_target_name** property will affect all cmake generators that accept the ``names`` +property (``cmake``, ``cmake_multi``, ``cmake_find_package``, ``cmake_find_package_multi`` and ``cmake_paths``). +- **cmake_build_modules** property will replace the ``build_modules`` property. +- **pkg_config_name** property will set the ``names`` property for ``pkg_config`` generator. + +There's also a new property called ``pkg_config_custom_content`` defined for the ``pkg_config`` +generator that can be set and will add user defined content to the files created by this generator. + +.. code-block:: python + + def package_info(self): + custom_content = textwrap.dedent(\""" + datadir=${prefix}/share + schemasdir=${datadir}/mylib/schemas + bindir=${prefix}/bin + \""") + self.cpp_info.set_property("pkg_config_custom_content", custom_content) + +All of these properties, but ``cmake_file_name`` can be defined at global ``cpp_info`` level or at +component level. + +.. warning:: + + Using ``set_property`` and ``get_property`` is a **experimental** feature subject to breaking + changes in future releases. Although this is an experimental feature, the use of the feature + using ``scm_to_conandata`` is considered stable. + + .. seealso:: Read :ref:`package_information_components` and :ref:`method_package_info` to learn more. From 0f23274d6df8c00002c3fd79b46564d2cc95f9c5 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 27 Apr 2021 18:50:18 +0200 Subject: [PATCH 105/681] warning to deprecate multi-config cpp_info --- creating_packages/package_approaches.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/creating_packages/package_approaches.rst b/creating_packages/package_approaches.rst index 96cd9a92a3c5..5c65beca2aa7 100644 --- a/creating_packages/package_approaches.rst +++ b/creating_packages/package_approaches.rst @@ -79,6 +79,13 @@ Read more about this in :ref:`method_package_info`. N configs -> 1 package ---------------------- +.. warning:: + + This approach is discouraged. The support for defining multi-configuration packages (``self.cpp_info.release``, ``self.cpp_info.debug``), + will be removed in Conan 2.0, as discussed and approved by the Tribe in https://github.com/conan-io/tribe/pull/21. New generators and + helpers in ``conan.tools.xxxx``, like ``CMakeDeps`` or ``MSBuildDeps`` already ignore ``cpp_info`` multi-configuration definitions. + + You may want to package both debug and release artifacts in the same package, so it can be consumed from IDEs like Visual Studio. This will change the debug/release configuration from the IDE, without having to specify it in the command line. This type of package can contain different artifacts for different configurations and can be used to include both the release and debug version of a library in the same From b7d46fa6897fd8806793773c792e67333847f039 Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 27 Apr 2021 18:52:54 +0200 Subject: [PATCH 106/681] fix format --- reference/conanfile/attributes.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index a45b8749e40d..807775a7d2d1 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -1070,12 +1070,13 @@ Could be declared like this in the new one: self.cpp_info.components["mycomponent"].set_property("pkg_config_name", "mypkg-config-name") New properties defined: + - **cmake_file_name** property will affect all cmake generators that accept the ``filenames`` -property (``cmake_find_package`` and ``cmake_find_package_multi``). -- **cmake_target_name** property will affect all cmake generators that accept the ``names`` -property (``cmake``, ``cmake_multi``, ``cmake_find_package``, ``cmake_find_package_multi`` and ``cmake_paths``). + property (*cmake_find_package* and *cmake_find_package_multi*). +- **cmake_target_name** property will affect all cmake generators that accept the ``names`` property + (*cmake*, *cmake_multi*, *cmake_find_package*, *cmake_find_package_multi* and *cmake_paths*). - **cmake_build_modules** property will replace the ``build_modules`` property. -- **pkg_config_name** property will set the ``names`` property for ``pkg_config`` generator. +- **pkg_config_name** property will set the ``names`` property for *pkg_config* generator. There's also a new property called ``pkg_config_custom_content`` defined for the ``pkg_config`` generator that can be set and will add user defined content to the files created by this generator. From d3f824b4dbe355c4e0690e2a86efcd7bf41285c2 Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 27 Apr 2021 18:56:03 +0200 Subject: [PATCH 107/681] minor changes --- reference/conanfile/attributes.rst | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 807775a7d2d1..271ff10e3899 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -1084,11 +1084,7 @@ generator that can be set and will add user defined content to the files created .. code-block:: python def package_info(self): - custom_content = textwrap.dedent(\""" - datadir=${prefix}/share - schemasdir=${datadir}/mylib/schemas - bindir=${prefix}/bin - \""") + custom_content = "datadir=${prefix}/share" self.cpp_info.set_property("pkg_config_custom_content", custom_content) All of these properties, but ``cmake_file_name`` can be defined at global ``cpp_info`` level or at From c21352282dfdf75b237f54ad7ab30b8caf2dad95 Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 27 Apr 2021 18:56:51 +0200 Subject: [PATCH 108/681] minor format changes --- reference/conanfile/attributes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 271ff10e3899..213d3699f5a6 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -1078,7 +1078,7 @@ New properties defined: - **cmake_build_modules** property will replace the ``build_modules`` property. - **pkg_config_name** property will set the ``names`` property for *pkg_config* generator. -There's also a new property called ``pkg_config_custom_content`` defined for the ``pkg_config`` +There's also a new property called ``pkg_config_custom_content`` defined for the *pkg_config* generator that can be set and will add user defined content to the files created by this generator. .. code-block:: python From 12f327e185b7ba988a622936e4b3f64326313e62 Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 27 Apr 2021 18:58:07 +0200 Subject: [PATCH 109/681] minor changes --- reference/conanfile/attributes.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 213d3699f5a6..2386cc9835b7 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -1093,8 +1093,7 @@ component level. .. warning:: Using ``set_property`` and ``get_property`` is a **experimental** feature subject to breaking - changes in future releases. Although this is an experimental feature, the use of the feature - using ``scm_to_conandata`` is considered stable. + changes in future releases. .. seealso:: From c253538039369bd3215e32fdf31dd98322f8fee7 Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 27 Apr 2021 18:59:24 +0200 Subject: [PATCH 110/681] minor fix --- reference/conanfile/attributes.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 2386cc9835b7..17debfa82ffb 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -1092,8 +1092,8 @@ component level. .. warning:: - Using ``set_property`` and ``get_property`` is a **experimental** feature subject to breaking - changes in future releases. + Using ``set_property`` and ``get_property`` methods for ``cpp_info`` is an **experimental** + feature subject to breaking changes in future releases. .. seealso:: From 19fe3556a4309aa3477ad5ee773f2aa64bfd69fe Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 27 Apr 2021 19:09:46 +0200 Subject: [PATCH 111/681] remove MakeToolchain --- creating_packages/toolchains.rst | 2 +- integrations/build_system/make.rst | 62 +----- reference/conanfile/tools/gnu.rst | 3 +- .../conanfile/tools/gnu/maketoolchain.rst | 188 ------------------ 4 files changed, 7 insertions(+), 248 deletions(-) delete mode 100644 reference/conanfile/tools/gnu/maketoolchain.rst diff --git a/creating_packages/toolchains.rst b/creating_packages/toolchains.rst index 7bee4d37fee2..db91c1046842 100644 --- a/creating_packages/toolchains.rst +++ b/creating_packages/toolchains.rst @@ -40,7 +40,7 @@ For example, for using the CMake toolchain this should be declared in the recipe .. note:: - At the moment (Conan 1.32), the available built-in toolchains are ``CMakeToolchain``, ``MakeToolchain``, + At the moment (Conan 1.32), the available built-in toolchains are ``CMakeToolchain``, ``MSBuildToolchain`` and ``MesonToolchain``. But in the more general case, and if it needs any specific configuration beyond the default diff --git a/integrations/build_system/make.rst b/integrations/build_system/make.rst index 173117abcc3b..82eca0e07297 100644 --- a/integrations/build_system/make.rst +++ b/integrations/build_system/make.rst @@ -3,21 +3,16 @@ Make ==== -Conan provides two integrations for plain Makefiles: +.. warning:: - | The :ref:`Make generator` - | The :ref:`Make toolchain` (experimental) + This integration is to be deprecated in Conan 2.0. Check :ref:`the conan.tools.gnu Autotools` integration. -Refer to the links above for more detail about each of them. Here we provide a -high-level explanation of how these integrations are meant to be used. - -If you are using ``Makefile`` to build your project you can use one or both of -these depending on your needs. +Conan provides the :ref:`Make generator` to integrate with plain Makefiles The ``make`` generator outputs all the variables related to package dependencies into a file which is named *conanbuildinfo.mak*. The ``make`` toolchain outputs all the variables related to settings, options, and platform into a file which -is named ``conan_toolchain.mak``. +is named ``conan_toolchain.mak``. To use the generator, indicate it in your ``conanfile`` like this: @@ -34,19 +29,6 @@ To use the generator, indicate it in your ``conanfile`` like this: ... generators = "make" -To use the toolchain, add the following function to your ``conanfile``: - -.. code-block:: python - :caption: *conanfile.py* - - class MyConan(ConanFile): - ... - def generate(self): - tc = Make(self) - tc.generate() - -**NOTE**: This can only be used in a ``conanfile.py`` and not ``conanfile.txt``. - Example ------- @@ -74,33 +56,6 @@ This is the main source file for it: return 0; } -As this project relies on the Poco Libraries we are going to create a ``conanfile.py`` with our requirement and also declare the Make -generator and Make toolchain. For simplicity, this ``conanfile`` declares an -empty build and package step. They're not needed for for the local developer -workflow. - -.. code-block:: python - :caption: *conanfile.py* - - from conans import ConanFile - from conan.tools.gnu import MakeToolchain - - class MyConan(ConanFile): - name = "myconan" - version = "0.1" - settings = "os", "arch", "compiler", "build_type" - generators = "make" - exports_sources = "*" - - def generate(self): - tc = MakeToolchain(self) - tc.generate() - - def build(self): - pass - - def package(self): - pass In order to use this generator within your project, use the following Makefile as a reference: @@ -114,13 +69,6 @@ In order to use this generator within your project, use the following Makefile a include conanbuildinfo.mak $(call CONAN_BASIC_SETUP) - #---------------------------------------- - # Prepare flags from make toolchain - #---------------------------------------- - - include conan_toolchain.mak - $(call CONAN_TC_SETUP) - #---------------------------------------- # Make variables for a sample App #---------------------------------------- @@ -161,5 +109,3 @@ Now you can run your application with ``./main``. .. seealso:: | Complete reference for :ref:`Make generator` - | Complete reference for :ref:`Make toolchain` (experimental) - diff --git a/reference/conanfile/tools/gnu.rst b/reference/conanfile/tools/gnu.rst index 5a89a07e94d6..e353a27ec439 100644 --- a/reference/conanfile/tools/gnu.rst +++ b/reference/conanfile/tools/gnu.rst @@ -1,3 +1,5 @@ +.. _conan_tools_gnu: + conan.tools.gnu =============== @@ -9,4 +11,3 @@ conan.tools.gnu gnu/autotoolstoolchain gnu/autotoolsgen gnu/autotools - gnu/maketoolchain diff --git a/reference/conanfile/tools/gnu/maketoolchain.rst b/reference/conanfile/tools/gnu/maketoolchain.rst deleted file mode 100644 index 19faa00fe86a..000000000000 --- a/reference/conanfile/tools/gnu/maketoolchain.rst +++ /dev/null @@ -1,188 +0,0 @@ -.. _make_toolchain: - -MakeToolchain -------------- - -.. warning:: - - These tools are **experimental** and subject to breaking changes. - - -The `MakeToolchain` can be used in the ``generate()`` method of ``conanfile.py``: - -.. code:: python - - from conans import ConanFile - from conan.tools.gnu import MakeToolchain - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} - - def generate(self): - tc = MakeToolchain(self) - tc.generate() - - -The ``MakeToolchain`` will generate the following file during ``conan install`` -command (or before calling the ``build()`` method when the package is being -built in the cache): ``conan_toolchain.mak``. To use the variables generated by -Conan, include this file in your existing ``Makefile`` such as: - -.. code:: makefile - - include conan_toolchain.mak - -Or to make it optional: - - -.. code:: makefile - - -include conan_toolchain.mak - - -``conan_toolchain.mak`` will contain the definitions of all the Make variables -related to the Conan options and settings for the current package, platform, -etc. This includes but is not limited to the following: - -* Detection of target type: "executable", "shared" or "static" - - * Based on existance/value of a option named ``shared`` - - * Based on result, defines ``-shared`` linker flag - -* Detection of ``fPIC`` - - * Based on existance/value of a option named ``fPIC`` - - * Combines with detection of target type above - - * Sets ``-fPIC`` flag for compiler - - * Sets ``-fPIC`` flag for linker when building shared library - - * Sets ``-pie`` flag for linker when building executable - -* Detection of ``build_type`` from Conan settings - - * Sets -DNDEBUG flag for ``Release`` builds - -* Definition of the C++ standard as necessary - -* Definition of the standard library used for C++ - -* Definition of rpaths based on libpaths in conan cache - -**NOTE**: Simply including this file will have no effect on your ``Makefile`` -build. - -All variables in this file are prefixed with ``CONAN_TC_`` and so existing -makefiles will robably makes no references to variables with these names. Users -can modify their makefiles to make use of these variables by name. That is -certainly supported, however such a process tighly couples Makefiles to Conan -which can be undesirable, so Conan provides an alternative. There is list of -well-known "standard"/"conventional" variables used within **GnuMake**, -**Autotools**, and other related tools: - -`Gnu Make Well-Known Variables `_ - -The relevant content from the GnuMake manual is provided here for convenience: - - CFLAGS - Extra flags to give to the C compiler. - - CXXFLAGS - Extra flags to give to the C++ compiler. - - CPPFLAGS - Extra flags to give to the C preprocessor and programs that use it (the C and Fortran compilers). - - LDFLAGS Extra flags to give to compilers when they are supposed to invoke the - linker, ‘ld’, such as -L. Libraries (-lfoo) should be added to the LDLIBS - variable instead. - - LDLIBS - Library flags or names given to compilers when they are supposed to invoke the - linker, ‘ld’. LOADLIBES is a deprecated (but still supported) alternative to - LDLIBS. Non-library linker flags, such as -L, should go in the LDFLAGS - variable. - -To have the ``CONAN_TC_`` variables appended to these standard GnuMake -variables, simply add the following function call to your ``Makefile`` somewhere -after the ``include`` statement: - -* ``$(call CONAN_TC_SETUP)`` - -To be clear, this only has the desired "automatic" effect if your -``Makefile(s)`` all use of these standard variables in the conventional way. If -your ``Makefile(s)`` use custom variables, you would need to teach them to -append/include/use the ``CONAN_TC_`` variables manually. - -Also, while we are appending "standard" variables in a seemingly sensible way, -this function makes a lot of assumptions which are likely not going to hold true -in many environments. The goal is to make as much of the behavior configurable -as possible. Based on user requests, we will continue to add parameters to the -constructor. If you would like a behavior added to the list of configurable -items, please provide feedback at: https://github.com/conan-io/conan/issues - - -definitions -+++++++++++ - -This attribute allows defining preprocessor definitions the same way that build helpers do: - -.. code:: python - - def generate(self): - tc = MakeToolchain(self) - tc.preprocessor_definitions["MYVAR"] = "MyValue" - tc.generate() - -This will be translated to: - -- ``-DMYVAR=MYVAL`` being appended to the ``CONAN_TC_CPPFLAGS`` variable - - -generators -++++++++++ - -The ``MakeGenerator`` is being developed in-tandem with this toolchain because -ideally they would be used in the same recipes and workflows. They have -consistent conventions and strategy, however they are currently completely -independent from each other. Thus, you can use this toolchain without using the -``MakeGenerator``. - - -Using the toolchain in developer flow -+++++++++++++++++++++++++++++++++++++ - -One of the advantages of using Conan toolchains is that it provides -exact same "toolchain-related" variables that Conan will have within a recipe's -``build()`` method to the build system when the user calls the build system -directly in their workspace. This was not possible prior to Conan's toolchain -feature. Here's an example: - -.. code:: bash - - # Lets start in the folder containing a conanfile.py - # Add the toolchain method with the MakeToolchain as shown in the example - $ mkdir build && cd build - # Install both debug and release deps and create the toolchain - $ conan install .. - # Add the following lines to Makefile: - # -include build/conan_toolchain.mak - # $(call CONAN_TC_SETUP) - $ make - -**NOTE** As stated previously, this will only have the desired effect if the -``Makefile`` makes conventional use of the standard variables. - -We can actually achieve the same goal without modifying the ``Makefile`` at all, -it simply requires passing a few more parameters to **GnuMake**. - -.. code:: bash - - $ conan install .. - $ make -E='include build/conan_toolchain.mak' -E='$(call CONAN_TC_SETUP)' From 922d411074d89f3b351440ebcddbf2a78f5e7d22 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 27 Apr 2021 19:16:36 +0200 Subject: [PATCH 112/681] Update reference/conanfile/tools/cmake.rst --- reference/conanfile/tools/cmake.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 8cd2d588e2f4..fa76053bf1d5 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -88,7 +88,7 @@ Or fully instantiated in the ``generate()`` method: tc.generate() -This will generate a the following files after a ``conan install`` (or when building the package +This will generate the following files after a ``conan install`` (or when building the package in the cache) with the information provided in the ``generate()`` method as well as information translated from the current ``settings``: From d8b38b9e27aa3f2922f4c94e6e529f6e0a2e2fc8 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Tue, 27 Apr 2021 19:19:19 +0200 Subject: [PATCH 113/681] Update reference/conanfile/tools/cmake.rst --- reference/conanfile/tools/cmake.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index fa76053bf1d5..feb34e49e8a2 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -266,7 +266,7 @@ configure() Calls ``cmake``, with the generator defined in the ``cmake_generator`` field of the ``conanbuild.json`` file, and passing ``-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake``. -If not ``conanbuild.json`` file is not there, no generator will be passed. +If ``conanbuild.json`` file is not there, no generator will be passed. - ``source_folder``: Relative path to the folder containing the root *CMakeLists.txt* From 0903352f09c5b36a076628d8d812c47f5eae2cc1 Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 27 Apr 2021 19:59:31 +0200 Subject: [PATCH 114/681] cmaketoolchain extensibility --- reference/conanfile/tools/cmake.rst | 121 ++++++++++++++++++++++++---- 1 file changed, 105 insertions(+), 16 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index ad3420b2fd52..379f78eb8e29 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -93,16 +93,8 @@ in the cache) with the information provided in the ``generate()`` method as well translated from the current ``settings``. These file will automatically manage the definition of cmake values according to current Conan -settings: +settings. -- Definition of the CMake generator platform and generator toolset -- Definition of the CMake ``build_type`` -- Definition of the ``CMAKE_POSITION_INDEPENDENT_CODE``, based on ``fPIC`` option. -- Definition of the C++ standard as necessary -- Definition of the standard library used for C++ -- Deactivation of rpaths in OSX - -Most of these things will be configurable, please provide feedback at: https://github.com/conan-io/conan/issues constructor +++++++++++ @@ -134,14 +126,14 @@ This attribute allows defining CMake variables, for multiple configurations (Deb This will be translated to: - One ``set()`` definition for ``MYVAR`` in ``conan_toolchain.cmake`` file. -- One ``set()`` definition, using a cmake generator expression in ``conan_project_include.cmake`` file, - using the different values for different configurations. It is important to recall that things - that depend on the build type cannot be directly set in the toolchain. +- One ``set()`` definition, using a cmake generator expression in ``conan_toolchain.cmake`` file, + using the different values for different configurations. The ``CMakeToolchain`` is intended to run with the ``CMakeDeps`` dependencies generator. It might temporarily work with others like ``cmake_find_package`` and ``cmake_find_package_multi``, but this will be removed soon. + Using the toolchain in developer flow +++++++++++++++++++++++++++++++++++++ @@ -192,11 +184,108 @@ For single-configuration build systems: $ cmake --build . # or just "make" -Conan is able to generate a toolchain file for different systems. In the -following sections you can find more information about them: +Extending and customizing CMakeToolchain +++++++++++++++++++++++++++++++++++++++++ + +Since Conan 1.36, ``CMakeToolchain`` implements a powerful capability for extending and customizing the resulting toolchain file. + +The following predefined blocks are available: + +- ``generic_system``: Defines ``CMAKE_GENERATOR_PLATFORM``, ``CMAKE_GENERATOR_TOOLSET``, ``CMAKE_C_COMPILER``,``CMAKE_CXX_COMPILER`` and ``CMAKE_BUILD_TYPE`` +- ``android_system``: Defines ``ANDROID_PLATFORM``, ``ANDROID_STL``, ``ANDROID_ABI`` and includes ``CMAKE_ANDROID_NDK/build/cmake/android.toolchain.cmake`` + where CMAKE_ANDROID_NDK comes defined in ``tools.android:ndk_path`` +- ``ios_system``: Defines ``CMAKE_SYSTEM_NAME``, ``CMAKE_SYSTEM_VERSION``, ``CMAKE_OSX_ARCHITECTURES``, ``CMAKE_OSX_SYSROOT`` for Apple systems. +- ``find_paths``: Defines ``CMAKE_FIND_PACKAGE_PREFER_CONFIG``, ``CMAKE_MODULE_PATH``, ``CMAKE_PREFIX_PATH`` so the generated files from ``CMakeDeps`` are found. +- ``fpic``: Defines the ``CMAKE_POSITION_INDEPENDENT_CODE`` when there is a ``options.fPIC`` +- ``rpath``: Defines ``CMAKE_SKIP_RPATH`` for OSX +- ``arch_flags``: Defines C/C++ flags like ``-m32, -m64`` when necessary. +- ``libcxx``: Defines ``-stdlib=libc++`` flag when necessary as well as ``_GLIBCXX_USE_CXX11_ABI``. +- ``vs_runtime``: Defines the ``CMAKE_MSVC_RUNTIME_LIBRARY`` variable, as a generator expression for + for multiple configurations. +- ``cppstd``: defines ``CMAKE_CXX_STANDARD``, ``CMAKE_CXX_EXTENSIONS`` +- ``shared``: defines ``BUILD_SHARED_LIBS`` +- ``parallel``: defines ``/MP`` parallel build flag for Visual. + + +Blocks can be customized in different ways: + +.. code:: python + + # remove an existing block + def generate(self): + tc = CMakeToolchain(self) + tc.pre_blocks.remove("generic_system") + + # modify the template of an existing block + def generate(self): + tc = CMakeToolchain(self) + tmp = tc.pre_blocks["generic_system"].template + new_tmp = temp.replace(...) # replace, fully replace, append... + tc.pre_blocks["generic_system"].template = new_tmp + + # modify the context (variables) of an existing block + def generate(self): + tc = CMakeToolchain(self) + generic_block = toolchain.pre_blocks["generic_system"] + + def context(self): + assert self # Your own custom logic here + return {"build_type": "SuperRelease"} + generic_block.context = types.MethodType(context, generic_block) + + # completely replace block + def generate(self): + tc = CMakeToolchain(self) + # this could go to a python_requires + class MyGenericBlock(Block): + template = "HelloWorld" + + def context(self): + return {} + + tc.pre_blocks["generic_system"] = MyBlock + + # add a completely new block + def generate(self): + tc = CMakeToolchain(self) + # this could go to a python_requires + class MyBlock(Block): + template = "Hello {{myvar}}!!!" + + def context(self): + return {"myvar": "World"} + + tc.pre_blocks["mynewblock"] = MyBlock + + # add a completely new block + def generate(self): + tc = CMakeToolchain(self) + # this could go to a python_requires + class MyBlock(Block): + template = "Hello {{myvar}}!!!" + + def context(self): + return {"myvar": "World"} + + tc.pre_blocks["mynewblock"] = MyBlock + + # extend from an existing block + def generate(self): + tc = CMakeToolchain(self) + # this could go to a python_requires + class MyBlock(GenericSystemBlock): + template = "Hello {{build_type}}!!" + + def context(self): + c = super(MyBlock, self).context() + c["build_type"] = c["build_type"] + "Super" + return c + + tc.pre_blocks["generic_system"] = MyBlock + +Recall that this is a very **experimental** feature, and these interfaces might change in the following releases. - * :ref:`Android `. - * :ref:`iOS `. +For more information about these blocks, please have a look at the source code. CMake From 4d5b8c4418f54142ab0584e8cd9cee72913394bf Mon Sep 17 00:00:00 2001 From: James Date: Tue, 27 Apr 2021 20:04:06 +0200 Subject: [PATCH 115/681] test build_require (#2081) * test build_require * Update devtools/build_requires.rst * Update devtools/build_requires.rst * Update devtools/build_requires.rst * Update devtools/build_requires.rst Co-authored-by: Carlos Zoido --- devtools/build_requires.rst | 29 +++++++++++++++++++++++++++++ reference/commands/creator/test.rst | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/devtools/build_requires.rst b/devtools/build_requires.rst index de7a210c2b15..7ac38893fb85 100644 --- a/devtools/build_requires.rst +++ b/devtools/build_requires.rst @@ -268,3 +268,32 @@ same ``build_requires`` package. Something like: By using this mechanism, ``tool`` dependency will always be used (the recipe will be fetched from servers), and the version of ``tool`` will be used to compute the ``package_id`` following the ``default_python_requires_id_mode`` in *conan.conf*, or the specific ``self.info.python_requires.xxxx_mode()`` in recipes. + + +Testing build_requires +---------------------- + +.. warning:: + + This is an **experimental** feature, subject to future breaking changes + +Available since: `1.36.0 `_ + +From Conan 1.36, it is possible to test ``build_requires`` with the ``test_package`` functionality. +What is necessary is to specify in the ``test_package/conanfile.py``, that the tested package +is a build tool, which can be done with: + +.. code-block:: python + + from conans import ConanFile + + class Pkg(ConanFile): + test_type = "build_requires" + + ... + +The rest of the test *conanfile.py* should take into account that the reference automatically injected +will be a ``build_require``. + +If for some reason, it is necessary to test the same package both as a regular require and a build_require, +then it is possible to specify: ``test_type = "build_requires", "requires"``. diff --git a/reference/commands/creator/test.rst b/reference/commands/creator/test.rst index fc3d94ff2e39..e09c23f982b3 100644 --- a/reference/commands/creator/test.rst +++ b/reference/commands/creator/test.rst @@ -112,7 +112,7 @@ to be tested must exist in the local cache or any configured remote. defaults (host machine). e.g.: -s:h compiler=gcc -This command is util for testing existing packages, that have been previously built (with :command:`conan create`, for example). +This command is useful for testing existing packages, that have been previously built (with :command:`conan create`, for example). :command:`conan create` will automatically run this test if a *test_package* folder is found besides the *conanfile.py*, or if the :command:`--test-folder` argument is provided to :command:`conan create`. From 6b0841e0358be528c601a0e342c0dadd41310d32 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Wed, 28 Apr 2021 08:27:48 +0200 Subject: [PATCH 116/681] Update reference/conanfile/attributes.rst Co-authored-by: James --- reference/conanfile/attributes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 17debfa82ffb..06731f7db60b 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -1042,6 +1042,7 @@ properties to this model. In Conan 2.0 this will be the default way of setting these properties and also passing custom properties to generators. +For most cases, it is recommended not to use the ``generator`` argument. The properties are generic for build systems, and different generators that integrate with a given build system could be reading such generic properties. For example, setting some cpp_info properties with the current model: .. code-block:: python From a6753d23d96001d402272408b76a327b6edb9327 Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Wed, 28 Apr 2021 08:29:14 +0200 Subject: [PATCH 117/681] Update reference/conanfile/attributes.rst --- reference/conanfile/attributes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 06731f7db60b..afdd9a301a43 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -1080,7 +1080,7 @@ New properties defined: - **pkg_config_name** property will set the ``names`` property for *pkg_config* generator. There's also a new property called ``pkg_config_custom_content`` defined for the *pkg_config* -generator that can be set and will add user defined content to the files created by this generator. +generator that will add user defined content to the *.pc* files created by this generator. .. code-block:: python From faf7f3db91232a725859c3628f402b60c63a29f8 Mon Sep 17 00:00:00 2001 From: memsharded Date: Wed, 28 Apr 2021 10:57:19 +0200 Subject: [PATCH 118/681] generate() docs --- reference/conanfile/methods.rst | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 303fd517f2df..9829ab87150f 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1386,3 +1386,60 @@ current folder (the one containing the *conanfile.py*). The ``dst`` is relative self.output.info("Executing export_sources() method") # will copy all .txt files from the local "subfolder" folder to the cache "mydata" one self.copy("*.txt", src="mysubfolder", dst="mydata") + + +generate() +---------- + +.. warning:: + + This is an **experimental** feature subject to breaking changes in future releases. + +This method will run after the computation and installation of the dependency graph. This means that it will +run after a ``conan install`` command, or when a package is being built in the cache, it will be run before +calling the ``build()`` method. + +The purpose of ``generate()`` is to prepare the build, generating the necessary files. These files would typically be: + +- Files containing information to locate the dependencies, as ``xxxx-config.cmake`` CMake config scripts, or ``xxxx.props`` + Visual Studio property files. +- Environment activation scripts, like ``conanbuildenv.bat`` or ``conanbuildenv.sh``, that define all the necessary environment + variables necessary for the build. +- Toolchain files, like ``conantoolchain.cmake``, that contains a mapping between the current Conan settings and options, and the + build system specific syntax. +- General purpose build information, as a ``conanbuild.json`` file that could contain information like the CMake generator or + CMake toolchain file to be used in the ``build()`` method. +- Specific build system files, like ``conanvcvars.bat``, that contains the necessary Visual Studio vcvars.bat call for certain + build systems like Ninja when compiling with the Microsoft compiler. + + +The idea is that the ``generate()`` method implements all the necessary logic, making both the user manual builds after a ``conan install`` +very straightforward, and also the ``build()`` method logic simpler. The build produced by a user in their local flow should result +exactly the same one as the build done in the cache with a ``conan create`` without effort. + +In many cases, the ``generate()`` method might not be necessary, and declaring ``generators`` could be enough: + +.. code:: python + + from conans import ConanFile + + class Pkg(ConanFile): + generators = "CMakeDeps", "CMakeToolchain" + + +But the ``generate()`` method can explicitly instantiate those generators, and customize them, or provide a completely user custom +generation. For user custom integrations, putting code in a common ``python_require`` would be a good way to avoid repetition in +multiple recipes. + +.. code:: python + + from conans import ConanFile + from conan.tools.cmake import CMakeToolchain + + class Pkg(ConanFile): + + def generate(self): + tc = CMakeToolchain(self) + # customize toolchain "tc" + tc.generate() + # Or provide your own custom logic From 696b94f5bc3e333dc19b03c24ecfdb6f413a04c0 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 28 Apr 2021 11:38:39 +0200 Subject: [PATCH 119/681] Update reference/conanfile/methods.rst Co-authored-by: Daniel --- reference/conanfile/methods.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 9829ab87150f..2e38116ec072 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1396,7 +1396,7 @@ generate() This is an **experimental** feature subject to breaking changes in future releases. This method will run after the computation and installation of the dependency graph. This means that it will -run after a ``conan install`` command, or when a package is being built in the cache, it will be run before +run after a :command:`conan install` command, or when a package is being built in the cache, it will be run before calling the ``build()`` method. The purpose of ``generate()`` is to prepare the build, generating the necessary files. These files would typically be: From 08f4634dfe05d99004cfbafdbc25da1577a6b4ac Mon Sep 17 00:00:00 2001 From: James Date: Wed, 28 Apr 2021 11:38:50 +0200 Subject: [PATCH 120/681] Update reference/conanfile/methods.rst Co-authored-by: Daniel --- reference/conanfile/methods.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 2e38116ec072..f7a57bd7cc40 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1417,7 +1417,7 @@ The idea is that the ``generate()`` method implements all the necessary logic, m very straightforward, and also the ``build()`` method logic simpler. The build produced by a user in their local flow should result exactly the same one as the build done in the cache with a ``conan create`` without effort. -In many cases, the ``generate()`` method might not be necessary, and declaring ``generators`` could be enough: +In many cases, the ``generate()`` method might not be necessary, and declaring the ``generators`` attribute could be enough: .. code:: python From abb09b2ac9d52d748663205f118c94ef7bdccf53 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 28 Apr 2021 11:39:04 +0200 Subject: [PATCH 121/681] Update reference/conanfile/methods.rst Co-authored-by: Daniel --- reference/conanfile/methods.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index f7a57bd7cc40..fa4cc1c33f96 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1427,7 +1427,7 @@ In many cases, the ``generate()`` method might not be necessary, and declaring t generators = "CMakeDeps", "CMakeToolchain" -But the ``generate()`` method can explicitly instantiate those generators, and customize them, or provide a completely user custom +But the ``generate()`` method can explicitly instantiate those generators, customize them, or provide a complete custom generation. For user custom integrations, putting code in a common ``python_require`` would be a good way to avoid repetition in multiple recipes. From f8826d08a1bf0b2b55a83222aafc46dee2439a9a Mon Sep 17 00:00:00 2001 From: James Date: Wed, 28 Apr 2021 11:39:11 +0200 Subject: [PATCH 122/681] Update reference/conanfile/methods.rst Co-authored-by: Daniel --- reference/conanfile/methods.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index fa4cc1c33f96..a2618420da99 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1428,7 +1428,7 @@ In many cases, the ``generate()`` method might not be necessary, and declaring t But the ``generate()`` method can explicitly instantiate those generators, customize them, or provide a complete custom -generation. For user custom integrations, putting code in a common ``python_require`` would be a good way to avoid repetition in +generation. For custom integrations, putting code in a common ``python_require`` would be a good way to avoid repetition in multiple recipes. .. code:: python From cdf2953eeffec0ec0f29ff8460b4b394f849d052 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 28 Apr 2021 11:39:16 +0200 Subject: [PATCH 123/681] Update reference/conanfile/methods.rst Co-authored-by: Daniel --- reference/conanfile/methods.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index a2618420da99..f57d8f23b45b 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1413,7 +1413,7 @@ The purpose of ``generate()`` is to prepare the build, generating the necessary build systems like Ninja when compiling with the Microsoft compiler. -The idea is that the ``generate()`` method implements all the necessary logic, making both the user manual builds after a ``conan install`` +The idea is that the ``generate()`` method implements all the necessary logic, making both the user manual builds after a :command:`conan install` very straightforward, and also the ``build()`` method logic simpler. The build produced by a user in their local flow should result exactly the same one as the build done in the cache with a ``conan create`` without effort. From b474c4de87e6ca8c3248691c34cc5165793a07d3 Mon Sep 17 00:00:00 2001 From: Empantie <37814370+Empantie@users.noreply.github.com> Date: Wed, 28 Apr 2021 11:46:09 +0200 Subject: [PATCH 124/681] Update package_approaches.rst (#2078) Debug and Release switched --- creating_packages/package_approaches.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/creating_packages/package_approaches.rst b/creating_packages/package_approaches.rst index 96cd9a92a3c5..facc358cae12 100644 --- a/creating_packages/package_approaches.rst +++ b/creating_packages/package_approaches.rst @@ -120,11 +120,11 @@ this meets your needs, we recommend removing the ``compiler.runtime`` subsetting del self.settings.compiler.runtime def build(self): - cmake_release = CMake(self, build_type="Debug") + cmake_release = CMake(self, build_type="Release") cmake_release.configure() cmake_release.build() - cmake_debug = CMake(self, build_type="Release") + cmake_debug = CMake(self, build_type="Debug") cmake_debug.configure() cmake_debug.build() From 09445e268a707953661a0da8f5884dd1de7ee6af Mon Sep 17 00:00:00 2001 From: James Date: Wed, 28 Apr 2021 11:53:30 +0200 Subject: [PATCH 125/681] Update reference/conanfile/tools/cmake.rst --- reference/conanfile/tools/cmake.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 379f78eb8e29..ee31e3a7a724 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -220,7 +220,7 @@ Blocks can be customized in different ways: def generate(self): tc = CMakeToolchain(self) tmp = tc.pre_blocks["generic_system"].template - new_tmp = temp.replace(...) # replace, fully replace, append... + new_tmp = tmp.replace(...) # replace, fully replace, append... tc.pre_blocks["generic_system"].template = new_tmp # modify the context (variables) of an existing block From 9101ac72c8120144318a0eb32ee0ddd0a650da04 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 28 Apr 2021 11:53:35 +0200 Subject: [PATCH 126/681] Update reference/conanfile/tools/cmake.rst --- reference/conanfile/tools/cmake.rst | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index ee31e3a7a724..d421b6f1ecf9 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -257,17 +257,6 @@ Blocks can be customized in different ways: tc.pre_blocks["mynewblock"] = MyBlock - # add a completely new block - def generate(self): - tc = CMakeToolchain(self) - # this could go to a python_requires - class MyBlock(Block): - template = "Hello {{myvar}}!!!" - - def context(self): - return {"myvar": "World"} - - tc.pre_blocks["mynewblock"] = MyBlock # extend from an existing block def generate(self): From 3337b3e534befe211bf397286330abc4c3ec027f Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Wed, 28 Apr 2021 14:37:41 +0200 Subject: [PATCH 127/681] Merge master to develop (#2088) * faq git servers * Update package_approaches.rst (#2078) Debug and Release switched Co-authored-by: memsharded Co-authored-by: Empantie <37814370+Empantie@users.noreply.github.com> --- creating_packages/package_approaches.rst | 4 +-- faq/using.rst | 33 +++++++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/creating_packages/package_approaches.rst b/creating_packages/package_approaches.rst index 5c65beca2aa7..93b3970131fc 100644 --- a/creating_packages/package_approaches.rst +++ b/creating_packages/package_approaches.rst @@ -127,11 +127,11 @@ this meets your needs, we recommend removing the ``compiler.runtime`` subsetting del self.settings.compiler.runtime def build(self): - cmake_release = CMake(self, build_type="Debug") + cmake_release = CMake(self, build_type="Release") cmake_release.configure() cmake_release.build() - cmake_debug = CMake(self, build_type="Release") + cmake_debug = CMake(self, build_type="Debug") cmake_debug.configure() cmake_debug.build() diff --git a/faq/using.rst b/faq/using.rst index ecc7e26269be..ef724856bb5e 100644 --- a/faq/using.rst +++ b/faq/using.rst @@ -15,6 +15,30 @@ When to use settings or options? While creating a package, you may want to add different configurations and variants of the package. There are two main inputs that define packages: settings and options. Read more about them in :ref:`this section`. + +Can Conan use git repositories as package servers? +-------------------------------------------------- + +Or put it with other words, can a conan recipe define requirements something like ``requires="git://github.com/someuser/somerepo.git#sometag"``? + +No, it is not possible. There are several technical reasons for this, mainly around the dependency resolution algorithm, but also about performance: + +- Conan manages dependency versions conflicts. These can be efficiently handled from the abstract reference quickly, while a git repo reference would require cloning contents even before deciding. +- The version overriding mechanism from downstream consumers to resolve conflicts cannot be implemented either with git repos, as both the name and the version of the package is not defined. +- Conan support version-ranges, like depending on ``boost/[>1.60 <1.70]``. This is basically impossible to implement in git repos. +- Conan has an “update” concept, that allows to query servers for latest modifications, latest versions, or even latest revisions, which would not work at all with git repos either. +- Binary management is one of the biggest advantages of Conan. Obviously, it is not possible to manage binaries for this case either. + +In summary, whatever could be done would be an extremely limited solution, very likely inefficient and much slower, with a lot of corner cases and rough edges around those said limitations. It would require a big development effort, and the compounded complexity it would induce in the codebase is a liability that will slow down future development, maintenance and support efforts. + +Besides the impossibility on the technical side, there are also other reasons like well known best practices around package management and modern devops in other languages that show evidence that even if this approach looks like convenient, it should be discouraged in practice: + +- Packages should be fully relocatable to a different location. Users should be able to retrieve their dependencies and upload a copy to their own private server, and fully disconnect from the external world. This is critical for robust and secure production environments, and avoid problems that other ecosystems like NPM have had in the past. As a consequence, all recipes dependencies should not be coupled to any location, and be abstract as conan "requires" are. +- Other languages, like Java (which would be the closest one regarding enterprise-ness), never provided this feature. Languages like golang, that based its dependency management on this feature, has also evolved away from it and towards abstract "module" concepts that can be hosted in different servers + +So there are no plans to support this approach, and the client-server architecture will continue to be the proposed solution. There are several alternatives for the servers from different vendors, for public open source packages `ConanCenter `_ is the recommended one, and for private packages, the free `ArtifactoryCE `_ is a simple and powerful solution. + + How to obtain the dependents of a given package? ------------------------------------------------ @@ -90,9 +114,9 @@ In the case of the ```` term, normally OSS package creators use ``testi only in few configurations) and ``stable`` when the recipe is ready enough to be used (e.g. it is built and tested in a wide range of configurations). -From the perspective of a library developer, channels could be used to create different scopes of your library. For example, use ``rc`` -channel for release candidates, maybe ``experimental`` for those kind of features, or even ``qa``/``testing`` before the library is checked -by QA department or testers. +It is strongly recommended that packages are considered immutable. Once a package has been created with a user/channel, it shouldn't be +changed. Instead, a new package with a new user/channel should be created. + What does "outdated from recipe" mean exactly? ---------------------------------------------- @@ -118,6 +142,9 @@ recipe. That means: if the recipe has completely removed an option (it could be that were generated previously with that option, those packages will be impossible to install as their package ID are calculated from the recipe file (and that option does not exist anymore). +When using "revisions" (it is opt-in in Conan 1.X, but it will be always enabled in Conan 2.0), this should never happen, as doing any change +to a recipe or source should create a new revision that will contain its own binaries. + How to configure the remotes priority order ------------------------------------------- From fa3a257a8df27bbe983578966affb6223819c4b4 Mon Sep 17 00:00:00 2001 From: czoido Date: Wed, 28 Apr 2021 15:16:35 +0200 Subject: [PATCH 128/681] release 1.36.0 --- .ci/publish.jenkins | 1 + changelog.rst | 33 ++++++++++++++++++++++++++++++++- conf.py | 4 ++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index a739d1260764..92d40831eb30 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,6 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ + 'release/1.36.0': '1.36', 'release/1.35.2': '1.35', 'release/1.34.1': '1.34', 'release/1.33.1': '1.33', diff --git a/changelog.rst b/changelog.rst index 6ac71527c1f9..ad7dd3a47b51 100644 --- a/changelog.rst +++ b/changelog.rst @@ -18,9 +18,40 @@ Check https://github.com/conan-io/conan for issues and more details about develo .. important:: - Conan 1.35 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please + Conan 1.36 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.36.0 (28-Apr-2021) +-------------------- + +- Feature: Add support to ``tools.cmake.CMake`` for Ninja toolchain defined with ``CMakeToolchain``. `#8887 `_ +- Feature: The `CMakeDeps` generator will print CMake traces with the declared targets. e.g: `Target declared: 'OpenSSL::Crypto'`. `#8843 `_ +- Feature: Add clang 12 support. `#8828 `_ +- Feature: List tools and core from profile and _global.conf_. `#8821 `_ . Docs `here `__ +- Feature: Add cross-building tests for new AutoTools build helper. `#8819 `_ +- Feature: ``CMakeToolchain`` generates a ``conanbuild.json`` file with the generator to be used in the ``CMake`` command line later, so it is not necessary to duplicate logic, and is explicit what generator should be used. `#8815 `_ . Docs `here `__ +- Feature: ``CMakeToolchain`` learned to build with different toolsets, down to the minor compiler version, for the ``msvc`` compiler. `#8815 `_ . Docs `here `__ +- Feature: Validate checksum and retry download for corrupted downloaded cache files. `#8806 `_ +- Feature: ``CMakeToolchain`` defining `CMAKE_GENERATOR_TOOLSET` for msvc version different than the default. `#8800 `_ +- Feature: Implement ``test_build_require`` in ``test_package/conanfile.py`` recipes, so build_requires can be tested as such. `#8787 `_ . Docs `here `__ +- Feature: Make available the full recipe and package reference to consumers via ``.dependencies``. `#8765 `_ +- Feature: New ``CMakeToolchain`` customization and extensibility mechanism with blocks of components instead of inheritance. `#8749 `_ . Docs `here `__ +- Feature: Add `set_property` and `get_property` to set properties and access them in generators. Can be set only for a specific generator or as a default value for all of them. `#8727 `_ . Docs `here `__ +- Feature: Use `set_property` and `get_property` to support custom defined content in `pkg_config` generator. `#8727 `_ . Docs `here `__ +- Feature: Add new property names: `cmake_target_name`, `cmake_file_name`, `pkg_config_name` and `cmake_build_modules` that can be used for multiple generators of the same type allowing also an easier migration of `names`, `filenames` and `build_modules` properties to this model. `#8727 `_ . Docs `here `__ +- Feature: Skip package when building all package from sources at once using `--build=!` syntax. `#8483 `_ . Docs `here `__ +- Feature: ``CMakeToolchain`` will generate ``conanvcvars.bat`` for Ninja builds for ``msvc``. `#8005 `_ +- Fix: Remove ``tools.gnu.MakeToolchain``, superseded by ``tools.gnu.AutotoolsToolchain``. `#8880 `_ . Docs `here `__ +- Fix: Allow spaces in the path for new environment files and ``conancvvars.bat`` Visual toolchain file. `#8847 `_ +- Fix: Return `deprecated` attribute in :command:`conan inspect` command. `#8832 `_ +- Fix: Check if Artifactory url for publishing the build_info has `artifactory` string as the service context and remove from the API url if it doesn't. `#8826 `_ +- Fix: Recognize ``Ninja Multi-Config`` as a CMake multi-configuration generator. `#8814 `_ +- Fix: using `CMAKE_CURRENT_LIST_DIR` in `CMakeToolchain` to locate `CMakeDeps` config files. `#8810 `_ +- Fix: `config_install_interval` no longer enter in loop when invalid. `#8769 `_ . Docs `here `__ +- Fix: Remove multi-config support for ``CMakeDeps`` generator. `#8767 `_ . Docs `here `__ +- Fix: Accept relative profile path when folder is on same tree level. `#8685 `_ . Docs `here `__ +- Bugfix: Fixed test_package/conanfile.py using ``build_requires`` for a package belonging to a lockfile. `#8793 `_ + 1.35.2 (19-Apr-2021) -------------------- diff --git a/conf.py b/conf.py index fb672ade807e..3f03f97a7051 100644 --- a/conf.py +++ b/conf.py @@ -41,9 +41,9 @@ ] # The short X.Y version. -version = "1.35" +version = "1.36" # The full version, including alpha/beta/rc tags. -release = u'1.35.2' +release = u'1.36.0' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): From 4f64d7ab6ee7bbe85da4e510cf02941f3471382e Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Wed, 28 Apr 2021 10:26:41 -0300 Subject: [PATCH 129/681] generate() is available since 1.32 Signed-off-by: Uilian Ries --- reference/conanfile/methods.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index f57d8f23b45b..74bfa18681af 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1395,6 +1395,8 @@ generate() This is an **experimental** feature subject to breaking changes in future releases. +Available since: `1.32.0 `_ + This method will run after the computation and installation of the dependency graph. This means that it will run after a :command:`conan install` command, or when a package is being built in the cache, it will be run before calling the ``build()`` method. From b28af87e9824c2c5f990c89939d7af0076773d99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Mart=C3=ADnez=20de=20Bartolom=C3=A9?= Date: Thu, 29 Apr 2021 18:46:56 +0200 Subject: [PATCH 130/681] Preliminar docs --- reference/conanfile/methods.rst | 268 ++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 74bfa18681af..7815ca73cdde 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1445,3 +1445,271 @@ multiple recipes. # customize toolchain "tc" tc.generate() # Or provide your own custom logic + + + +FIXME: MANY OF THIS IS NOT "REFERENCE" AND SHOULD BE ELSEWHERE + +layout() +-------- + +.. warning:: + + This is an **experimental** feature subject to breaking changes in future releases. + +Available since: `1.37.0 `_ + +Method to describe the package contents, not only the final package but the layout while developing the package. +In the layout method you can adjust 3 different things, ``self.folders``, ``self.patterns`` and ``self.infos`` + +self.folders +++++++++++++ + + +- **self.folders.source** (Defaulted to ""): Specifies a subfolder where the sources are. The ``self.source_folder`` attribute and + the *current working directory* inside the ``source(self)`` method will be set with this subfolder. It is used in the cache when running + :command:`conan create` (relative to the cache source folder) as well as in a local folder when running :command:`conan source` + (relative to the local current folder). + +- **self.folders.build** (Defaulted to ""): Specifies a subfolder where the files from the build are. The ``self.build_folder`` attribute and + the *current working directory* inside the ``build(self)`` method will be set with this subfolder. It is used in the cache when running + :command:`conan create` (relative to the cache source folder) as well as in a local folder when running :command:`conan build` + (relative to the local current folder). + +- **self.folders.generators** (Defaulted to ""): Specifies a subfolder where to write the files from the generators and the toolchains. + In the cache, when running the :command:`conan create`, this subfolder will be relative to the root build folder and when running + the :command:`conan install` command it will be relative to the current working directory. + +- **self.folders.imports** (Defaulted to ""): Specifies a subfolder where to write the files copied when using the ``imports(self)`` + method in a ``conanfile.py``. In the cache, when running the :command:`conan create`, this subfolder will be relative to the root + build folder and when running the :command:`conan imports` command it will be relative to the current working directory. + +- **self.folders.package** (Defaulted to ""): Specifies a subfolder where to write the package files when running the :command:`conan package` + command. It is relative to the current working directory. This folder **will not** affect the package layout in the + cache. + +In the following example we are declaring a layout that follows the standard CLion one, where the build directory is ``cmake-build-release`` +or ``cmake-build-debug`` depending on the declared ``build_type`` setting. In this example, the sources of the project are in the ``src`` folder. +Also choosing the generators folders inside the build folder is quite convenient to include the :ref:`conan_toolchain.cmake` +file when using the :ref:`CMakeDeps` generator because it will be always in the same relative path to the build folder. + +.. code:: python + + from conans import ConanFile + + class Pkg(ConanFile): + + def layout(self): + self.folders.build = "cmake-build-{}".format(str(conanfile.settings.build_type).lower()) + self.folders.generators = os.path.join(self.folders.build, "generators") + self.folders.imports = self.folders.build + self.folders.source = "src" + +Given the previous example we can run the conan local methods without taking much care of the directories where the +files are or the build files should be: + +.. code:: bash + + # This will write the toolchains and generator files from the dependencies to the ``cmake-build-debug/generators`` + $ conan install . -if=my_install -s build_type=Debug + + # This will fetch the sources to the ./src folder if we are using the ``source(self)`` method. + $ conan source . -if=my_install + + # This will build the project using the declared source folder and ``cmake-build-debug`` as the build folder + $ conan build . -if=my_install + + # This will import, if declared imports(self) method, the files to the ``cmake-build-debug`` folder + $ conan imports . -if=my_install + +.. note:: + + Maybe you are wondering why the **install folder** is not parametrized and has to be specified with the ``-if`` + argument. + Currently, Conan generates several files like the ``graph_info.json`` and the ``conanbuildinfo.txt`` that + are read to restore the configuration saved (settings, options, etc) to be applied in the local commands. + That configuration is needed before running the ``layout()`` method because the folders might depend on the settings + like in the previous example. It is a kind of a chicken-egg issue. In Conan 2.0, likely, the + configuration won't be stored, and the local methods like :command:`conan build .` will compute the graph + from arguments (--profile, -s, -o...) and won't need the ``--if`` argument anymore, being always trivial to run. + + +self.infos +++++++++++ + +The ``layout()`` method allows to declare ``cpp_info`` objects not only for the final package (like the classic approach with +the ``self.cpp_info`` in the ``package_info(self)`` method) but for the ``self.source_folder`` and ``self.build_folder``. +This is useful when a package is in :ref:`editable mode` to automatically propagate to the consumers +all the needed information (library names, include directories...) but pointing to the local project directories while developing, +whether you are calling directly your build-system, using an IDE or executing the :command:`conan build` command to build +your code. + + +Example: + +.. code:: python + + from conans import ConanFile + + class Pkg(ConanFile): + + def layout(self): + + self.infos.source.includedirs = ["include"] + + self.infos.build.libdirs = ["."] + self.infos.build.libs = ["mylib"] + self.infos.build.includedirs = ["gen_include"] + + self.infos.package.libs = ["mylib"] + + +The fields of the cpp_info objects at ``self.info.build`` and ``self.info.source`` are the same described :ref:`here`. +Components are also supported. + +.. note:: + + You can still use the ``package_info(self)`` method. The received `self.cpp_info` object will be populated with the information explicitly declared + in the ``self.infos.package`` object, so you can complete it or modify it later. + +self.patterns ++++++++++++++ + +You can fill the ``self.patterns.source`` and ``self.patterns.build`` objects describing the patterns of the files that are at the ``self.folders.source`` and ``self.folders.build`` +to automate the ``package(self)`` method with the **LayoutPackager()** tool. FIXME: LINK TO REFERENCE + +The defaults are the following but you can customize anything based on the configuration (``self.settings``, ``self.options``...): + +.. code:: python + + self.patterns.source.include = ["*.h", "*.hpp", "*.hxx"] + self.patterns.source.lib = [] + self.patterns.source.bin = [] + + self.patterns.build.include = ["*.h", "*.hpp", "*.hxx"] + self.patterns.build.lib = ["*.so", "*.so.*", "*.a", "*.lib", "*.dylib"] + self.patterns.build.bin = ["*.exe", "*.dll"] + + +These are all the fields that can be adjusted, both in ``self.patterns.source`` and ``self.patterns.build``: + ++--------------------------------------+---------------------------------------------------------------------------------------------------------+ +| NAME | DESCRIPTION (xxx can be either ``build`` or ``source``) | ++======================================+=========================================================================================================+ +| include | Patterns of the files from the folders: ``self.infos.xxx.includedirs`` | ++--------------------------------------+---------------------------------------------------------------------------------------------------------+ +| lib | Patterns of the files from the folders: ``self.infos.xxx.libdirs`` | ++--------------------------------------+---------------------------------------------------------------------------------------------------------+ +| bin | Patterns of the files from the folders: ``self.infos.xxx.bindirs`` | ++--------------------------------------+---------------------------------------------------------------------------------------------------------+ +| src | Patterns of the files from the folders: ``self.infos.xxx.srcdirs`` | ++--------------------------------------+---------------------------------------------------------------------------------------------------------+ +| build | Patterns of the files from the folders: ``self.infos.xxx.builddirs`` | ++--------------------------------------+---------------------------------------------------------------------------------------------------------+ +| res | Patterns of the files from the folders: ``self.infos.xxx.resdirs`` | ++--------------------------------------+---------------------------------------------------------------------------------------------------------+ +| framework | Patterns of the files from the folders: ``self.infos.xxx.frameworkdirs`` | ++--------------------------------------+---------------------------------------------------------------------------------------------------------+ + + +Putting everything together ++++++++++++++++++++++++++++ + +Let's see how we can use the ``layout()`` method to both write simpler recipes, improve the local methods and the integration +with the IDE and develop the package as an :ref:`editable package`. + +This is the project structure: + +.. code-block:: text + + + | - CMakeLists.txt + | - hello.cpp + | - include + | - hello.h + | - res + | - myasset.jpg + +We want to use CLion to build the project so we open the project (using both **Release** and **Debug** configurations). +After building the project we have this layout: + +.. code-block:: text + + + | - cmake-build-debug + | - CMakeFiles + | - ... other CMake stuff... + | - libhello.a + | - gen.h + | - cmake-build-release + | - CMakeFiles + | - ... other CMake stuff... + | - libhello.a + | - gen.h + | - CMakeLists.txt + | - hello.cpp + | - include + | - hello.h + | - res + | - myasset.jpeg + + +We can write a ``layout()`` method describing it: + +.. code:: python + + from conans import ConanFile + from conan.tools.layout import LayoutPackager + + class Pkg(ConanFile): + + def layout(self): + # ###### FOLDERS + # The sources can be found in the root dir + self.folders.source = ["."] + + # The build folder is created with the CLion way + self.folders.build = "cmake-build-{}".format(str(conanfile.settings.build_type).lower()) + + # We want to have the toolchains in the build folder so we can always pass + # `-DCMAKE_TOOLCHAIN_FILE=generators/conan_toolchain.cmake` to CMake + self.folders.generators = os.path.join(self.folders.build, "generators") + + # In case we use "conan package" we declare an output directory + self.folders.package = "package-{}".format(str(conanfile.settings.build_type).lower()) + + # ###### INFOS + self.infos.source.includedirs = ["include"] # Relative to ["."] (self.folders.source) + self.infos.build.libdirs = ["."] # Relative to (self.folders.build) + self.infos.build.libs = ["hello"] + self.infos.build.includedirs = ["."] # Relative to (self.folders.build) + self.infos.package.libs = ["hello"] + + # ###### PATTERNS + self.patterns.source.res = ["*.jpeg"] # To package automatically the myasset.jpeg + + def package(self): + LayoutPackager(self).package() + + +- There is no need to declare the ``package_info(self)`` method, we declared the needed information at ``self.infos.package``. +- The ``package(self)`` method is quite simple using the ``LayoutPackager(self).package()`` +- We can easily put the package in editable mode and keep using the CLion IDE to build the libraries: + + .. code:: bash + + $ conan editable add . hello/1.0 + + The packages requiring "hello/1.0" will find the headers and libraries in the right CLion output directories automatically. + +- If we want to verify the that the Conan recipe is totally correct we can use the Conan local methods always with the same syntax: + + .. code:: bash + + $ conan install . -if=my_install + $ conan imports . -if=my_install + $ conan build . -if=my_install + $ conan package . -if=my_install + + The conan commands will follow the same directory layout while building, and the ``conan package`` command will + create an additional ``package-release`` folder with the packaged artifacts. From bd8a6a6105857c485f821b8e8d4ff57d29e7e2bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Mart=C3=ADnez=20de=20Bartolom=C3=A9?= Date: Fri, 30 Apr 2021 14:36:13 +0200 Subject: [PATCH 131/681] renamed infos to cpp --- reference/conanfile/methods.rst | 44 ++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 7815ca73cdde..cd3a701b5209 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1460,7 +1460,7 @@ layout() Available since: `1.37.0 `_ Method to describe the package contents, not only the final package but the layout while developing the package. -In the layout method you can adjust 3 different things, ``self.folders``, ``self.patterns`` and ``self.infos`` +In the layout method you can adjust 3 different things, ``self.folders``, ``self.patterns`` and ``self.cpp`` self.folders ++++++++++++ @@ -1534,8 +1534,8 @@ files are or the build files should be: from arguments (--profile, -s, -o...) and won't need the ``--if`` argument anymore, being always trivial to run. -self.infos -++++++++++ +self.cpp +++++++++ The ``layout()`` method allows to declare ``cpp_info`` objects not only for the final package (like the classic approach with the ``self.cpp_info`` in the ``package_info(self)`` method) but for the ``self.source_folder`` and ``self.build_folder``. @@ -1555,13 +1555,13 @@ Example: def layout(self): - self.infos.source.includedirs = ["include"] + self.cpp.source.includedirs = ["include"] - self.infos.build.libdirs = ["."] - self.infos.build.libs = ["mylib"] - self.infos.build.includedirs = ["gen_include"] + self.cpp.build.libdirs = ["."] + self.cpp.build.libs = ["mylib"] + self.cpp.build.includedirs = ["gen_include"] - self.infos.package.libs = ["mylib"] + self.cpp.package.libs = ["mylib"] The fields of the cpp_info objects at ``self.info.build`` and ``self.info.source`` are the same described :ref:`here`. @@ -1570,7 +1570,7 @@ Components are also supported. .. note:: You can still use the ``package_info(self)`` method. The received `self.cpp_info` object will be populated with the information explicitly declared - in the ``self.infos.package`` object, so you can complete it or modify it later. + in the ``self.cpp.package`` object, so you can complete it or modify it later. self.patterns +++++++++++++ @@ -1596,19 +1596,19 @@ These are all the fields that can be adjusted, both in ``self.patterns.source`` +--------------------------------------+---------------------------------------------------------------------------------------------------------+ | NAME | DESCRIPTION (xxx can be either ``build`` or ``source``) | +======================================+=========================================================================================================+ -| include | Patterns of the files from the folders: ``self.infos.xxx.includedirs`` | +| include | Patterns of the files from the folders: ``self.cpp.xxx.includedirs`` | +--------------------------------------+---------------------------------------------------------------------------------------------------------+ -| lib | Patterns of the files from the folders: ``self.infos.xxx.libdirs`` | +| lib | Patterns of the files from the folders: ``self.cpp.xxx.libdirs`` | +--------------------------------------+---------------------------------------------------------------------------------------------------------+ -| bin | Patterns of the files from the folders: ``self.infos.xxx.bindirs`` | +| bin | Patterns of the files from the folders: ``self.cpp.xxx.bindirs`` | +--------------------------------------+---------------------------------------------------------------------------------------------------------+ -| src | Patterns of the files from the folders: ``self.infos.xxx.srcdirs`` | +| src | Patterns of the files from the folders: ``self.cpp.xxx.srcdirs`` | +--------------------------------------+---------------------------------------------------------------------------------------------------------+ -| build | Patterns of the files from the folders: ``self.infos.xxx.builddirs`` | +| build | Patterns of the files from the folders: ``self.cpp.xxx.builddirs`` | +--------------------------------------+---------------------------------------------------------------------------------------------------------+ -| res | Patterns of the files from the folders: ``self.infos.xxx.resdirs`` | +| res | Patterns of the files from the folders: ``self.cpp.xxx.resdirs`` | +--------------------------------------+---------------------------------------------------------------------------------------------------------+ -| framework | Patterns of the files from the folders: ``self.infos.xxx.frameworkdirs`` | +| framework | Patterns of the files from the folders: ``self.cpp.xxx.frameworkdirs`` | +--------------------------------------+---------------------------------------------------------------------------------------------------------+ @@ -1679,11 +1679,11 @@ We can write a ``layout()`` method describing it: self.folders.package = "package-{}".format(str(conanfile.settings.build_type).lower()) # ###### INFOS - self.infos.source.includedirs = ["include"] # Relative to ["."] (self.folders.source) - self.infos.build.libdirs = ["."] # Relative to (self.folders.build) - self.infos.build.libs = ["hello"] - self.infos.build.includedirs = ["."] # Relative to (self.folders.build) - self.infos.package.libs = ["hello"] + self.cpp.source.includedirs = ["include"] # Relative to ["."] (self.folders.source) + self.cpp.build.libdirs = ["."] # Relative to (self.folders.build) + self.cpp.build.libs = ["hello"] + self.cpp.build.includedirs = ["."] # Relative to (self.folders.build) + self.cpp.package.libs = ["hello"] # ###### PATTERNS self.patterns.source.res = ["*.jpeg"] # To package automatically the myasset.jpeg @@ -1692,7 +1692,7 @@ We can write a ``layout()`` method describing it: LayoutPackager(self).package() -- There is no need to declare the ``package_info(self)`` method, we declared the needed information at ``self.infos.package``. +- There is no need to declare the ``package_info(self)`` method, we declared the needed information at ``self.cpp.package``. - The ``package(self)`` method is quite simple using the ``LayoutPackager(self).package()`` - We can easily put the package in editable mode and keep using the CLion IDE to build the libraries: From 4d6ed9f29583ce50fbbfbcb7985cdec1d91eb081 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 5 May 2021 11:54:33 +0200 Subject: [PATCH 132/681] Remove bintray references (#2094) * deprecate bintray * review --- README.md | 8 ++--- _themes/conan/layout.html | 4 +-- faq/using.rst | 8 ++--- getting_started.rst | 6 ++-- howtos/collaborate_packages.rst | 3 +- integrations/ci/appveyor.rst | 13 ++++---- integrations/ci/circleci.rst | 13 ++++---- integrations/ci/gitlab.rst | 13 ++++---- integrations/ci/travisci.rst | 15 ++++----- integrations/custom.rst | 2 +- reference/commands/creator/new.rst | 2 +- reference/commands/misc/remote.rst | 6 ++-- reference/commands/output/install.rst | 4 +-- reference/commands/output/upload.rst | 32 +++++++++---------- reference/conanfile/attributes.rst | 6 ++-- reference/config_files/conan.conf.rst | 2 +- reference/config_files/conandata.yml.rst | 4 +-- .../artifactory/artifactory_cloud.rst | 6 ++-- .../artifactory/conan_center_guide.rst | 6 +--- uploading_packages/remotes.rst | 16 +++++----- using_packages/conanfile_txt.rst | 2 +- versioning/revisions.rst | 8 ++--- 22 files changed, 82 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index c06915e426f0..a05e46adac26 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,7 @@ Use them in the following importance order: ``` .. warning:: - In the Bintray repositories there are binaries for several mainstream compilers... + In the ConanCenter repository there are binaries for several mainstream compilers... ``` ``` @@ -210,12 +210,8 @@ Submit a request to include it in `conan-center`_. ... ... -.. _`conan-center`: https://bintray.com/conan/conan-center +.. _`conan-center`: https://center.conan.io ``` In case you want to use explicit external references with a link, make sure it doesn't exceed the maximum line length, otherwise it should considered to be written as a normal external reference. - -``` -If you are just evaluating conan, you can create an account on https://bintray.com -``` diff --git a/_themes/conan/layout.html b/_themes/conan/layout.html index df267f14b055..0bf9590339e7 100644 --- a/_themes/conan/layout.html +++ b/_themes/conan/layout.html @@ -158,11 +158,11 @@ {% include "breadcrumbs.html" %} -
+
{% block body %}{% endblock %} diff --git a/faq/using.rst b/faq/using.rst index ef724856bb5e..bad33efe756e 100644 --- a/faq/using.rst +++ b/faq/using.rst @@ -36,7 +36,7 @@ Besides the impossibility on the technical side, there are also other reasons li - Packages should be fully relocatable to a different location. Users should be able to retrieve their dependencies and upload a copy to their own private server, and fully disconnect from the external world. This is critical for robust and secure production environments, and avoid problems that other ecosystems like NPM have had in the past. As a consequence, all recipes dependencies should not be coupled to any location, and be abstract as conan "requires" are. - Other languages, like Java (which would be the closest one regarding enterprise-ness), never provided this feature. Languages like golang, that based its dependency management on this feature, has also evolved away from it and towards abstract "module" concepts that can be hosted in different servers -So there are no plans to support this approach, and the client-server architecture will continue to be the proposed solution. There are several alternatives for the servers from different vendors, for public open source packages `ConanCenter `_ is the recommended one, and for private packages, the free `ArtifactoryCE `_ is a simple and powerful solution. +So there are no plans to support this approach, and the client-server architecture will continue to be the proposed solution. There are several alternatives for the servers from different vendors, for public open source packages `ConanCenter `_ is the recommended one, and for private packages, the free `Artifactory CE `_ is a simple and powerful solution. How to obtain the dependents of a given package? @@ -153,7 +153,7 @@ The lookup remote order is defined by the command :command:`conan remote`: .. code-block:: bash $ conan remote list - conan-center: https://conan.bintray.com [Verify SSL: True] + conan-center: https://center.conan.io [Verify SSL: True] myremote: https://MyTeamServerIP:8081/artifactory/api/conan/myremote [Verify SSL: True] As you can see, the remote ``conan-center`` is listed on index **0**, which means it has the highest priority when searching or installing a package, @@ -164,7 +164,7 @@ followed by ``myremote``, on index **1**. To update the index order, the argumen $ conan remote update myremote https://MyTeamServerIP:8081/artifactory/api/conan/myremote --insert $ conan remote list myremote: https://MyTeamServerIP:8081/artifactory/api/conan/myremote [Verify SSL: True] - conan-center: https://conan.bintray.com [Verify SSL: True] + conan-center: https://center.conan.io [Verify SSL: True] The ``--insert`` argument means *index 0*, the highest priority, thus the ``myremote`` remote will be updated as the first remote to be used. @@ -177,7 +177,7 @@ It's also possible to define a specific index when adding a remote to the list: $ conan remote list myremote: https://MyTeamServerIP:8081/artifactory/api/conan/myremote [Verify SSL: True] otherremote: https://MyCompanyOtherIP:8081/artifactory/api/conan/otherremote [Verify SSL: True] - conan-center: https://conan.bintray.com [Verify SSL: True] + conan-center: https://center.conan.io [Verify SSL: True] The ``otherremote`` remote needs to be added after ``myremote``, so we need to set the remote index as **1**. diff --git a/getting_started.rst b/getting_started.rst index a62036485d25..f0ca148de5f5 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -310,7 +310,7 @@ To inspect all your current project's dependencies use the :command:`conan info` openssl/1.0.2t ID: eb50d18a5a5d59bd0c332464a4c348ab65e353bf BuildID: None - Remote: conan-center=https://api.bintray.com/conan/conan/conan-center + Remote: conan-center=https://center.conan.io URL: https://github.com/conan-io/conan-center-index Homepage: https://github.com/openssl/openssl License: OpenSSL @@ -327,7 +327,7 @@ To inspect all your current project's dependencies use the :command:`conan info` poco/1.9.4 ID: 645aaff0a79e6036c77803601e44677556109dd9 BuildID: None - Remote: conan-center=https://api.bintray.com/conan/conan/conan-center + Remote: conan-center=https://center.conan.io URL: https://github.com/conan-io/conan-center-index Homepage: https://pocoproject.org License: BSL-1.0 @@ -344,7 +344,7 @@ To inspect all your current project's dependencies use the :command:`conan info` zlib/1.2.11 ID: f74366f76f700cc6e991285892ad7a23c30e6d47 BuildID: None - Remote: conan-center=https://api.bintray.com/conan/conan/conan-center + Remote: conan-center=https://center.conan.io URL: https://github.com/conan-io/conan-center-index Homepage: https://zlib.net License: Zlib diff --git a/howtos/collaborate_packages.rst b/howtos/collaborate_packages.rst index cf295dcee190..72ce0e9cecba 100644 --- a/howtos/collaborate_packages.rst +++ b/howtos/collaborate_packages.rst @@ -26,8 +26,7 @@ You can just directly run: $ conan create . demo/testing -Once you have generated the desired binaries, you can store your pre-compiled binaries in your Bintray repository or on your own Conan -server: +Once you have generated the desired binaries, you can store your pre-compiled binaries in your own free Artifactory CE repository: .. code-block:: bash diff --git a/integrations/ci/appveyor.rst b/integrations/ci/appveyor.rst index 8c16766f1da0..2864237e53ad 100644 --- a/integrations/ci/appveyor.rst +++ b/integrations/ci/appveyor.rst @@ -68,22 +68,21 @@ You can use Appveyor to automate the building of binary packages, which will be cloud after pushing to Github. You can probably set up your own way, but Conan has some utilities to help in the process. The command :command:`conan new` has arguments to create a default working *appveyor.yml* file. Other setups might be possible, but for this -example we are assuming that you are using GitHub and also uploading your final packages to Bintray. You could follow these steps: +example we are assuming that you are using GitHub and also uploading your final packages to your own free Artifactory CE repository. You could follow these steps: #. First, create an empty github repository. Let's call it "hello", for creating a "hello world" package. Github allows to create it with a Readme and .gitignore. -#. Get the credentials User and API Key. (Remember, Bintray uses the API key as "password", not your main Bintray account password.) -#. Create a Conan repository in Bintray under your user or organization, and get its URL ("Set me up"). We will call it ``UPLOAD_URL`` +#. Create a Conan repository in your Artifactory CE, and get its URL ("Set me up"). We will call it ``UPLOAD_URL`` #. Activate the repo in your Appveyor account, so it is built when we push changes to it. -#. Under *Appveyor Settings->Environment*, add the ``CONAN_PASSWORD`` environment variable with the Bintray API Key, and encrypt it. If your Bintray user is different from the package user, you can define your Bintray username too, defining the environment variable ``CONAN_LOGIN_USERNAME`` +#. Under *Appveyor Settings->Environment*, add the ``CONAN_LOGIN_USERNAME`` and ``CONAN_PASSWORD`` environment variables with the Artifactory CE user and password. #. Clone the repo: ``$ git clone && cd hello`` -#. Create the package: :command:`conan new hello/0.1@/testing -t -s -ciw -cis -ciu=UPLOAD_URL` where **user** is your Bintray username +#. Create the package: :command:`conan new hello/0.1@myteam/testing -t -s -ciw -cis -ciu=UPLOAD_URL` #. You can inspect the created files: both *appveyor.yml* and the *build.py* script, that is used by **conan-package-tools** utility to split different builds with different configurations in different appveyor jobs. #. You can test locally, before pushing, with :command:`conan create` #. Add the changes, commit and push: :command:`git add . && git commit -m "first commit" && git push` #. Go to Appveyor and see the build, with the different jobs. -#. When it finish, go to your Bintray repository, you should see there the uploaded packages for different configurations -#. Check locally, searching in Bintray: :command:`conan search hello/0.1@/testing -r=mybintray` +#. When it finish, go to your Artifactory CE repository, you should see there the uploaded packages for different configurations +#. Check locally, searching in Artifactory CE: :command:`conan search hello/0.1@myteam/testing -r=myrepo` If something fails, please report an issue in the ``conan-package-tools`` github repository: https://github.com/conan-io/conan-package-tools diff --git a/integrations/ci/circleci.rst b/integrations/ci/circleci.rst index ecb2aed15624..9fb76c79a8b1 100644 --- a/integrations/ci/circleci.rst +++ b/integrations/ci/circleci.rst @@ -64,21 +64,20 @@ You can use CircleCI to automate the building of binary packages, which will be cloud after pushing to Github. You can probably set up your own way, but Conan has some utilities to help in the process. The command ``conan new`` has arguments to create a default working ``.circleci/config.yml`` file. -Other setups might be possible, but for this example we are assuming that you are using github and also uploading your final packages to Bintray. +Other setups might be possible, but for this example we are assuming that you are using github and also uploading your final packages to your own Artifactory CE server. You could follow these steps: #. First, create an empty Github repository (let's call it "hello") for creating a "hello world" package. Github allows to create it with a Readme, license and .gitignore. -#. Get the credentials User and API Key (remember, Bintray uses the API key as "password", not your main Bintray account password) -#. Create a Conan repository in Bintray under your user or organization, and get its URL ("Set me up"). We will call it ``UPLOAD_URL`` -#. Under your project page, *Settings -> Pipelines -> Add a variable*, add the ``CONAN_PASSWORD`` environment variable with the Bintray API Key. If your Bintray user is different from the package user, you can also define your Bintray username, defining the environment variable ``CONAN_LOGIN_USERNAME`` +#. Create a Conan repository in your Artifactory CE and get its URL ("Set me up"). We will call it ``UPLOAD_URL`` +#. Under your project page, *Settings -> Pipelines -> Add a variable*, add the ``CONAN_LOGIN_USERNAME`` and ``CONAN_PASSWORD`` environment variables with the Artifactory CE user and password. #. Clone the repo: ``$ git clone && cd hello`` -#. Create the package: ``$ conan new hello/0.1@/testing -t -s -ciccg -ciccc -cicco -cis -ciu=UPLOAD_URL`` where ``user`` is your Bintray username +#. Create the package: ``$ conan new hello/0.1@myteam/testing -t -s -ciccg -ciccc -cicco -cis -ciu=UPLOAD_URL`` #. You can inspect the created files: both ``.circleci/config.yml`` and the ``build.py`` script, that is used by ``conan-package-tools`` utility to split different builds with different configurations in different GitLab CI jobs. #. You can test locally, before pushing, with ``$ conan create`` #. Add the changes, commit and push: ``$ git add . && git commit -m "first commit" && git push`` #. Go to Pipelines page and see the pipeline, with the different jobs. -#. When it has finished, go to your Bintray repository, you should see there the uploaded packages for different configurations -#. Check locally, searching in Bintray: ``$ conan search hello/0.1@/testing -r=mybintray`` +#. When it has finished, go to your Artifactory CE repository, you should see there the uploaded packages for different configurations +#. Check locally, searching in Artifactory CE: ``$ conan search hello/0.1@myteam/testing -r=myremote`` If something fails, please report an issue in the ``conan-package-tools`` github repository: https://github.com/conan-io/conan-package-tools diff --git a/integrations/ci/gitlab.rst b/integrations/ci/gitlab.rst index f3ea71c0568d..32346311a8b9 100644 --- a/integrations/ci/gitlab.rst +++ b/integrations/ci/gitlab.rst @@ -61,22 +61,21 @@ Creating, testing and uploading Conan binary packages You can use Gitlab CI to automate the building of binary packages, which will be created in the cloud after pushing to Gitlab. You can probably setup your own way, but Conan has some utilities to help in the process. The command :command:`conan new` has arguments to create a default working ``.gitlab-ci.yml`` file. -Other setups might be possible, but for this example we are assuming that you are using github and also uploading your final packages to Bintray. +Other setups might be possible, but for this example we are assuming that you are using github and also uploading your final packages to your own Artifactory CE server. You could follow these steps: #. First, create an empty gitlab repository, let's call it "hello", for creating a "hello world" package. Gitlab allows to create it with a Readme, license and .gitignore. -#. Get the credentials User and API Key (remember, Bintray uses the API key as "password", not your main Bintray account password) -#. Create a Conan repository in Bintray under your user or organization, and get its URL ("Set me up"). We will call it ``UPLOAD_URL`` -#. Under your project page, *Settings -> Pipelines -> Add a variable*, add the ``CONAN_PASSWORD`` environment variable with the Bintray API Key. If your Bintray user is different from the package user, you can also define your Bintray username, defining the environment variable ``CONAN_LOGIN_USERNAME`` +#. Create a Conan repository in Artifactory CE, and get its URL ("Set me up"). We will call it ``UPLOAD_URL`` +#. Under your project page, *Settings -> Pipelines -> Add a variable*, add the ``CONAN_LOGIN_USERNAME`` and ``CONAN_PASSWORD`` environment variables with the Artifactory CE user and password. #. Clone the repo: :command:`git clone && cd hello`. -#. Create the package: :command:`conan new hello/0.1@/testing -t -s -ciglg -ciglc -cis -ciu=UPLOAD_URL` where **user** is your Bintray username. +#. Create the package: :command:`conan new hello/0.1@myteam/testing -t -s -ciglg -ciglc -cis -ciu=UPLOAD_URL` #. You can inspect the created files: both *.gitlab-ci.yml* and the *build.py* script, that is used by **conan-package-tools** utility to split different builds with different configurations in different GitLab CI jobs. #. You can test locally, before pushing, with :command:`conan create` or by GitLab Runner. #. Add the changes, commit and push: :command:`git add . && git commit -m "first commit" && git push`. #. Go to Pipelines page and see the pipeline, with the different jobs. -#. When it has finished, go to your Bintray repository, you should see there the uploaded packages for different configurations. -#. Check locally, searching in Bintray: :command:`conan search hello/0.1@/testing -r=mybintray`. +#. When it has finished, go to your Artifactory CE repository, you should see there the uploaded packages for different configurations. +#. Check locally, searching in Artifactory CE: :command:`conan search hello/0.1@myteam/testing -r=myremote`. If something fails, please report an issue in the **conan-package-tools** github repository: https://github.com/conan-io/conan-package-tools diff --git a/integrations/ci/travisci.rst b/integrations/ci/travisci.rst index 6eb6f40e90d5..8079a3f5ea5a 100644 --- a/integrations/ci/travisci.rst +++ b/integrations/ci/travisci.rst @@ -55,26 +55,23 @@ You can also use Travis CI to automate building new Conan binary packages with e your own way, but Conan has some utilities to help in the process. The command :command:`conan new` has arguments to create a default working *.travis.yml* file. Other setups might be possible, but for this -example we are assuming that you are using GitHub and also uploading your final packages to Bintray. +example we are assuming that you are using GitHub and also uploading your final packages to your Artifactory CE server. You could follow these steps: #. First, create an empty GitHub repository. Let's call it "hello", for creating a "hello world" package. GitHub allows creating it with a Readme and .gitignore. -#. Get the credentials User and API Key. (Remember, Bintray uses the API key as "password", not your main Bintray account password.) -#. Create a Conan repository in Bintray under your user or organization, and get its URL ("Set me up"). We will call it ``UPLOAD_URL`` +#. Create a Conan repository in your Artifactory CE, and get its URL ("Set me up"). We will call it ``UPLOAD_URL`` #. Activate the repo in your Travis account, so it is built when we push changes to it. -#. Under *Travis More Options -> Settings->Environment Variables*, add the ``CONAN_PASSWORD`` environment variable with the Bintray API Key. - If your Bintray user is different from the package user, you can also define your Bintray username, defining the environment variable - ``CONAN_LOGIN_USERNAME``. +#. Under *Travis More Options -> Settings->Environment Variables*, add the ``CONAN_LOGIN_USERNAME`` and ``CONAN_PASSWORD`` environment variables with the Artifactory CE user and password. #. Clone the repo: :command:`git clone && cd hello`. -#. Create the package: :command:`conan new hello/0.1@/testing -t -s -cilg -cis -ciu=UPLOAD_URL` where **user** is your Bintray username. +#. Create the package: :command:`conan new hello/0.1@myteam/testing -t -s -cilg -cis -ciu=UPLOAD_URL` #. You can inspect the created files: both *.travis.yml*, *.travis/run.sh*, and ``.travis/install.sh`` and the *build.py* script, that is used by **conan-package-tools** utility to split different builds with different configurations in different Travis CI jobs. #. You can test locally, before pushing, with :command:`conan test`. #. Add the changes, commit and push: :command:`git add . && git commit -m "first commit" && git push`. #. Go to Travis and see the build, with the different jobs. -#. When it has finished, go to your Bintray repository, you should see there the uploaded packages for different configurations. -#. Check locally, searching in Bintray: :command:`conan search hello/0.1@/testing -r=mybintray`. +#. When it has finished, go to your Artifactory CE repository, you should see there the uploaded packages for different configurations. +#. Check locally, searching in Artifactory CE: :command:`conan search hello/0.1@myteam/testing -r=myremote`. If something fails, please report an issue in the ``conan-package-tools`` GitHub repository: https://github.com/conan-io/conan-package-tools diff --git a/integrations/custom.rst b/integrations/custom.rst index 1b2e0847d5b6..c4a966c72b30 100644 --- a/integrations/custom.rst +++ b/integrations/custom.rst @@ -7,7 +7,7 @@ Custom integrations If you intend to use a build system that does not have a built-in generator, you may still be able to do so. There are several options: -- First, search in Bintray for generator packages. Generators can be created and contributed by users as regular packages, so you can depend +- First, search in ConanCenter for generator packages. Generators can be created and contributed by users as regular packages, so you can depend on them as a normal requirement, use versioning and evolve faster without depending on the Conan releases. - You can use the :ref:`text_generator` or :ref:`json_generator` generators. They will generate a text file, simple to read that you can diff --git a/reference/commands/creator/new.rst b/reference/commands/creator/new.rst index abddd1f18576..0bb39e855eba 100644 --- a/reference/commands/creator/new.rst +++ b/reference/commands/creator/new.rst @@ -87,7 +87,7 @@ Creates a new package recipe template with a 'conanfile.py' and optionally, .. code-block:: bash - $ conan new mypackage/1.0@myuser/stable -t -ciglg -ciglc -ciu https://api.bintray.com/conan/myuser/myrepo + $ conan new mypackage/1.0@myuser/stable -t -ciglg -ciglc -ciu https://myrepo.url - Create files from a custom, predefined, user template recipe or template directory: diff --git a/reference/commands/misc/remote.rst b/reference/commands/misc/remote.rst index 86dbd40f4780..6656093387ee 100644 --- a/reference/commands/misc/remote.rst +++ b/reference/commands/misc/remote.rst @@ -46,7 +46,7 @@ Manages the remote list and the package recipes associated with a remote. .. code-block:: bash $ conan remote list - conan-center: https://conan.bintray.com [Verify SSL: True] + conan-center: https://center.conan.io [Verify SSL: True] local: http://localhost:9300 [Verify SSL: True, Disabled: True] - List remotes in a format almost valid for the *remotes.txt* to use with :ref:`conan_config_install`, only need @@ -55,7 +55,7 @@ Manages the remote list and the package recipes associated with a remote. .. code-block:: bash $ conan remote list --raw - conan-center https://conan.bintray.com True + conan-center https://center.conan.io True local http://localhost:9300 True True # capture the current remotes in a text file $ conan remote list --raw > remotes.txt @@ -139,7 +139,7 @@ the command will insert the remote in the specified position .. code-block:: bash - $ conan remote list_ref --no-remote + $ conan remote list_ref --no-remote spdlog/1.8.0: None restinio/0.6.10: None opencv/2.4.13.7: None diff --git a/reference/commands/output/install.rst b/reference/commands/output/install.rst index 5cfc22adb153..303fc361b9ce 100644 --- a/reference/commands/output/install.rst +++ b/reference/commands/output/install.rst @@ -63,7 +63,7 @@ The output JSON contains a two first level keys: "downloaded": true, "exported": false, "error": null, - "remote": "https://conan.bintray.com", + "remote": "https://center.conan.io", "time": "2020-01-30T19:19:21.217923", "dependency": true, "name": "openssl", @@ -76,7 +76,7 @@ The output JSON contains a two first level keys: "downloaded": true, "exported": false, "error": null, - "remote": "https://conan.bintray.com", + "remote": "https://center.conan.io", "time": "2020-01-30T19:19:27.662199", "built": false, "cpp_info": { diff --git a/reference/commands/output/upload.rst b/reference/commands/output/upload.rst index d76bc453d20b..39dbc155c144 100644 --- a/reference/commands/output/upload.rst +++ b/reference/commands/output/upload.rst @@ -44,32 +44,32 @@ The output JSON contains a two first level keys: "recipe":{ "id":"hello/0.1@conan/testing", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:19.204728" }, "packages":[ { "id":"3f3387d49612e03a5306289405a2101383b861f0", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:21.534877" }, { "id":"6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:23.934152" }, { "id":"889d5d7812b4723bd3ef05693ffd190b1106ea43", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:28.195266" }, { "id":"e98aac15065fc710dffd1b4fbee382b087c3ad1d", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:30.495989" } ] @@ -78,14 +78,14 @@ The output JSON contains a two first level keys: "recipe":{ "id":"hello0/1.2.1@conan/testing", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:32.688651" }, "packages":[ { "id":"5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:34.991721" } ] @@ -94,14 +94,14 @@ The output JSON contains a two first level keys: "recipe":{ "id":"hello_app/0.1@conan/testing", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:36.901333" }, "packages":[ { "id":"6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:39.243895" } ] @@ -110,14 +110,14 @@ The output JSON contains a two first level keys: "recipe":{ "id":"hello_python_conan/0.1@conan/testing", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:41.181543" }, "packages":[ { "id":"5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:43.749422" } ] @@ -126,14 +126,14 @@ The output JSON contains a two first level keys: "recipe":{ "id":"hello_python_reuse_conan/0.1@conan/testing", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:45.614096" }, "packages":[ { "id":"6a051b2648c89dbd1f8ada0031105b287deea9d2", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:47.942491" } ] @@ -142,7 +142,7 @@ The output JSON contains a two first level keys: "recipe":{ "id":"hdf5/1.8.20@acri/testing", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:48.291756" }, "packages":[ @@ -153,14 +153,14 @@ The output JSON contains a two first level keys: "recipe":{ "id":"http_parser/2.9.2", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:48.637576" }, "packages":[ { "id":"6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7", "remote_name":"conan-center", - "remote_url":"https://conan.bintray.com", + "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:51.125189" } ] diff --git a/reference/conanfile/attributes.rst b/reference/conanfile/attributes.rst index 6a9e1894fcb0..d1c2bc358928 100644 --- a/reference/conanfile/attributes.rst +++ b/reference/conanfile/attributes.rst @@ -130,7 +130,7 @@ topics Topics provide a useful way to group related tags together and to quickly tell developers what a package is about. Topics also make it easier for customers to find your recipe. It could be useful -to filter packages by topics or to reuse them in Bintray package page. +to filter packages by topics. The ``topics`` attribute should be a tuple with the needed topics inside. @@ -1043,7 +1043,7 @@ New properties ``cmake_target_name``, ``cmake_file_name``, ``pkg_config_name`` a ``cmake_build_modules`` are defined to allow migrating ``names``, ``filenames`` and ``build_modules`` properties to this model. In Conan 2.0 this will be the default way of setting these properties and also passing custom -properties to generators. +properties to generators. For most cases, it is recommended not to use the ``generator`` argument. The properties are generic for build systems, and different generators that integrate with a given build system could be reading such generic properties. For example, setting some cpp_info properties with the current model: @@ -1077,7 +1077,7 @@ New properties defined: - **cmake_file_name** property will affect all cmake generators that accept the ``filenames`` property (*cmake_find_package* and *cmake_find_package_multi*). -- **cmake_target_name** property will affect all cmake generators that accept the ``names`` property +- **cmake_target_name** property will affect all cmake generators that accept the ``names`` property (*cmake*, *cmake_multi*, *cmake_find_package*, *cmake_find_package_multi* and *cmake_paths*). - **cmake_build_modules** property will replace the ``build_modules`` property. - **pkg_config_name** property will set the ``names`` property for *pkg_config* generator. diff --git a/reference/config_files/conan.conf.rst b/reference/config_files/conan.conf.rst index ea4971a701ff..7360d1073165 100644 --- a/reference/config_files/conan.conf.rst +++ b/reference/config_files/conan.conf.rst @@ -87,7 +87,7 @@ The typical location of the **conan.conf** file is the directory ``~/.conan/``: # http = # hostname.to.be.proxied.com = http://user:pass@10.10.1.10:3128 # You can skip the proxy for the matching (fnmatch) urls (comma-separated) - # no_proxy_match = *bintray.com*, https://myserver.* + # no_proxy_match = *center.conan.io*, https://myserver.* [hooks] # environment CONAN_HOOKS attribute_checker diff --git a/reference/config_files/conandata.yml.rst b/reference/config_files/conandata.yml.rst index 64dcb812b81b..c27747b7a416 100644 --- a/reference/config_files/conandata.yml.rst +++ b/reference/config_files/conandata.yml.rst @@ -15,10 +15,10 @@ For example: sources: "1.70.0": - url: "https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.bz2" + url: "https://boostorg.jfrog.io/artifactory/main/release/1.70.0/source/boost_1_70_0.tar.bz2" sha256: "430ae8354789de4fd19ee52f3b1f739e1fba576f0aded0897c3c2bc00fb38778" "1.71.0": - url: "https://dl.bintray.com/boostorg/release/1.71.0/source/boost_1_71_0.tar.bz2" + url: "https://boostorg.jfrog.io/artifactory/main/release/1.70.0/source/boost_1_71_0.tar.bz2" sha256: "d73a8da01e8bf8c7eda40b4c84915071a8c8a0df4a6734537ddde4a8580524ee" patches: "1.70.0": diff --git a/uploading_packages/artifactory/artifactory_cloud.rst b/uploading_packages/artifactory/artifactory_cloud.rst index 11a2b1bb8082..8730c17bc65f 100644 --- a/uploading_packages/artifactory/artifactory_cloud.rst +++ b/uploading_packages/artifactory/artifactory_cloud.rst @@ -14,7 +14,7 @@ repository follow these steps: .. image:: ../../images/artifactory/conan-artifactory_create_account.png 2. **Add your Artifactory repository** - + To get the correct address, click on ``Application -> Artifactory -> Artifacts -> Set Me Up``: .. image:: ../../images/artifactory/conan-artifactory_setme_up.png @@ -30,7 +30,7 @@ repository follow these steps: Your API key is the “password” used to authenticate the Conan client to Artifactory, NOT your Artifatory password. To get your API key, go to “Set Me Up” and enter your account password. Your API key will appear on conan user command line listed on Set Me Up box: - + .. image:: ../../images/artifactory/conan-artifactory_token.png 5. **Set your user credentials** @@ -55,7 +55,7 @@ when adding it: $ conan remote add --insert 0 $ conan remote list : [Verify SSL: True] - conan-center: https://conan.bintray.com [Verify SSL: True] + conan-center: https://center.conan.io [Verify SSL: True] .. tip:: diff --git a/uploading_packages/artifactory/conan_center_guide.rst b/uploading_packages/artifactory/conan_center_guide.rst index f539feafc2f7..5ec86802a15a 100644 --- a/uploading_packages/artifactory/conan_center_guide.rst +++ b/uploading_packages/artifactory/conan_center_guide.rst @@ -3,10 +3,6 @@ Contributing Packages to Conan-center ===================================== -Contribution of packages to Conan-center is done via pull requests to the Github repository in https://github.com/conan-io/conan-center-index. The C3I (Conan-Center Continuous Integration) service will build binaries automatically from those pull requests, and once merged, will upload them to Bintray Conan-center. +Contribution of packages to ConanCenter is done via pull requests to the Github repository in https://github.com/conan-io/conan-center-index. The C3I (ConanCenter Continuous Integration) service will build binaries automatically from those pull requests, and once merged, will upload them to ConanCenter. Read more about how to `submit a pull request to Conan-center-index `_ - -.. warning:: - - The previous process to contribute to Conan-center, known as "inclusion requests" from Bintray is deprecated. It is not longer needed to create your own packages and upload them to your Bintray personal repo. Only the Github pull request will be needed. diff --git a/uploading_packages/remotes.rst b/uploading_packages/remotes.rst index 794e1224ba3e..2c51a909617c 100644 --- a/uploading_packages/remotes.rst +++ b/uploading_packages/remotes.rst @@ -36,29 +36,29 @@ For distribution: .. _conan_center: -Conan-center +ConanCenter ------------- -**Conan-center** (https://conan.io/center) is the main official repository for open source +**ConanCenter** (https://conan.io/center) is the main official repository for open source Conan packages. It is configured as the default remote in the Conan client, but if you want to add it manually: .. code-block:: bash - $ conan remote add conan-center https://conan.bintray.com + $ conan remote add conan-center https://center.conan.io -There are 2 different types of packages right now in Conan-center: +There are 2 different types of packages right now in ConanCenter: - **Packages with full reference**: Packages like `pkg/version@user/channel`. These packages binaries were created by users in their own - Bintray repositories, and included here. This flow of contributing packages to Conan-center is deprecated now. + Bintray repositories, and included here. This flow of contributing packages to ConanCenter is deprecated now. These packages are not recommended and should be considered as legacy. - **Packages without "user/channel"**: Can be used directly as `pkg/version`: These packages are created automatically from the central Github repository `conan-center-index `_, - with an automated build service: C3I (Conan-Center Continuous Integration). These packages are the recommended + with an automated build service: C3I (ConanCenter Continuous Integration). These packages are the recommended ones to use from ConanCenter. -To contribute packages to Conan-center, read the :ref:`conan-center guide ` for more information. +To contribute packages to ConanCenter, read the :ref:`conan-center guide ` for more information. -.. _`conan-center`: https://bintray.com/conan/conan-center +.. _`conan-center`: https://conan.io/center .. _Artifactory documentation: https://www.jfrog.com/confluence/display/JFROG/JFrog+Artifactory diff --git a/using_packages/conanfile_txt.rst b/using_packages/conanfile_txt.rst index 1786969b138f..1b6b93a8397d 100644 --- a/using_packages/conanfile_txt.rst +++ b/using_packages/conanfile_txt.rst @@ -307,4 +307,4 @@ for package management, not only for (but focused on) C/C++ libraries. To learn more about working with shared libraries, please refer to :ref:`Howtos/Manage shared libraries`. -.. _`pocoproject`: https://bintray.com/pocoproject/conan/Poco%3Apocoproject +.. _`pocoproject`: https://conan.io/center/poco diff --git a/versioning/revisions.rst b/versioning/revisions.rst index 9672ea7f5c51..dec2e8380dcf 100644 --- a/versioning/revisions.rst +++ b/versioning/revisions.rst @@ -12,7 +12,7 @@ The goal of the revisions feature is to achieve package immutability, the packag it later to force their usage, even if new versions or revisions were uploaded to the servers. Learn more about :ref:`lockfiles here.` - + How it works ------------ @@ -83,7 +83,7 @@ GIT and Line Endings on Windows **Problem** - Git will (by default) checkout files in Windows systems using CRLF line endings, effectively producing different files. As files are different, the Conan revisions will be different from the revisions computed in other platforms such as Linux, resulting in missing the respective binaries in the other revision. + Git will (by default) checkout files in Windows systems using CRLF line endings, effectively producing different files. As files are different, the Conan revisions will be different from the revisions computed in other platforms such as Linux, resulting in missing the respective binaries in the other revision. **Solution** @@ -93,10 +93,10 @@ It is necessary to instruct Git to do the checkout with the same line endings. T [auto] crlf = false - + Server support -------------- - ``conan_server`` >= 1.13. - ``Artifactory`` >= 6.9. - - ``Bintray``. + - ``ConanCenter``. From ec1d970a3141ba530d704a95b21a625b34c86c37 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Wed, 5 May 2021 08:03:12 -0300 Subject: [PATCH 133/681] Update Bincrafters remote url (#2095) Signed-off-by: Uilian Ries Co-authored-by: Daniel --- integrations/cross_platform/emscripten.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/cross_platform/emscripten.rst b/integrations/cross_platform/emscripten.rst index f49673a7a50d..124e56c70305 100644 --- a/integrations/cross_platform/emscripten.rst +++ b/integrations/cross_platform/emscripten.rst @@ -43,7 +43,7 @@ It will automatically download the `Emscripten SDK Date: Wed, 5 May 2021 13:27:51 -0300 Subject: [PATCH 134/681] Fix troubleshooting format (#2096) Signed-off-by: Uilian Ries --- faq/troubleshooting.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/faq/troubleshooting.rst b/faq/troubleshooting.rst index b8192fa3807f..69afd8374e4d 100644 --- a/faq/troubleshooting.rst +++ b/faq/troubleshooting.rst @@ -224,6 +224,7 @@ ERROR: Incompatible requirements obtained in different evaluations of 'requireme ------------------------------------------------------------------------------------ When two different packages require the same package as a dependency, but with different versions, will result in the following error: + .. code-block:: bash $ cat conanfile.txt @@ -234,11 +235,11 @@ When two different packages require the same package as a dependency, but with d $ conan install conanfile.txt - [...] - WARN: foobar/1.0.0: requirement foo/1.3.0 overridden by baz/1.0.0 to foo/1.0.0 - ERROR: baz/1.0.0: Incompatible requirements obtained in different evaluations of 'requirements' - Previous requirements: [foo/1.0.0] - New requirements: [foo/1.3.0] + [...] + WARN: foobar/1.0.0: requirement foo/1.3.0 overridden by baz/1.0.0 to foo/1.0.0 + ERROR: baz/1.0.0: Incompatible requirements obtained in different evaluations of 'requirements' + Previous requirements: [foo/1.0.0] + New requirements: [foo/1.3.0] As we can see in the following situation: the ``conanfile.txt`` requires 2 packages (``baz/1.0.0`` and ``foobar/1.0.0``) which both require the package named ``foo``. However, ``baz`` requires ``foo/1.0.0``, but ``foobar`` requires ``foo/1.3.0``. From ec8682f54dcc10198c01e18b7b08af9f15b253c3 Mon Sep 17 00:00:00 2001 From: Jerry Wiltse Date: Wed, 5 May 2021 15:02:34 -0400 Subject: [PATCH 135/681] add conan-in-practice video to docs --- videos.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/videos.rst b/videos.rst index 33bb33fc423e..11c30ebf2bca 100644 --- a/videos.rst +++ b/videos.rst @@ -15,6 +15,16 @@ Videos and links ================= +- Conan in Practice: Interactive Exercises of common commands + + .. raw:: html + +

From a7d90af0f9648e70483455feefdf164cc57cffdb Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Fri, 28 May 2021 14:15:45 +0200 Subject: [PATCH 145/681] Update developing_packages/package_layout.rst Co-authored-by: Carlos Zoido --- developing_packages/package_layout.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developing_packages/package_layout.rst b/developing_packages/package_layout.rst index 808807f42832..235c84b0aad4 100644 --- a/developing_packages/package_layout.rst +++ b/developing_packages/package_layout.rst @@ -7,7 +7,7 @@ Package layout This is an **experimental** feature subject to breaking changes in future releases. -Available since: `1.37.0 `_ +Available since: `1.37.0 `_ You can declare a ``layout()`` method in the recipe to describe the package contents, not only the final package in the cache but also the package while developing. From 05d95fddb90b4b30391b925b278c9053b57d24b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Mart=C3=ADnez=20de=20Bartolom=C3=A9?= Date: Fri, 28 May 2021 14:45:37 +0200 Subject: [PATCH 146/681] fix docs --- reference/conanfile/tools/cmake.rst | 86 +++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 23 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 32c78a2addf1..0ce5d67b28c9 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -48,13 +48,13 @@ There are some attributes you can adjust in the created ``CMakeDeps`` object to configurations ++++++++++++++ -As it can be seen in the following example, it allows to define custom user CMake configurations besides the standard +Allows to define custom user CMake configurations besides the standard Release, Debug, etc ones. If the **settings.yml** file is customized to add new configurations to the ``settings.build_type``, then, adding it explicitly to ``.configurations`` is not necessary. .. code-block:: python - ... + def generate(self): cmake = CMakeDeps(self) cmake.configurations.append("ReleaseShared") if self.options["hello"].shared: @@ -62,39 +62,79 @@ Release, Debug, etc ones. If the **settings.yml** file is customized to add new cmake.generate() -build_context_suffix / build_context_build_modules -++++++++++++++++++++++++++++++++++++++++++++++++++ +build_context_activated ++++++++++++++++++++++++ + +When you have a **build-require**, by default, the config files (`xxx-config.cmake`) files are not generated. +But you can activate it using the **build_context_activated** attribute: + +.. code-block:: python + + build_requires = ["my_tool/0.0.1"] + + def generate(self): + cmake = CMakeDeps(self) + # generate the config files for the build require + cmake.build_context_activated = ["my_tool"] + cmake.generate() + + +build_context_suffix +++++++++++++++++++++ When you have the same package as a **build-require** and as a **regular require** it will cause a conflict in the generator because the file names of the config files will collide as well as the targets names, variables names etc. -This is a typical situation with a requirement like **protobuff**: You want it as a **build-require** to generate **.cpp** -files trough the **protoc** tool, but you also want to link the final application or library with **libprotoc** library, -so you also have a **regular require**. Solving this conflict is specially important when we are cross-building because the -**protoc** tool (that will run in the building machine) belongs to a different binary package than the **libprotoc** library, -that will "run" in the host machine. +For example, this is a typical situation with some requirements (capnproto, protobuf...) that contain +a tool used to generate source code at build time (so it is a **build_require**), +but also providing a library to link to the final application, so you also have a **regular require**. +Solving this conflict is specially important when we are cross-building because the tool +(that will run in the building machine) belongs to a different binary package than the library, that will "run" in the +host machine. -Also there is another issue with the **build_modules**. As you may know, the recipes of the requirements can declare a -`cppinfo.build_modules` entry containing one or more **.cmake** files. When the requirement is found by the cmake ``find_package()`` -function, Conan will include automatically these files. By default, Conan will include only the build modules from the -``host`` context (regular requires) to avoid the collission, but you can change the default behavior. +You can use the **build_context_suffix** attribute to specify a suffix for a requirement, +so the files/targets/variables of the requirement in the build context (build require) will be renamed: + +.. code-block:: python -So there are two attributes of the ``CMakeDeps`` which helps with these issues: + build_requires = ["my_tool/0.0.1"] + requires = ["my_tool/0.0.1"] -- **build_context_suffix**: You can specify a suffix for a requirement, so the files/targets/variables of the requirement - in the build context (build require) will be renamed. -- **build_context_build_modules**: By default Conan will include only the ``host`` (regular requires) build modules, but - you can specify require names so the build modules from the ``build`` context are included instead. + def generate(self): + cmake = CMakeDeps(self) + # generate the config files for the build require + cmake.build_context_activated = ["my_tool"] + # disambiguate the files, targets, etc + cmake.build_context_suffix = {"my_tool": "_BUILD"} + cmake.generate() + + + +build_context_build_modules ++++++++++++++++++++++++++++ +Also there is another issue with the **build_modules**. As you may know, the recipes of the requirements can declare a +`cppinfo.build_modules` entry containing one or more **.cmake** files. +When the requirement is found by the cmake ``find_package()`` +function, Conan will include automatically these files. + +By default, Conan will include only the build modules from the +``host`` context (regular requires) to avoid the collision, but you can change the default behavior. + +Use the **build_context_build_modules** attribute to specify require names to include the **build_modules** from +**build_requires**: .. code-block:: python - ... + build_requires = ["my_tool/0.0.1"] + + def generate(self): cmake = CMakeDeps(self) - # disambiguate the files, targets, etc - cmake.build_context_suffix = {"protobuff": "_BUILD"} - # Choose the build modules from "build" context, so our CMakeLists can call the correct "protoc" tool - cmake.build_context_build_modules = ["protobuff"] + # generate the config files for the build require + cmake.build_context_activated = ["my_tool"] + # Choose the build modules from "build" context + cmake.build_context_build_modules = ["my_tool"] + cmake.generate() .. _conan-cmake-toolchain: From c87c547357737715deaaa210e0f415cc9fbe3d1f Mon Sep 17 00:00:00 2001 From: memsharded Date: Mon, 31 May 2021 10:15:39 +0200 Subject: [PATCH 147/681] skip_rpath and new blocks in CMakeToolchain --- reference/conanfile/tools/cmake.rst | 34 ++++++++++++++++------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 32c78a2addf1..fb022dc9181e 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -254,22 +254,26 @@ Extending and customizing CMakeToolchain Since Conan 1.36, ``CMakeToolchain`` implements a powerful capability for extending and customizing the resulting toolchain file. -The following predefined blocks are available: +The following predefined blocks are available, and added in this order: +- ``user_toolchain``: Allows to include a user toolchain from the ``conan_toolchain.cmake`` file. If the configuration ``tools.cmake.cmaketoolchain:user_toolchain=xxxx`` is defined, its value will be ``include(xxx)`` as the first line in ``conan_toolchain.cmake``. +from the ``conan_toolchain.cmake`` file. - ``generic_system``: Defines ``CMAKE_GENERATOR_PLATFORM``, ``CMAKE_GENERATOR_TOOLSET``, ``CMAKE_C_COMPILER``,``CMAKE_CXX_COMPILER`` and ``CMAKE_BUILD_TYPE`` - ``android_system``: Defines ``ANDROID_PLATFORM``, ``ANDROID_STL``, ``ANDROID_ABI`` and includes ``CMAKE_ANDROID_NDK/build/cmake/android.toolchain.cmake`` - where CMAKE_ANDROID_NDK comes defined in ``tools.android:ndk_path`` -- ``ios_system``: Defines ``CMAKE_SYSTEM_NAME``, ``CMAKE_SYSTEM_VERSION``, ``CMAKE_OSX_ARCHITECTURES``, ``CMAKE_OSX_SYSROOT`` for Apple systems. -- ``find_paths``: Defines ``CMAKE_FIND_PACKAGE_PREFER_CONFIG``, ``CMAKE_MODULE_PATH``, ``CMAKE_PREFIX_PATH`` so the generated files from ``CMakeDeps`` are found. + where CMAKE_ANDROID_NDK comes defined in ``tools.android:ndk_path`` configuration value. +- ``apple_system``: Defines ``CMAKE_SYSTEM_NAME``, ``CMAKE_SYSTEM_VERSION``, ``CMAKE_OSX_ARCHITECTURES``, ``CMAKE_OSX_SYSROOT`` for Apple systems. - ``fpic``: Defines the ``CMAKE_POSITION_INDEPENDENT_CODE`` when there is a ``options.fPIC`` -- ``rpath``: Defines ``CMAKE_SKIP_RPATH`` for OSX - ``arch_flags``: Defines C/C++ flags like ``-m32, -m64`` when necessary. - ``libcxx``: Defines ``-stdlib=libc++`` flag when necessary as well as ``_GLIBCXX_USE_CXX11_ABI``. -- ``vs_runtime``: Defines the ``CMAKE_MSVC_RUNTIME_LIBRARY`` variable, as a generator expression for - for multiple configurations. +- ``vs_runtime``: Defines the ``CMAKE_MSVC_RUNTIME_LIBRARY`` variable, as a generator expression for multiple configurations. - ``cppstd``: defines ``CMAKE_CXX_STANDARD``, ``CMAKE_CXX_EXTENSIONS`` -- ``shared``: defines ``BUILD_SHARED_LIBS`` - ``parallel``: defines ``/MP`` parallel build flag for Visual. +- ``cmake_flags_init``: defines ``CMAKE_XXX_FLAGS`` variables based on previously defined Conan variables. The blocks above only define ``CONAN_XXX`` variables, and this block will define CMake ones like ``set(CMAKE_CXX_FLAGS_INIT "${CONAN_CXX_FLAGS}" CACHE STRING "" FORCE)```. +- ``try_compile``: Stop processing the toolchain, skipping the blocks below this one, if ``IN_TRY_COMPILE`` CMake property is defined. +- ``find_paths``: Defines ``CMAKE_FIND_PACKAGE_PREFER_CONFIG``, ``CMAKE_MODULE_PATH``, ``CMAKE_PREFIX_PATH`` so the generated files from ``CMakeDeps`` are found. +- ``rpath``: Defines ``CMAKE_SKIP_RPATH``. By default it is disabled, and it is needed to define ``self.blocks["rpath"].skip_rpath=True`` if you want to activate ``CMAKE_SKIP_RPATH`` +- ``shared``: defines ``BUILD_SHARED_LIBS`` + Blocks can be customized in different ways: @@ -279,21 +283,21 @@ Blocks can be customized in different ways: # remove an existing block def generate(self): tc = CMakeToolchain(self) - tc.pre_blocks.remove("generic_system") + tc.blocks.remove("generic_system") # modify the template of an existing block def generate(self): tc = CMakeToolchain(self) - tmp = tc.pre_blocks["generic_system"].template + tmp = tc.blocks["generic_system"].template new_tmp = tmp.replace(...) # replace, fully replace, append... - tc.pre_blocks["generic_system"].template = new_tmp + tc.blocks["generic_system"].template = new_tmp # modify the context (variables) of an existing block import types def generate(self): tc = CMakeToolchain(self) - generic_block = toolchain.pre_blocks["generic_system"] + generic_block = toolchain.blocks["generic_system"] def context(self): assert self # Your own custom logic here @@ -310,7 +314,7 @@ Blocks can be customized in different ways: def context(self): return {} - tc.pre_blocks["generic_system"] = MyBlock + tc.blocks["generic_system"] = MyBlock # add a completely new block def generate(self): @@ -322,7 +326,7 @@ Blocks can be customized in different ways: def context(self): return {"myvar": "World"} - tc.pre_blocks["mynewblock"] = MyBlock + tc.blocks["mynewblock"] = MyBlock # extend from an existing block @@ -337,7 +341,7 @@ Blocks can be customized in different ways: c["build_type"] = c["build_type"] + "Super" return c - tc.pre_blocks["generic_system"] = MyBlock + tc.blocks["generic_system"] = MyBlock Recall that this is a very **experimental** feature, and these interfaces might change in the following releases. From e0fec31a365a9e03bd9bf2f0bf8c9a1bedcdfdc5 Mon Sep 17 00:00:00 2001 From: memsharded Date: Mon, 31 May 2021 10:25:23 +0200 Subject: [PATCH 148/681] adding details for replacing conan_toolchain.cmake --- reference/conanfile/tools/cmake.rst | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index fb022dc9181e..3fbeb32dfc46 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -151,7 +151,7 @@ translated from the current ``settings``: - *conanbuild.json*: The toolchain can also generate a ``conanbuild.json`` file that contains arguments to the command line ``CMake()`` helper used in the recipe ``build()`` method. At the moment it contains only the CMake - generator. The CMake generator will be deduced from the current Conan compiler settings: + generator and the CMake toolchain file. The CMake generator will be deduced from the current Conan compiler settings: - For ``settings.compiler="Visual Studio"``, the CMake generator is a direct mapping of ``compiler.version``, as this version represents the IDE version, not the compiler version. - For ``settings.compiler=msvc``, the CMake generator will be by default the one of the Visual Studio that introduced this compiler version (``msvc 19.0`` => ``Visual Studio 14``, ``msvc 19.1`` => ``Visual Studio 15``, etc). This can be changed, using the ``tools.microsoft.msbuild:vs_version`` [conf] configuration. If it is defined, that Visual Studio version will be used as the CMake generator, and the specific compiler version and toolset will be defined in the ``conan_toolchain.cmake`` file. @@ -166,8 +166,7 @@ constructor .. code:: python - def __init__(self, conanfile, generator=None, generator_platform=None, build_type=None, - cmake_system_name=True, toolset=None): + def __init__(self, conanfile, generator=None): Most of the arguments are optional and will be deduced from the current ``settings``, and not @@ -199,6 +198,15 @@ The ``CMakeToolchain`` is intended to run with the ``CMakeDeps`` dependencies ge work with others like ``cmake_find_package`` and ``cmake_find_package_multi``, but this will be removed soon. +Using a custom toolchain file ++++++++++++++++++++++++++++++ + +There are two ways of providing a custom CMake toolchain file: + +- The ``conan_toolchain.cmake`` file can be completely skipped and replaced by a user one, defining the ``tools.cmake.cmaketoolchain:toolchain_file=`` configuration value +- A custom user toolchain file can be added (included from) the ``conan_toolchain.cmake`` one, by using the ``user_toolchain`` block described below, and defining the ``tools.cmake.cmaketoolchain:user_toolchain=`` configuration value. + + Using the toolchain in developer flow +++++++++++++++++++++++++++++++++++++ From 530e1bf891832535c9b757c336ca11e1b68e7b65 Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Mon, 31 May 2021 10:44:38 +0200 Subject: [PATCH 149/681] Update developing_packages/package_layout.rst Co-authored-by: Carlos Zoido --- developing_packages/package_layout.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developing_packages/package_layout.rst b/developing_packages/package_layout.rst index 235c84b0aad4..741d7896b8f5 100644 --- a/developing_packages/package_layout.rst +++ b/developing_packages/package_layout.rst @@ -70,7 +70,7 @@ file when using the :ref:`CMakeDeps` generator because it wil .. code:: python import os - from conans import ConanFile + from conans import ConanFile, CMake class Pkg(ConanFile): From 2a6a367b52b5c769128c815902d97b981b65f4b8 Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Mon, 31 May 2021 10:44:50 +0200 Subject: [PATCH 150/681] Update developing_packages/package_layout.rst Co-authored-by: Carlos Zoido --- developing_packages/package_layout.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developing_packages/package_layout.rst b/developing_packages/package_layout.rst index 741d7896b8f5..513dc9e76050 100644 --- a/developing_packages/package_layout.rst +++ b/developing_packages/package_layout.rst @@ -280,7 +280,7 @@ We can write a ``layout()`` method describing it: self.folders.source = ["."] # The build folder is created with the CLion way - self.folders.build = "cmake-build-{}".format(str(conanfile.settings.build_type).lower()) + self.folders.build = "cmake-build-{}".format(str(self.settings.build_type).lower()) # We want to have the toolchains in the build folder so we can always pass # `-DCMAKE_TOOLCHAIN_FILE=generators/conan_toolchain.cmake` to CMake From 1c564c2f870e1ed98de3d8432e4118c7c25dd032 Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Mon, 31 May 2021 10:45:01 +0200 Subject: [PATCH 151/681] Update developing_packages/package_layout.rst Co-authored-by: Carlos Zoido --- developing_packages/package_layout.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developing_packages/package_layout.rst b/developing_packages/package_layout.rst index 513dc9e76050..94f5ae6c5632 100644 --- a/developing_packages/package_layout.rst +++ b/developing_packages/package_layout.rst @@ -11,7 +11,7 @@ Available since: `1.37.0 `_ You can declare a ``layout()`` method in the recipe to describe the package contents, not only the final package in the cache but also the package while developing. -As the package will have the same structure in the cache and in our local directory, the recipe development become easier. +As the package will have the same structure in the cache and in our local directory, the recipe development becomes easier. In the ``layout()`` method you can adjust 3 different things: From 1963e98fb322564fe37d793fe3cdf0c343a19971 Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Mon, 31 May 2021 10:45:12 +0200 Subject: [PATCH 152/681] Update developing_packages/package_layout.rst Co-authored-by: Carlos Zoido --- developing_packages/package_layout.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developing_packages/package_layout.rst b/developing_packages/package_layout.rst index 94f5ae6c5632..9f4665276d62 100644 --- a/developing_packages/package_layout.rst +++ b/developing_packages/package_layout.rst @@ -277,7 +277,7 @@ We can write a ``layout()`` method describing it: def layout(self): # ###### FOLDERS # The sources can be found in the root dir - self.folders.source = ["."] + self.folders.source = "." # The build folder is created with the CLion way self.folders.build = "cmake-build-{}".format(str(self.settings.build_type).lower()) From b85bc61b39982082407b52232b0cd418f477e230 Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Mon, 31 May 2021 10:45:21 +0200 Subject: [PATCH 153/681] Update developing_packages/package_layout.rst Co-authored-by: Carlos Zoido --- developing_packages/package_layout.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developing_packages/package_layout.rst b/developing_packages/package_layout.rst index 9f4665276d62..5fd7c94f34fa 100644 --- a/developing_packages/package_layout.rst +++ b/developing_packages/package_layout.rst @@ -287,7 +287,7 @@ We can write a ``layout()`` method describing it: self.folders.generators = os.path.join(self.folders.build, "generators") # In case we use "conan package" we declare an output directory - self.folders.package = "package-{}".format(str(conanfile.settings.build_type).lower()) + self.folders.package = "package-{}".format(str(self.settings.build_type).lower()) # ###### INFOS self.cpp.source.includedirs = ["include"] # Relative to ["."] (self.folders.source) From 97b5079c808d640ce7b65a415e02e6eeb3c2a22c Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Mon, 31 May 2021 10:45:29 +0200 Subject: [PATCH 154/681] Update developing_packages/package_layout.rst Co-authored-by: Carlos Zoido --- developing_packages/package_layout.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developing_packages/package_layout.rst b/developing_packages/package_layout.rst index 5fd7c94f34fa..7731cb07bac4 100644 --- a/developing_packages/package_layout.rst +++ b/developing_packages/package_layout.rst @@ -91,7 +91,7 @@ file when using the :ref:`CMakeDeps` generator because it wil def build(self): # We are at a folder like "myproject/cmake-build-debug" - cmake = CMake() + cmake = CMake(self) cmake.configure() cmake.build() From e1a06951a998d53082d58bc3ceac7cb673ddad6c Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Mon, 31 May 2021 11:14:13 +0200 Subject: [PATCH 155/681] Update reference/conanfile/tools/cmake.rst --- reference/conanfile/tools/cmake.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index 3fbeb32dfc46..19baf1366a47 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -265,7 +265,6 @@ Since Conan 1.36, ``CMakeToolchain`` implements a powerful capability for extend The following predefined blocks are available, and added in this order: - ``user_toolchain``: Allows to include a user toolchain from the ``conan_toolchain.cmake`` file. If the configuration ``tools.cmake.cmaketoolchain:user_toolchain=xxxx`` is defined, its value will be ``include(xxx)`` as the first line in ``conan_toolchain.cmake``. -from the ``conan_toolchain.cmake`` file. - ``generic_system``: Defines ``CMAKE_GENERATOR_PLATFORM``, ``CMAKE_GENERATOR_TOOLSET``, ``CMAKE_C_COMPILER``,``CMAKE_CXX_COMPILER`` and ``CMAKE_BUILD_TYPE`` - ``android_system``: Defines ``ANDROID_PLATFORM``, ``ANDROID_STL``, ``ANDROID_ABI`` and includes ``CMAKE_ANDROID_NDK/build/cmake/android.toolchain.cmake`` where CMAKE_ANDROID_NDK comes defined in ``tools.android:ndk_path`` configuration value. From ee2cac151f96dc258b35c2c705e4d8be783e6c97 Mon Sep 17 00:00:00 2001 From: memsharded Date: Mon, 31 May 2021 11:38:05 +0200 Subject: [PATCH 156/681] build_policy=never for conan export-pkg --- mastering/policies.rst | 1 + reference/commands/creator/export-pkg.rst | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/mastering/policies.rst b/mastering/policies.rst index 0472dcc7594f..25eac4a45d33 100644 --- a/mastering/policies.rst +++ b/mastering/policies.rst @@ -21,6 +21,7 @@ With the ``build_policy`` attribute in the `conanfile.py` the package creator ca - ``missing``: If no binary package is found, Conan will build it without the need to invoke Conan install with :command:`--build missing` option. - ``always``: The package will be built always, **retrieving each time the source code** executing the "source" method. +- ``never``: (experimental) Never builds this package from source, this package can only be created with a ``conan export-pkg`` command. .. code-block:: python diff --git a/reference/commands/creator/export-pkg.rst b/reference/commands/creator/export-pkg.rst index a678c93f570a..2e0b143f25d7 100644 --- a/reference/commands/creator/export-pkg.rst +++ b/reference/commands/creator/export-pkg.rst @@ -137,6 +137,12 @@ There are different scenarios where this command could look like useful: :ref:`How to package existing binaries `. +Packages created with ``conan export-pkg`` cannot be rebuilt from sources in the cache with the ``--build`` +command line argument. It is possible to specify the class attribute ``build_policy="never"`` in this recipes +(this is an experimental feature) to avoid the ``--build=*`` or ``--build`` argument to try to rebuild them from sources +as part of a dependency graph. + + .. note:: Note that if :command:`--profile`, settings or options are not provided to :command:`export-pkg`, From e050972a4ebdf23b656c80361d7e6c6807026772 Mon Sep 17 00:00:00 2001 From: memsharded Date: Mon, 31 May 2021 11:40:10 +0200 Subject: [PATCH 157/681] add added in 1.37 comment --- mastering/policies.rst | 2 +- reference/commands/creator/export-pkg.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mastering/policies.rst b/mastering/policies.rst index 25eac4a45d33..64e6235f79cb 100644 --- a/mastering/policies.rst +++ b/mastering/policies.rst @@ -21,7 +21,7 @@ With the ``build_policy`` attribute in the `conanfile.py` the package creator ca - ``missing``: If no binary package is found, Conan will build it without the need to invoke Conan install with :command:`--build missing` option. - ``always``: The package will be built always, **retrieving each time the source code** executing the "source" method. -- ``never``: (experimental) Never builds this package from source, this package can only be created with a ``conan export-pkg`` command. +- ``never``: (experimental, available from Conan 1.37) Never builds this package from source, this package can only be created with a ``conan export-pkg`` command. .. code-block:: python diff --git a/reference/commands/creator/export-pkg.rst b/reference/commands/creator/export-pkg.rst index 2e0b143f25d7..a22263b74abd 100644 --- a/reference/commands/creator/export-pkg.rst +++ b/reference/commands/creator/export-pkg.rst @@ -139,7 +139,7 @@ There are different scenarios where this command could look like useful: Packages created with ``conan export-pkg`` cannot be rebuilt from sources in the cache with the ``--build`` command line argument. It is possible to specify the class attribute ``build_policy="never"`` in this recipes -(this is an experimental feature) to avoid the ``--build=*`` or ``--build`` argument to try to rebuild them from sources +(this is an experimental feature, available from Conan 1.37) to avoid the ``--build=*`` or ``--build`` argument to try to rebuild them from sources as part of a dependency graph. From 3497f128a49ce1f2ef6e6c227710cc698f0d63eb Mon Sep 17 00:00:00 2001 From: memsharded Date: Mon, 31 May 2021 11:45:55 +0200 Subject: [PATCH 158/681] configuration from build_requires --- reference/config_files/global_conf.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/reference/config_files/global_conf.rst b/reference/config_files/global_conf.rst index eed51263f63d..f92b380dd002 100644 --- a/reference/config_files/global_conf.rst +++ b/reference/config_files/global_conf.rst @@ -58,3 +58,26 @@ Existing configurations: (overrides the general ``tools.build:processes``). To list all possible configurations available, run :command:`conan config list`. + + +Configuration from build_requires +----------------------------------- + +From Conan 1.37, it is possible to define configuration in packages that are ``build_requires``. For example, assuming +there is a package that bundles the AndroidNDK, it could define the location of such NDK to the ``tools.android:ndk_path`` +configuration as: + + +.. code-block:: python + + import os + from conans import ConanFile + + class Pkg(ConanFile): + name = "android_ndk" + + def package_info(self): + self.conf_info["tools.android:ndk_path"] = os.path.join(self.package_folder, "ndk") + + +Note that this only propagates from the immediate, direct ``build_requires`` of a recipe. From 7968321e778da3529447c9e5d5efcb068dd4bba9 Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Mon, 31 May 2021 13:32:33 +0200 Subject: [PATCH 159/681] Update reference/conanfile/methods.rst Co-authored-by: Carlos Zoido --- reference/conanfile/methods.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 42ded9a0d842..94fe2aaa3591 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1454,7 +1454,7 @@ layout() This is an **experimental** feature subject to breaking changes in future releases. -Available since: `1.37.0 `_ +Available since: `1.37.0 `_ Read about the feature :ref:`here`. @@ -1534,4 +1534,3 @@ These are all the fields that can be adjusted, both in ``self.patterns.source`` +--------------------------------------+---------------------------------------------------------------------------------------------------------+ | framework | Patterns of the files from the folders: ``self.cpp.xxx.frameworkdirs`` | +--------------------------------------+---------------------------------------------------------------------------------------------------------+ - From d758cb7184a3bdea21b8f8a6034a36ab33423fed Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Mon, 31 May 2021 13:32:45 +0200 Subject: [PATCH 160/681] Update reference/conanfile/tools/layout.rst Co-authored-by: Carlos Zoido --- reference/conanfile/tools/layout.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/tools/layout.rst b/reference/conanfile/tools/layout.rst index c21ef47455fe..d89f82ffa4aa 100644 --- a/reference/conanfile/tools/layout.rst +++ b/reference/conanfile/tools/layout.rst @@ -3,7 +3,7 @@ conan.tools.layout ================== -Available since: `1.37.0 `_ +Available since: `1.37.0 `_ LayoutPackager -------------- From 8613c4c0eba91c9556b083433422f7963fa679d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Mart=C3=ADnez=20de=20Bartolom=C3=A9?= Date: Mon, 31 May 2021 13:40:08 +0200 Subject: [PATCH 161/681] Review --- developing_packages/package_layout.rst | 30 ++++++++------------------ reference/conanfile/methods.rst | 4 ++++ 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/developing_packages/package_layout.rst b/developing_packages/package_layout.rst index 808807f42832..2f975edd591d 100644 --- a/developing_packages/package_layout.rst +++ b/developing_packages/package_layout.rst @@ -29,27 +29,15 @@ In the ``layout()`` method you can adjust 3 different things: self.folders ++++++++++++ -- **self.folders.source**: To specify a folder where your sources are. The ``self.source_folder`` attribute and - the *current working directory* inside the ``source(self)`` method will be set with this subfolder. It is used in the cache when running - :command:`conan create` (relative to the cache source folder) as well as in a local folder when running :command:`conan source` - (relative to the local current folder). - -- **self.folders.build**: To specify a subfolder where the files from the build are (or will be). The ``self.build_folder`` attribute and - the *current working directory* inside the ``build(self)`` method will be set with this subfolder. It is used in the cache when running - :command:`conan create` (relative to the cache source folder) as well as in a local folder when running :command:`conan build` - (relative to the local current folder). - -- **self.folders.generators** (Defaulted to ""): To specify a subfolder where to write the files from the generators and the toolchains. - In the cache, when running the :command:`conan create`, this subfolder will be relative to the root build folder and when running - the :command:`conan install` command it will be relative to the current working directory. - -- **self.folders.imports** (Defaulted to ""): Specifies a subfolder where to write the files copied when using the ``imports(self)`` - method in a ``conanfile.py``. In the cache, when running the :command:`conan create`, this subfolder will be relative to the root - build folder and when running the :command:`conan imports` command it will be relative to the current working directory. - -- **self.folders.package** (Defaulted to ""): Specifies a subfolder where to write the package files when running the :command:`conan package` - command. It is relative to the current working directory. This folder **will not** affect the package layout in the - cache. +- **self.folders.source**: To specify a folder where your sources are. +- **self.folders.build**: To specify a subfolder where the files from the build are (or will be). +- **self.folders.generators**: To specify a subfolder where to write the files from the generators and the toolchains. +- **self.folders.imports**: To specify a subfolder where to write the files copied when using the ``imports(self)`` + method in a ``conanfile.py``. +- **self.folders.package**: To specify a subfolder where to write the package files when running the :command:`conan package` + command. + +Check the :ref:`complete reference` of the folders attribute. In the following example we are declaring a layout that follows the standard CLion one, where the build directory is ``cmake-build-release`` or ``cmake-build-debug`` depending on the declared ``build_type`` setting. The sources of the project are in the ``src`` folder. diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index 42ded9a0d842..2ee82a8378ce 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1460,6 +1460,10 @@ Read about the feature :ref:`here`. In the layout() method you can adjust ``self.folders``, ``self.cpp`` and ``self.patterns``. + +.. _layout_folders_reference: + + self.folders ++++++++++++ From 535e845fc806f49d588f9aa1a0fae146eff6130d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Garci=CC=81a=20Tapia?= Date: Mon, 31 May 2021 17:12:20 +0200 Subject: [PATCH 162/681] Add new documentation for the Bazel helper --- .gitignore | 1 + images/conan-bazel_logo.png | Bin 0 -> 5872 bytes integrations/build_system.rst | 1 + integrations/build_system/bazel.rst | 40 ++++++++++++++ reference/conanfile/tools.rst | 1 + reference/conanfile/tools/google.rst | 78 +++++++++++++++++++++++++++ 6 files changed, 121 insertions(+) create mode 100644 images/conan-bazel_logo.png create mode 100644 integrations/build_system/bazel.rst create mode 100644 reference/conanfile/tools/google.rst diff --git a/.gitignore b/.gitignore index f3af9eb4a0c7..406ad87f7d8c 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ var/ *.egg-info/ .installed.cfg *.egg +venv # PyInstaller # Usually these files are written by a python script from a template diff --git a/images/conan-bazel_logo.png b/images/conan-bazel_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4c331b2cdfaa9ba128216e9a58900ced83f9e636 GIT binary patch literal 5872 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 literal 0 HcmV?d00001 diff --git a/integrations/build_system.rst b/integrations/build_system.rst index 25737f532f9d..1f79f8657f8c 100644 --- a/integrations/build_system.rst +++ b/integrations/build_system.rst @@ -31,3 +31,4 @@ Conan can be integrated with any build system. This can be done with: build_system/meson build_system/scons build_system/gcc + build_system/bazel diff --git a/integrations/build_system/bazel.rst b/integrations/build_system/bazel.rst new file mode 100644 index 000000000000..db0a1aba21cf --- /dev/null +++ b/integrations/build_system/bazel.rst @@ -0,0 +1,40 @@ +.. _bazel: + + +|bazel_logo| Bazel +__________________ + +If you are using **Bazel** as your library build system, you can use the **Bazel** build helper. +This helper has a .build()`` method available to ease the call to Meson build system. + +If you want to declare Conan dependencies in your project, you must do it, as usual, in the +**conanfile.py** file. For example: + +.. code-block:: python + + class BazelExampleConan(ConanFile): + name = "bazel-example" + .... + build_requires = "boost/1.76.0" + +Then, tell Bazel to use that dependencies by adding this to the **WORKSPACE** file: + +.. code-block:: text + + load("@//conandeps:dependencies.bzl", "load_conan_dependencies") + load_conan_dependencies() + +After that, just update the BUILD files where you need to use the new dependency: + +.. code-block:: text + + cc_binary( + name = "hello-world", + srcs = ["hello-world.cc"], + deps = [ + "@boost//:boost", + ], + ) + + +.. |bazel_logo| image:: ../../images/conan-bazel_logo.png diff --git a/reference/conanfile/tools.rst b/reference/conanfile/tools.rst index 36250dc53a54..7f5f9f312349 100644 --- a/reference/conanfile/tools.rst +++ b/reference/conanfile/tools.rst @@ -37,6 +37,7 @@ Contents: tools/cmake tools/gnu + tools/google tools/meson tools/microsoft tools/qbs diff --git a/reference/conanfile/tools/google.rst b/reference/conanfile/tools/google.rst new file mode 100644 index 000000000000..8dab480c72ed --- /dev/null +++ b/reference/conanfile/tools/google.rst @@ -0,0 +1,78 @@ +.. _conan_tools_google: + +conan.tools.google +================== + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +BazelDeps +--------- + +Available since: `1.37.0 `_ + +The ``BazelDeps`` helper will generate one **conandeps/xxxx/BUILD** file per dependency. This dependencies will be +automatically added to the project by adding the following to the project's **WORKSPACE** file: + + +.. code-block:: text + + load("@//conandeps:dependencies.bzl", "load_conan_dependencies") + load_conan_dependencies() + + +The dependencies should be added to the **conanfile.py** file as usual: + +.. code-block:: python + + class BazelExampleConan(ConanFile): + name = "bazel-example" + ... + generators = "BazelDeps", "BazelToolchain" + build_requires = "boost/1.76.0" + +Bazel +----- +The ``Bazel`` build helper is a wrapper around the command line invocation of bazel. It will abstract the +calls like ``bazel build //main:hello-world`` into Python method calls. + +The helper is intended to be used in the ``build()`` method, to call Bazel commands automatically +when a package is being built directly by Conan (create, install) + + +.. code-block:: python + + from conans import ConanFile + from conan.tools.google import Bazel + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + + def build(self): + bazel = Bazel(self) + bazel.configure() + bazel.build(label="//main:hello-world") + +It supports the following methods: + +constructor ++++++++++++ + +.. code:: python + + def __init__(self, conanfile): + +- ``conanfile``: the current recipe object. Always use ``self``. + + +build() ++++++++ + +.. code:: python + + def build(self, args=None, label=None): + + +Calls the build system. Equivalent to :command:`bazel build {label}` in the build folder. From 701759eb182d884836bb806d04df0a60346a2f4c Mon Sep 17 00:00:00 2001 From: Carlos Zoido Date: Mon, 31 May 2021 17:53:45 +0200 Subject: [PATCH 163/681] Update reference/conanfile/tools/google.rst --- reference/conanfile/tools/google.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/conanfile/tools/google.rst b/reference/conanfile/tools/google.rst index 8dab480c72ed..fc35627066c0 100644 --- a/reference/conanfile/tools/google.rst +++ b/reference/conanfile/tools/google.rst @@ -11,7 +11,7 @@ conan.tools.google BazelDeps --------- -Available since: `1.37.0 `_ +Available since: `1.37.0 `_ The ``BazelDeps`` helper will generate one **conandeps/xxxx/BUILD** file per dependency. This dependencies will be automatically added to the project by adding the following to the project's **WORKSPACE** file: From 8d10955df8d582efdf17dc236ec82ca6e2e2de45 Mon Sep 17 00:00:00 2001 From: czoido Date: Mon, 31 May 2021 18:14:49 +0200 Subject: [PATCH 164/681] 1.37.0 --- .ci/publish.jenkins | 1 + changelog.rst | 38 +++++++++++++++++++++++++++++++++++++- conf.py | 4 ++-- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index 92d40831eb30..e2a0a435c7ee 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,6 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ + 'release/1.37.0': '1.37', 'release/1.36.0': '1.36', 'release/1.35.2': '1.35', 'release/1.34.1': '1.34', diff --git a/changelog.rst b/changelog.rst index ad7dd3a47b51..dd95a5691769 100644 --- a/changelog.rst +++ b/changelog.rst @@ -18,9 +18,45 @@ Check https://github.com/conan-io/conan for issues and more details about develo .. important:: - Conan 1.36 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please + Conan 1.37 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.37.0 (31-May-2021) +-------------------- + +- Feature: Remove ``CMAKE_SKIP_RPATHS`` by default to True in ``CMakeToolchain``, it is not necessary by default, users can opt-in, and new test validates shared libs will work with ``VirtualEnv`` generator ``conanrunenv``. `#9024 `_ . Docs `here `__ +- Feature: simplified ``CMakeToolchain`` with only 1 category of blocks, made ``try-compile`` template code as another block, and reordered blocks so relevant flags for try-compile are taken into account. `#9009 `_ . Docs `here `__ +- Feature: Add new default `conancenter` remote for `https://center.conan.io` as first in the list. `#8999 `_ +- Feature: Implements a new experimental ``conan.tools.google`` Bazel integration with ``BazelDeps``, ``BazelToolchain`` and ``Bazel``. `#8991 `_ . Docs `here `__ +- Feature: Introduced new options for the `CMakeDeps` generator allowing to manage `build_requires` even declaring the same package as a `require` and `build_require` avoiding the collision of the `config` cmake files and enabling to specify which `build_modules` should be included (e.g protobuf issue) `#8985 `_ . Docs `here `__ +- Feature: Expand user-agent string to include OS info. `#8947 `_ +- Feature: Implement ``build_policy=never`` for :command:`conan export-pkg` packages that cannot be rebuilt with ``--build=xxx``. `#8946 `_ . Docs `here `__ +- Feature: Define ``[conf]`` for defining the user toolchain for ``CMakeToolchain``, both for injecting a user toolchain in the ``CMakeToolchain`` generated ``conan_toolchain.cmake`` and for completely replacing ``conan_toolchain.cmake``. `#8945 `_ . Docs `here `__ +- Feature: add GCC 11 to _settings.yml_. `#8924 `_ +- Feature: Add new `tools.rename()` interface. `#8915 `_ . Docs `here `__ +- Feature: Update urlib3 Conan dependency setting version `>=1.25.8` to avoid CVE-2020-7212. `#8914 `_ +- Feature: Build-requires can define [conf] for its consumers. `#8895 `_ . Docs `here `__ +- Feature: support M1 Catalyst. `#8818 `_ +- Feature: New ``conan install --build-require`` and ``conan create --build-require`` (when not using ``test_package``) arguments to explicitly define that the installed or created package has to be a ``build-require``, receiving the build profile instead of the host one. `#8627 `_ +- Feature: Introduced the `layout()` method to the recipe to be able to declare the folder structure both for the local development methods (conan source, conan build...) and in the cache. Also, associated to the folders, cppinfo objects to be used in editable packages and file pattern descriptions to enable "auto packaging". `#8554 `_ . Docs `here `__ +- Fix: **CMakeDeps** generator: The transitive requirements for a build_require are not included in the `xxx-config.cmake` files generated. `#9015 `_ +- Fix: The `CMakeToolchain` now supports Apple M1 cross-building with a profile without environment declared pointing to the system toolchain. `#9011 `_ +- Fix: Set `env_info.DYLD_FRAMEWORK_PATH` correctly. `#8984 `_ +- Fix: Fix some typos in the code. `#8977 `_ +- Fix: Improve error message when a directory doesn't contain a valid repository. `#8956 `_ +- Fix: The `build_modules` defined per generator in `cpp_info` now are rendered properly using the `markdown` generator. `#8942 `_ +- Fix: Simplify code access to [conf] variables removing attribute based access. `#8901 `_ +- Bugfix: Prevent unintended evil insertions into metadata.json resulted in corrupted package and inability to install. `#9022 `_ +- Bugfix: Allow ``MSBuildDeps`` to correctly process packages with dots in the package name. `#9012 `_ +- Bugfix: Avoid errors because of ``package_id`` mismatch in lockfiles when using ``compatible_packages`` feature. `#9008 `_ +- BugFix: Respect order of declared directories when using components. `#8927 `_ +- Bugfix: Raise an exception when response header `Content-type` is different than `application/json` or `application/json; charset=utf-8`. `#8912 `_ +- Bugfix: Fix exception in CMakeToolchain when settings remove known compilers. `#8900 `_ +- Bugfix: Fix current directory definition in ``vcvars`` commands in new toolchains. `#8899 `_ +- Bugfix: AptTool: add repo key before running apt-add-repository. `#8861 `_ +- BugFix: Prevent evil insertions into metadata.json resulted in corrupted package and inability to install. `#8532 `_ + + 1.36.0 (28-Apr-2021) -------------------- diff --git a/conf.py b/conf.py index 3f03f97a7051..24aee5687c9c 100644 --- a/conf.py +++ b/conf.py @@ -41,9 +41,9 @@ ] # The short X.Y version. -version = "1.36" +version = "1.37" # The full version, including alpha/beta/rc tags. -release = u'1.36.0' +release = u'1.37.0' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): From 954233269e9994e0ddb750ac7ec681571c3f4758 Mon Sep 17 00:00:00 2001 From: danimtb Date: Mon, 31 May 2021 19:30:26 +0200 Subject: [PATCH 165/681] Use new remote repo conancenter --- creating_packages/inspecting_packages.rst | 2 +- faq/using.rst | 8 ++-- getting_started.rst | 48 +++++++++---------- howtos/check_conan_version_in_conanfile.rst | 2 +- reference/commands/creator/upload.rst | 2 +- reference/commands/misc/remote.rst | 8 ++-- reference/commands/misc/user.rst | 2 +- reference/commands/output/search.rst | 6 +-- reference/commands/output/upload.rst | 34 ++++++------- reference/commands/output/user.rst | 2 +- systems_cross_building/windows_subsystems.rst | 2 +- .../artifactory/artifactory_cloud.rst | 6 +-- .../artifactory/conan_center_guide.rst | 8 ++-- uploading_packages/remotes.rst | 9 ++-- 14 files changed, 70 insertions(+), 69 deletions(-) diff --git a/creating_packages/inspecting_packages.rst b/creating_packages/inspecting_packages.rst index ad06117f68f6..f9d5d2a47aa9 100644 --- a/creating_packages/inspecting_packages.rst +++ b/creating_packages/inspecting_packages.rst @@ -25,7 +25,7 @@ You can inspect the uploaded packages and also the packages in the local cache b .. code-block:: bash - $ conan get zlib/1.2.11@ -r conan-center + $ conan get zlib/1.2.11@ -r conancenter .. code-block:: python diff --git a/faq/using.rst b/faq/using.rst index bad33efe756e..fd7256dd7dbc 100644 --- a/faq/using.rst +++ b/faq/using.rst @@ -153,10 +153,10 @@ The lookup remote order is defined by the command :command:`conan remote`: .. code-block:: bash $ conan remote list - conan-center: https://center.conan.io [Verify SSL: True] + conancenter: https://center.conan.io [Verify SSL: True] myremote: https://MyTeamServerIP:8081/artifactory/api/conan/myremote [Verify SSL: True] -As you can see, the remote ``conan-center`` is listed on index **0**, which means it has the highest priority when searching or installing a package, +As you can see, the remote ``conancenter`` is listed on index **0**, which means it has the highest priority when searching or installing a package, followed by ``myremote``, on index **1**. To update the index order, the argument ``--insert`` can be added to the command :command:`conan remote update`: .. code-block:: bash @@ -164,7 +164,7 @@ followed by ``myremote``, on index **1**. To update the index order, the argumen $ conan remote update myremote https://MyTeamServerIP:8081/artifactory/api/conan/myremote --insert $ conan remote list myremote: https://MyTeamServerIP:8081/artifactory/api/conan/myremote [Verify SSL: True] - conan-center: https://center.conan.io [Verify SSL: True] + conancenter: https://center.conan.io [Verify SSL: True] The ``--insert`` argument means *index 0*, the highest priority, thus the ``myremote`` remote will be updated as the first remote to be used. @@ -177,7 +177,7 @@ It's also possible to define a specific index when adding a remote to the list: $ conan remote list myremote: https://MyTeamServerIP:8081/artifactory/api/conan/myremote [Verify SSL: True] otherremote: https://MyCompanyOtherIP:8081/artifactory/api/conan/otherremote [Verify SSL: True] - conan-center: https://center.conan.io [Verify SSL: True] + conancenter: https://center.conan.io [Verify SSL: True] The ``otherremote`` remote needs to be added after ``myremote``, so we need to set the remote index as **1**. diff --git a/getting_started.rst b/getting_started.rst index f0ca148de5f5..0fd360a7f9e4 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -58,7 +58,7 @@ An MD5 hash calculator using the Poco Libraries .. note:: The Conan client contains a command to search in remote repositories, and we could - try :command:`$ conan search poco --remote=conan-center`. You can perfectly use this command to search in your + try :command:`$ conan search poco --remote=conancenter`. You can perfectly use this command to search in your own repositories, but note that at the moment this might timeout in ConanCenter. The infrastructure is being improved to support this command too, but meanwhile using the `ConanCenter UI `_ is recommended. @@ -70,7 +70,7 @@ An MD5 hash calculator using the Poco Libraries $ conan inspect poco/1.9.4 name: poco version: 1.9.4 - url: https://github.com/conan-io/conan-center-index + url: https://github.com/conan-io/conancenter-index homepage: https://pocoproject.org license: BSL-1.0 author: None @@ -136,13 +136,13 @@ An MD5 hash calculator using the Poco Libraries $ conan install .. ... Requirements - bzip2/1.0.8 from 'conan-center' - Downloaded - expat/2.2.9 from 'conan-center' - Downloaded - openssl/1.1.1g from 'conan-center' - Downloaded - pcre/8.41 from 'conan-center' - Downloaded - poco/1.9.4 from 'conan-center' - Cache - sqlite3/3.31.1 from 'conan-center' - Downloaded - zlib/1.2.11 from 'conan-center' - Downloaded + bzip2/1.0.8 from 'conancenter' - Downloaded + expat/2.2.9 from 'conancenter' - Downloaded + openssl/1.1.1g from 'conancenter' - Downloaded + pcre/8.41 from 'conancenter' - Downloaded + poco/1.9.4 from 'conancenter' - Cache + sqlite3/3.31.1 from 'conancenter' - Downloaded + zlib/1.2.11 from 'conancenter' - Downloaded Packages bzip2/1.0.8:5be2b7a2110ec8acdbf9a1cea9de5d60747edb34 - Download expat/2.2.9:6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7 - Download @@ -152,7 +152,7 @@ An MD5 hash calculator using the Poco Libraries sqlite3/3.31.1:4559c5d4f09161e1edf374b033b1d6464826db16 - Download zlib/1.2.11:6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7 - Download - zlib/1.2.11: Retrieving package f74366f76f700cc6e991285892ad7a23c30e6d47 from remote 'conan-center' + zlib/1.2.11: Retrieving package f74366f76f700cc6e991285892ad7a23c30e6d47 from remote 'conancenter' Downloading conanmanifest.txt completed [0.25k] Downloading conaninfo.txt completed [0.44k] Downloading conan_package.tgz completed [83.15k] @@ -160,7 +160,7 @@ An MD5 hash calculator using the Poco Libraries zlib/1.2.11: Package installed f74366f76f700cc6e991285892ad7a23c30e6d47 zlib/1.2.11: Downloaded package revision 0 ... - poco/1.9.4: Retrieving package 645aaff0a79e6036c77803601e44677556109dd9 from remote 'conan-center' + poco/1.9.4: Retrieving package 645aaff0a79e6036c77803601e44677556109dd9 from remote 'conancenter' Downloading conanmanifest.txt completed [48.75k] Downloading conaninfo.txt completed [2.44k] Downloading conan_package.tgz completed [5128.39k] @@ -251,7 +251,7 @@ For example, the command :command:`conan install .. --settings os="Linux" --sett - Checks if the package recipe (for ``poco/1.9.4`` package) exists in the local cache. If we are just starting, the cache is empty. -- Looks for the package recipe in the defined remotes. Conan comes with ``conan-center`` remote as the default, but can be changed. +- Looks for the package recipe in the defined remotes. Conan comes with ``conancenter`` remote as the default, but can be changed. - If the recipe exists, the Conan client fetches and stores it in your local Conan cache. - With the package recipe and the input settings (Linux, GCC), Conan looks for the corresponding binary in the local cache. - As the binary is not found in the cache, Conan looks for it in the remote and fetches it. @@ -310,15 +310,15 @@ To inspect all your current project's dependencies use the :command:`conan info` openssl/1.0.2t ID: eb50d18a5a5d59bd0c332464a4c348ab65e353bf BuildID: None - Remote: conan-center=https://center.conan.io - URL: https://github.com/conan-io/conan-center-index + Remote: conancenter=https://center.conan.io + URL: https://github.com/conan-io/conancenter-index Homepage: https://github.com/openssl/openssl License: OpenSSL Description: A toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols Topics: conan, openssl, ssl, tls, encryption, security Recipe: Cache Binary: Cache - Binary remote: conan-center + Binary remote: conancenter Creation date: 2019-11-13 23:14:37 Required by: poco/1.9.4 @@ -327,15 +327,15 @@ To inspect all your current project's dependencies use the :command:`conan info` poco/1.9.4 ID: 645aaff0a79e6036c77803601e44677556109dd9 BuildID: None - Remote: conan-center=https://center.conan.io - URL: https://github.com/conan-io/conan-center-index + Remote: conancenter=https://center.conan.io + URL: https://github.com/conan-io/conancenter-index Homepage: https://pocoproject.org License: BSL-1.0 Description: Modern, powerful open source C++ class libraries for building network- and internet-based applications that run on desktop, server, mobile and embedded systems. Topics: conan, poco, building, networking, server, mobile, embedded Recipe: Cache Binary: Cache - Binary remote: conan-center + Binary remote: conancenter Creation date: 2020-01-07 17:29:24 Required by: conanfile.txt @@ -344,14 +344,14 @@ To inspect all your current project's dependencies use the :command:`conan info` zlib/1.2.11 ID: f74366f76f700cc6e991285892ad7a23c30e6d47 BuildID: None - Remote: conan-center=https://center.conan.io - URL: https://github.com/conan-io/conan-center-index + Remote: conancenter=https://center.conan.io + URL: https://github.com/conan-io/conancenter-index Homepage: https://zlib.net License: Zlib Description: A Massively Spiffy Yet Delicately Unobtrusive Compression Library (Also Free, Not to Mention Unencumbered by Patents) Recipe: Cache Binary: Cache - Binary remote: conan-center + Binary remote: conancenter Creation date: 2020-01-07 17:01:29 Required by: openssl/1.0.2t @@ -373,7 +373,7 @@ Searching Packages ------------------ The remote repository where packages are installed from is configured by default in Conan. It is called Conan Center -(configured as `conan-center` remote). +(configured as `conancenter` remote). If we search for something like ``open`` in `ConanCenter `_ we could find different packages like: @@ -400,7 +400,7 @@ Conan Center or any other remote. These are legacy packages, and the ones withou and channel are the ones strongly recommended to use from ConanCenter. ConanCenter is the central public repository for Conan packages. You can contribute packages to it in -the `conan-center-index Github repository `_. +the `conancenter-index Github repository `_. If you want to store your own private packages, you can download the free Artifactory Community Edition (CE) directly from the `Conan downloads page `_. @@ -454,7 +454,7 @@ Got any doubts? Check our :ref:`faq`, |write_us| or join the community in `Cppla .. _`Poco`: https://pocoproject.org/ -.. _`conan-center`: https://conan.io/center +.. _`conancenter`: https://conan.io/center .. _`Cpplang Slack`: https://cpplang-inviter.cppalliance.org/ diff --git a/howtos/check_conan_version_in_conanfile.rst b/howtos/check_conan_version_in_conanfile.rst index 1583394aebde..19f2e7ab1d82 100644 --- a/howtos/check_conan_version_in_conanfile.rst +++ b/howtos/check_conan_version_in_conanfile.rst @@ -3,7 +3,7 @@ How to check the version of the Conan client inside a conanfile =============================================================== Sometimes it might be useful to check the Conan version that is running in that moment your recipe. -Although we consider conan-center recipes only forward compatible, this kind of check makes sense to +Although we consider ConanCenter recipes only forward compatible, this kind of check makes sense to update them so they can maintain compatibility with old versions of Conan. Let's have a look at a basic example of this: diff --git a/reference/commands/creator/upload.rst b/reference/commands/creator/upload.rst index 660021479241..562248cc4a9e 100644 --- a/reference/commands/creator/upload.rst +++ b/reference/commands/creator/upload.rst @@ -14,7 +14,7 @@ conan upload Uploads a recipe and binary packages to a remote. -If no remote is specified, the first configured remote (by default conan-center, use +If no remote is specified, the first configured remote (by default conancenter, use 'conan remote list' to list the remotes) will be used. .. code-block:: text diff --git a/reference/commands/misc/remote.rst b/reference/commands/misc/remote.rst index 6656093387ee..eca2274f03fa 100644 --- a/reference/commands/misc/remote.rst +++ b/reference/commands/misc/remote.rst @@ -46,7 +46,7 @@ Manages the remote list and the package recipes associated with a remote. .. code-block:: bash $ conan remote list - conan-center: https://center.conan.io [Verify SSL: True] + conancenter: https://center.conan.io [Verify SSL: True] local: http://localhost:9300 [Verify SSL: True, Disabled: True] - List remotes in a format almost valid for the *remotes.txt* to use with :ref:`conan_config_install`, only need @@ -55,7 +55,7 @@ Manages the remote list and the package recipes associated with a remote. .. code-block:: bash $ conan remote list --raw - conan-center https://center.conan.io True + conancenter https://center.conan.io True local http://localhost:9300 True True # capture the current remotes in a text file $ conan remote list --raw > remotes.txt @@ -149,7 +149,7 @@ the command will insert the remote in the specified position .. code-block:: bash $ conan remote list_pref zlib/1.2.8@ - zlib/1.2.8:f83037eff23ab3a94190d7f3f7b37a2d6d522241: conan.io + zlib/1.2.8:f83037eff23ab3a94190d7f3f7b37a2d6d522241: conancenter zlib/1.2.8:e46341e9b52d3e4c66657dc8fb13ab6cdd5831c6: conan-local-dev zlib/1.2.8:9de3196f2439d69299f168e3088bbefafe212f38: conan-local-prod @@ -164,7 +164,7 @@ the command will insert the remote in the specified position .. code-block:: bash - $ conan remote add_ref openssl/1.0.2u conan-center + $ conan remote add_ref openssl/1.0.2u conancenter - Update the remote associated with a package recipe: diff --git a/reference/commands/misc/user.rst b/reference/commands/misc/user.rst index 801f30f1acfb..ac18e454da60 100644 --- a/reference/commands/misc/user.rst +++ b/reference/commands/misc/user.rst @@ -47,7 +47,7 @@ to add a basic level of security). .. code-block:: bash $ conan user - Current user of remote 'conan-center' set to: 'None' (anonymous) + Current user of remote 'conancenter' set to: 'None' (anonymous) Current user of remote 'myprivateremote' set to: 'danimtb' [Authenticated] Current user of remote 'otherremote' set to: 'None' (anonymous) diff --git a/reference/commands/output/search.rst b/reference/commands/output/search.rst index 5215ad087ff3..1ad37689bc0a 100644 --- a/reference/commands/output/search.rst +++ b/reference/commands/output/search.rst @@ -40,7 +40,7 @@ The output JSON contains a two first level keys: { "error": false, "results": [{ - "remote": "conan-center", + "remote": "conancenter", "items": [{ "recipe": { "id": "eigen/3.3.4@conan/stable" @@ -76,7 +76,7 @@ The output JSON contains a two first level keys: }] } -- Search packages of a reference in a remote: :command:`conan search paho-c/1.2.0@conan/stable -r conan-center --json search.json` +- Search packages of a reference in a remote: :command:`conan search paho-c/1.2.0@conan/stable -r conancenter --json search.json` .. code-block:: json @@ -84,7 +84,7 @@ The output JSON contains a two first level keys: "error":false, "results":[ { - "remote":"conan-center", + "remote":"conancenter", "items":[ { "recipe":{ diff --git a/reference/commands/output/upload.rst b/reference/commands/output/upload.rst index 39dbc155c144..114918eea45c 100644 --- a/reference/commands/output/upload.rst +++ b/reference/commands/output/upload.rst @@ -32,7 +32,7 @@ The output JSON contains a two first level keys: .. code-block:: bash - $ conan upload "h*" -all -r conan-center --json upload.json + $ conan upload "h*" -all -r conancenter --json upload.json .. code-block:: json :caption: upload.json @@ -43,32 +43,32 @@ The output JSON contains a two first level keys: { "recipe":{ "id":"hello/0.1@conan/testing", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:19.204728" }, "packages":[ { "id":"3f3387d49612e03a5306289405a2101383b861f0", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:21.534877" }, { "id":"6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:23.934152" }, { "id":"889d5d7812b4723bd3ef05693ffd190b1106ea43", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:28.195266" }, { "id":"e98aac15065fc710dffd1b4fbee382b087c3ad1d", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:30.495989" } @@ -77,14 +77,14 @@ The output JSON contains a two first level keys: { "recipe":{ "id":"hello0/1.2.1@conan/testing", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:32.688651" }, "packages":[ { "id":"5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:34.991721" } @@ -93,14 +93,14 @@ The output JSON contains a two first level keys: { "recipe":{ "id":"hello_app/0.1@conan/testing", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:36.901333" }, "packages":[ { "id":"6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:39.243895" } @@ -109,14 +109,14 @@ The output JSON contains a two first level keys: { "recipe":{ "id":"hello_python_conan/0.1@conan/testing", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:41.181543" }, "packages":[ { "id":"5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:43.749422" } @@ -125,14 +125,14 @@ The output JSON contains a two first level keys: { "recipe":{ "id":"hello_python_reuse_conan/0.1@conan/testing", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:45.614096" }, "packages":[ { "id":"6a051b2648c89dbd1f8ada0031105b287deea9d2", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:47.942491" } @@ -141,7 +141,7 @@ The output JSON contains a two first level keys: { "recipe":{ "id":"hdf5/1.8.20@acri/testing", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:48.291756" }, @@ -152,14 +152,14 @@ The output JSON contains a two first level keys: { "recipe":{ "id":"http_parser/2.9.2", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:48.637576" }, "packages":[ { "id":"6cc50b139b9c3d27b3e9042d5f5372d327b3a9f7", - "remote_name":"conan-center", + "remote_name":"conancenter", "remote_url":"https://center.conan.io", "time":"2018-04-30T11:18:51.125189" } diff --git a/reference/commands/output/user.rst b/reference/commands/output/user.rst index 4cc9406d8c14..791b28b2bc33 100644 --- a/reference/commands/output/user.rst +++ b/reference/commands/output/user.rst @@ -32,7 +32,7 @@ List users per remote: :command:`conan user --json user.json` "error":false, "remotes":[ { - "name":"conan-center", + "name":"conancenter", "user_name":"danimtb", "authenticated":true }, diff --git a/systems_cross_building/windows_subsystems.rst b/systems_cross_building/windows_subsystems.rst index 2ae3d621848d..c274884e59ab 100644 --- a/systems_cross_building/windows_subsystems.rst +++ b/systems_cross_building/windows_subsystems.rst @@ -74,7 +74,7 @@ the right order. There are some packages you can use as ``build_requires``: -- From Conan-center: +- From conancenter: - **mingw_installer/1.0@conan/stable**: MinGW compiler installer as a Conan package. - **msys2/20190524@**: MSYS2 subsystem as a Conan package (Conan Center Index). diff --git a/uploading_packages/artifactory/artifactory_cloud.rst b/uploading_packages/artifactory/artifactory_cloud.rst index 8730c17bc65f..95b024cde233 100644 --- a/uploading_packages/artifactory/artifactory_cloud.rst +++ b/uploading_packages/artifactory/artifactory_cloud.rst @@ -44,7 +44,7 @@ repository follow these steps: Setting the remotes in this way will cause your Conan client to resolve packages and install them from repositories in the following order of priority: - 1. `conan-center`_ + 1. `conancenter`_ 2. Your own repository If you want to have your own repository first, please use the ``--insert`` command line option @@ -55,11 +55,11 @@ when adding it: $ conan remote add --insert 0 $ conan remote list : [Verify SSL: True] - conan-center: https://center.conan.io [Verify SSL: True] + conancenter: https://center.conan.io [Verify SSL: True] .. tip:: Check the full reference of :ref:`$ conan remote` command. -.. _`conan-center`: https://conan.io/center +.. _`conancenter`: https://conan.io/center diff --git a/uploading_packages/artifactory/conan_center_guide.rst b/uploading_packages/artifactory/conan_center_guide.rst index 5ec86802a15a..a338d0919872 100644 --- a/uploading_packages/artifactory/conan_center_guide.rst +++ b/uploading_packages/artifactory/conan_center_guide.rst @@ -1,8 +1,10 @@ .. _conan_center_flow: -Contributing Packages to Conan-center +Contributing Packages to ConanCenter ===================================== -Contribution of packages to ConanCenter is done via pull requests to the Github repository in https://github.com/conan-io/conan-center-index. The C3I (ConanCenter Continuous Integration) service will build binaries automatically from those pull requests, and once merged, will upload them to ConanCenter. +Contribution of packages to ConanCenter is done via pull requests to the Github repository in +https://github.com/conan-io/conan-center-index. The C3I (ConanCenter Continuous Integration) service will build binaries automatically from +those pull requests, and once merged, will upload them to ConanCenter package repository. -Read more about how to `submit a pull request to Conan-center-index `_ +Read more about how to `submit a pull request to conan-center-index `_ source repository. diff --git a/uploading_packages/remotes.rst b/uploading_packages/remotes.rst index 2c51a909617c..13fb365a9e1a 100644 --- a/uploading_packages/remotes.rst +++ b/uploading_packages/remotes.rst @@ -37,15 +37,14 @@ For distribution: .. _conan_center: ConanCenter -------------- +----------- **ConanCenter** (https://conan.io/center) is the main official repository for open source Conan packages. It is configured as the default remote in the Conan client, but if you want to add it manually: .. code-block:: bash - $ conan remote add conan-center https://center.conan.io - + $ conan remote add conancenter https://center.conan.io There are 2 different types of packages right now in ConanCenter: @@ -57,8 +56,8 @@ There are 2 different types of packages right now in ConanCenter: with an automated build service: C3I (ConanCenter Continuous Integration). These packages are the recommended ones to use from ConanCenter. -To contribute packages to ConanCenter, read the :ref:`conan-center guide ` for more information. +To contribute packages to ConanCenter, read the :ref:`ConanCenter guide ` for more information. -.. _`conan-center`: https://conan.io/center +.. _`conancenter`: https://conan.io/center .. _Artifactory documentation: https://www.jfrog.com/confluence/display/JFROG/JFrog+Artifactory From d54ba5cf914262b2ae60f541543f64f63a26a29f Mon Sep 17 00:00:00 2001 From: danimtb Date: Mon, 31 May 2021 19:50:25 +0200 Subject: [PATCH 166/681] Add clarification around conan-center remote --- uploading_packages/remotes.rst | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/uploading_packages/remotes.rst b/uploading_packages/remotes.rst index 13fb365a9e1a..83c98e46f8e6 100644 --- a/uploading_packages/remotes.rst +++ b/uploading_packages/remotes.rst @@ -36,7 +36,7 @@ For distribution: .. _conan_center: -ConanCenter +conancenter ----------- **ConanCenter** (https://conan.io/center) is the main official repository for open source @@ -46,18 +46,32 @@ Conan packages. It is configured as the default remote in the Conan client, but $ conan remote add conancenter https://center.conan.io -There are 2 different types of packages right now in ConanCenter: - -- **Packages with full reference**: Packages like `pkg/version@user/channel`. These packages binaries were created by users in their own - Bintray repositories, and included here. This flow of contributing packages to ConanCenter is deprecated now. - These packages are not recommended and should be considered as legacy. -- **Packages without "user/channel"**: Can be used directly as `pkg/version`: These packages are created - automatically from the central Github repository `conan-center-index `_, - with an automated build service: C3I (ConanCenter Continuous Integration). These packages are the recommended - ones to use from ConanCenter. +It contains **packages without "user/channel"** that can be used directly as `pkg/version` (`zlib/1.2.11`): These packages are created +automatically from the central GitHub repository `conan-center-index `_, with an automated +build service: C3I (ConanCenter Continuous Integration). To contribute packages to ConanCenter, read the :ref:`ConanCenter guide ` for more information. +conan-center [deprecated] +------------------------- + +**conan-center** was the official repository but is is no longer recommended. It is configured as the second default remote in the Conan +client to keep backwards compatibility: + +.. code-block:: bash + + $ conan-center: https://conan.bintray.com [Verify SSL: True] + +It contains all the packages from the ConanCenter remote as well as **legacy packages with full reference** (`zlib/1.2.11@conan/stable`). +These package binaries were created by users in their own Bintray repositories and included in this main repository. This flow of +contributing packages to ConanCenter is no longer available and packages are **not recommended** and should be considered as **legacy**. + +.. important:: + + This remote contains packages that are no longer maintained and will be removed from Conan's default configuration soon. We strongly + encourage users to use `conancenter` and swift to the official package references without **user/channel** + (`zlib/1.2.11@conan/stable` -> `zlib/1.2.11`). + .. _`conancenter`: https://conan.io/center .. _Artifactory documentation: https://www.jfrog.com/confluence/display/JFROG/JFrog+Artifactory From b2295ed6166bc511437070749ad3479b526dffe5 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 31 May 2021 20:04:41 +0200 Subject: [PATCH 167/681] Update getting_started.rst Co-authored-by: James --- getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started.rst b/getting_started.rst index 0fd360a7f9e4..8e2ab468e3b2 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -70,7 +70,7 @@ An MD5 hash calculator using the Poco Libraries $ conan inspect poco/1.9.4 name: poco version: 1.9.4 - url: https://github.com/conan-io/conancenter-index + url: https://github.com/conan-io/conan-center-index homepage: https://pocoproject.org license: BSL-1.0 author: None From 6734a7dfd16f0b350b43df49d35c98752145e820 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 31 May 2021 20:04:49 +0200 Subject: [PATCH 168/681] Update getting_started.rst Co-authored-by: James --- getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started.rst b/getting_started.rst index 8e2ab468e3b2..fe3d507f26d4 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -311,7 +311,7 @@ To inspect all your current project's dependencies use the :command:`conan info` ID: eb50d18a5a5d59bd0c332464a4c348ab65e353bf BuildID: None Remote: conancenter=https://center.conan.io - URL: https://github.com/conan-io/conancenter-index + URL: https://github.com/conan-io/conan-center-index Homepage: https://github.com/openssl/openssl License: OpenSSL Description: A toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols From 67c55416cea7029a5364f890317bf58b1623ac4c Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 31 May 2021 20:04:56 +0200 Subject: [PATCH 169/681] Update getting_started.rst Co-authored-by: James --- getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started.rst b/getting_started.rst index fe3d507f26d4..350091987bb4 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -328,7 +328,7 @@ To inspect all your current project's dependencies use the :command:`conan info` ID: 645aaff0a79e6036c77803601e44677556109dd9 BuildID: None Remote: conancenter=https://center.conan.io - URL: https://github.com/conan-io/conancenter-index + URL: https://github.com/conan-io/conan-center-index Homepage: https://pocoproject.org License: BSL-1.0 Description: Modern, powerful open source C++ class libraries for building network- and internet-based applications that run on desktop, server, mobile and embedded systems. From f770862e6c6ed257ceb53783b062eaacf39f5c0f Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 31 May 2021 20:05:01 +0200 Subject: [PATCH 170/681] Update getting_started.rst Co-authored-by: James --- getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started.rst b/getting_started.rst index 350091987bb4..86deca2fc75d 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -345,7 +345,7 @@ To inspect all your current project's dependencies use the :command:`conan info` ID: f74366f76f700cc6e991285892ad7a23c30e6d47 BuildID: None Remote: conancenter=https://center.conan.io - URL: https://github.com/conan-io/conancenter-index + URL: https://github.com/conan-io/conan-center-index Homepage: https://zlib.net License: Zlib Description: A Massively Spiffy Yet Delicately Unobtrusive Compression Library (Also Free, Not to Mention Unencumbered by Patents) From f1eadd8b82b27738807ea80cbf476f0ceb4c0967 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 31 May 2021 20:05:08 +0200 Subject: [PATCH 171/681] Update getting_started.rst Co-authored-by: James --- getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started.rst b/getting_started.rst index 86deca2fc75d..7e25f982fa8e 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -400,7 +400,7 @@ Conan Center or any other remote. These are legacy packages, and the ones withou and channel are the ones strongly recommended to use from ConanCenter. ConanCenter is the central public repository for Conan packages. You can contribute packages to it in -the `conancenter-index Github repository `_. +the `conancenter-index Github repository `_. If you want to store your own private packages, you can download the free Artifactory Community Edition (CE) directly from the `Conan downloads page `_. From 38e45157b3fc26eafc606dc8e8ee88717ae642da Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 31 May 2021 20:06:24 +0200 Subject: [PATCH 172/681] Update systems_cross_building/windows_subsystems.rst --- systems_cross_building/windows_subsystems.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/systems_cross_building/windows_subsystems.rst b/systems_cross_building/windows_subsystems.rst index c274884e59ab..c304018e95ff 100644 --- a/systems_cross_building/windows_subsystems.rst +++ b/systems_cross_building/windows_subsystems.rst @@ -76,7 +76,7 @@ There are some packages you can use as ``build_requires``: - From conancenter: - - **mingw_installer/1.0@conan/stable**: MinGW compiler installer as a Conan package. + - **mingw-w64/8.1**: MinGW compiler installer as a Conan package. - **msys2/20190524@**: MSYS2 subsystem as a Conan package (Conan Center Index). - **cygwin_installer/2.9.0@bincrafters/stable**: Cygwin subsystem as a Conan package. From 2db17d0aa47ced3abf68e6c310ae4bae83a3acff Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 31 May 2021 20:33:56 +0200 Subject: [PATCH 173/681] Update getting_started.rst Co-authored-by: Javier G. Sogo --- getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started.rst b/getting_started.rst index 7e25f982fa8e..cfc8179f3f92 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -400,7 +400,7 @@ Conan Center or any other remote. These are legacy packages, and the ones withou and channel are the ones strongly recommended to use from ConanCenter. ConanCenter is the central public repository for Conan packages. You can contribute packages to it in -the `conancenter-index Github repository `_. +the `conan-center-index Github repository `_. If you want to store your own private packages, you can download the free Artifactory Community Edition (CE) directly from the `Conan downloads page `_. From 2028d4d20071d12bf555f5507ecb5f4e1b39bd7f Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 31 May 2021 20:34:15 +0200 Subject: [PATCH 174/681] Update systems_cross_building/windows_subsystems.rst Co-authored-by: Javier G. Sogo --- systems_cross_building/windows_subsystems.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/systems_cross_building/windows_subsystems.rst b/systems_cross_building/windows_subsystems.rst index c304018e95ff..9ea0f7269afd 100644 --- a/systems_cross_building/windows_subsystems.rst +++ b/systems_cross_building/windows_subsystems.rst @@ -74,7 +74,7 @@ the right order. There are some packages you can use as ``build_requires``: -- From conancenter: +- From ConanCenter: - **mingw-w64/8.1**: MinGW compiler installer as a Conan package. - **msys2/20190524@**: MSYS2 subsystem as a Conan package (Conan Center Index). From d53f0495fa9eb17cef4118299ae54ffb624b1eb4 Mon Sep 17 00:00:00 2001 From: memsharded Date: Mon, 31 May 2021 22:11:04 +0200 Subject: [PATCH 175/681] new --build-require argument for create/install --- reference/commands/consumer/install.rst | 45 +++++++++++++++++++------ reference/commands/creator/create.rst | 30 +++++++++++------ 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/reference/commands/consumer/install.rst b/reference/commands/consumer/install.rst index da925215e05a..9c450b4f9dc7 100644 --- a/reference/commands/consumer/install.rst +++ b/reference/commands/consumer/install.rst @@ -7,16 +7,17 @@ conan install .. code-block:: bash $ conan install [-h] [-g GENERATOR] [-if INSTALL_FOLDER] [-m [MANIFESTS]] - [-mi [MANIFESTS_INTERACTIVE]] [-v [VERIFY]] - [--no-imports] [-j JSON] [-b [BUILD]] [-r REMOTE] [-u] - [-l LOCKFILE] [--lockfile-out LOCKFILE_OUT] [-e ENV_HOST] - [-e:b ENV_BUILD] [-e:h ENV_HOST] [-o OPTIONS_HOST] - [-o:b OPTIONS_BUILD] [-o:h OPTIONS_HOST] - [-pr PROFILE_HOST] [-pr:b PROFILE_BUILD] - [-pr:h PROFILE_HOST] [-s SETTINGS_HOST] - [-s:b SETTINGS_BUILD] [-s:h SETTINGS_HOST] - [--lockfile-node-id LOCKFILE_NODE_ID] - path_or_reference [reference] + [-mi [MANIFESTS_INTERACTIVE]] [-v [VERIFY]] + [--no-imports] [--build-require] [-j JSON] [-b [BUILD]] + [-r REMOTE] [-u] [-l LOCKFILE] + [--lockfile-out LOCKFILE_OUT] [-e ENV_HOST] + [-e:b ENV_BUILD] [-e:h ENV_HOST] [-o OPTIONS_HOST] + [-o:b OPTIONS_BUILD] [-o:h OPTIONS_HOST] + [-pr PROFILE_HOST] [-pr:b PROFILE_BUILD] + [-pr:h PROFILE_HOST] [-s SETTINGS_HOST] + [-s:b SETTINGS_BUILD] [-s:h SETTINGS_HOST] + [--lockfile-node-id LOCKFILE_NODE_ID] + path_or_reference [reference] Installs the requirements specified in a recipe (conanfile.py or conanfile.txt). @@ -60,6 +61,7 @@ generators. -v [VERIFY], --verify [VERIFY] Verify dependencies manifests against stored ones --no-imports Install specified packages but avoid running imports + --build-require The provided reference is a build-require -j JSON, --json JSON Path to a json file where the install information will be written -b [BUILD], --build [BUILD] @@ -351,3 +353,26 @@ The ``install`` command accepts several arguments related to :ref:`lockfiles Date: Wed, 2 Jun 2021 10:20:30 +0200 Subject: [PATCH 176/681] fix html --- getting_started.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/getting_started.rst b/getting_started.rst index cfc8179f3f92..7c132533dbfe 100644 --- a/getting_started.rst +++ b/getting_started.rst @@ -454,8 +454,6 @@ Got any doubts? Check our :ref:`faq`, |write_us| or join the community in `Cppla .. _`Poco`: https://pocoproject.org/ -.. _`conancenter`: https://conan.io/center - .. _`Cpplang Slack`: https://cpplang-inviter.cppalliance.org/ .. _`example repository`: https://github.com/conan-io/examples From dc18ae9c9ab16fc34deb67cd39e96c37635f8bec Mon Sep 17 00:00:00 2001 From: danimtb Date: Wed, 2 Jun 2021 11:40:17 +0200 Subject: [PATCH 177/681] add changelog link --- changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.rst b/changelog.rst index dd95a5691769..7d92568ff0a5 100644 --- a/changelog.rst +++ b/changelog.rst @@ -26,7 +26,7 @@ Check https://github.com/conan-io/conan for issues and more details about develo - Feature: Remove ``CMAKE_SKIP_RPATHS`` by default to True in ``CMakeToolchain``, it is not necessary by default, users can opt-in, and new test validates shared libs will work with ``VirtualEnv`` generator ``conanrunenv``. `#9024 `_ . Docs `here `__ - Feature: simplified ``CMakeToolchain`` with only 1 category of blocks, made ``try-compile`` template code as another block, and reordered blocks so relevant flags for try-compile are taken into account. `#9009 `_ . Docs `here `__ -- Feature: Add new default `conancenter` remote for `https://center.conan.io` as first in the list. `#8999 `_ +- Feature: Add new default `conancenter` remote for `https://center.conan.io` as first in the list. `#8999 `_ . Docs `here `__ - Feature: Implements a new experimental ``conan.tools.google`` Bazel integration with ``BazelDeps``, ``BazelToolchain`` and ``Bazel``. `#8991 `_ . Docs `here `__ - Feature: Introduced new options for the `CMakeDeps` generator allowing to manage `build_requires` even declaring the same package as a `require` and `build_require` avoiding the collision of the `config` cmake files and enabling to specify which `build_modules` should be included (e.g protobuf issue) `#8985 `_ . Docs `here `__ - Feature: Expand user-agent string to include OS info. `#8947 `_ From fffd0e1e064ab1ebd2df9e28ca557aa84511f0ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Mart=C3=ADnez=20de=20Bartolom=C3=A9?= Date: Wed, 2 Jun 2021 12:56:30 +0200 Subject: [PATCH 178/681] Fix and clarification for folders.source --- developing_packages/package_layout.rst | 2 +- reference/conanfile/methods.rst | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/developing_packages/package_layout.rst b/developing_packages/package_layout.rst index bc31ab1f0592..06f99b27f205 100644 --- a/developing_packages/package_layout.rst +++ b/developing_packages/package_layout.rst @@ -65,7 +65,7 @@ file when using the :ref:`CMakeDeps` generator because it wil settings = "os", "build_type", "arch" requires = "zlib/1.2.11" generators = "CMakeDeps", "CMakeToolchain" - exports_sources = "src" + exports_sources = "src*" def layout(self): self.folders.build = "cmake-build-{}".format(str(self.settings.build_type).lower()) diff --git a/reference/conanfile/methods.rst b/reference/conanfile/methods.rst index ec2c9d022fac..807de6b264d0 100644 --- a/reference/conanfile/methods.rst +++ b/reference/conanfile/methods.rst @@ -1470,7 +1470,8 @@ self.folders - **self.folders.source** (Defaulted to ""): Specifies a subfolder where the sources are. The ``self.source_folder`` attribute and the *current working directory* inside the ``source(self)`` method will be set with this subfolder. It is used in the cache when running :command:`conan create` (relative to the cache source folder) as well as in a local folder when running :command:`conan source` - (relative to the local current folder). + (relative to the local current folder). Note: Both the `export_sources`, `exports` and `scm` sources will be copied to the root source + directory, being the **self.folders.source** variable the way to describe if the fetched sources are still in a subfolder. - **self.folders.build** (Defaulted to ""): Specifies a subfolder where the files from the build are. The ``self.build_folder`` attribute and the *current working directory* inside the ``build(self)`` method will be set with this subfolder. It is used in the cache when running From 666c2a84eb4d4b6763e924b84172e2e6ae14dbf9 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 2 Jun 2021 13:29:29 +0200 Subject: [PATCH 179/681] cmake docs split into files (#2114) --- reference/conanfile/tools/cmake.rst | 512 +----------------- reference/conanfile/tools/cmake/cmake.rst | 128 +++++ reference/conanfile/tools/cmake/cmakedeps.rst | 132 +++++ .../conanfile/tools/cmake/cmaketoolchain.rst | 262 +++++++++ 4 files changed, 527 insertions(+), 507 deletions(-) create mode 100644 reference/conanfile/tools/cmake/cmake.rst create mode 100644 reference/conanfile/tools/cmake/cmakedeps.rst create mode 100644 reference/conanfile/tools/cmake/cmaketoolchain.rst diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index abb29e9be409..29fb40379ffa 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -8,511 +8,9 @@ conan.tools.cmake These tools are **experimental** and subject to breaking changes. -CMakeDeps ---------- +.. toctree:: + :maxdepth: 2 -Available since: `1.33.0 `_ - -The ``CMakeDeps`` helper will generate one **xxxx-config.cmake** file per dependency, together with other necessary *.cmake* files -like version, flags and directory data or configuration. It can be used like: - - -.. code-block:: python - - from conans import ConanFile - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - generators = "CMakeDeps" - - -The full instantiation, that allows custom configuration can be done in the ``generate()`` method: - - -.. code-block:: python - - from conans import ConanFile - from conan.tools.cmake import CMakeDeps - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - - def generate(self): - cmake = CMakeDeps(self) - cmake.generate() - -There are some attributes you can adjust in the created ``CMakeDeps`` object to change the default behavior: - -configurations -++++++++++++++ - -Allows to define custom user CMake configurations besides the standard -Release, Debug, etc ones. If the **settings.yml** file is customized to add new configurations to the -``settings.build_type``, then, adding it explicitly to ``.configurations`` is not necessary. - -.. code-block:: python - - def generate(self): - cmake = CMakeDeps(self) - cmake.configurations.append("ReleaseShared") - if self.options["hello"].shared: - cmake.configuration = "ReleaseShared" - cmake.generate() - - -build_context_activated -+++++++++++++++++++++++ - -When you have a **build-require**, by default, the config files (`xxx-config.cmake`) files are not generated. -But you can activate it using the **build_context_activated** attribute: - -.. code-block:: python - - build_requires = ["my_tool/0.0.1"] - - def generate(self): - cmake = CMakeDeps(self) - # generate the config files for the build require - cmake.build_context_activated = ["my_tool"] - cmake.generate() - - -build_context_suffix -++++++++++++++++++++ - -When you have the same package as a **build-require** and as a **regular require** it will cause a conflict in the generator -because the file names of the config files will collide as well as the targets names, variables names etc. - -For example, this is a typical situation with some requirements (capnproto, protobuf...) that contain -a tool used to generate source code at build time (so it is a **build_require**), -but also providing a library to link to the final application, so you also have a **regular require**. -Solving this conflict is specially important when we are cross-building because the tool -(that will run in the building machine) belongs to a different binary package than the library, that will "run" in the -host machine. - -You can use the **build_context_suffix** attribute to specify a suffix for a requirement, -so the files/targets/variables of the requirement in the build context (build require) will be renamed: - -.. code-block:: python - - build_requires = ["my_tool/0.0.1"] - requires = ["my_tool/0.0.1"] - - def generate(self): - cmake = CMakeDeps(self) - # generate the config files for the build require - cmake.build_context_activated = ["my_tool"] - # disambiguate the files, targets, etc - cmake.build_context_suffix = {"my_tool": "_BUILD"} - cmake.generate() - - - -build_context_build_modules -+++++++++++++++++++++++++++ - -Also there is another issue with the **build_modules**. As you may know, the recipes of the requirements can declare a -`cppinfo.build_modules` entry containing one or more **.cmake** files. -When the requirement is found by the cmake ``find_package()`` -function, Conan will include automatically these files. - -By default, Conan will include only the build modules from the -``host`` context (regular requires) to avoid the collision, but you can change the default behavior. - -Use the **build_context_build_modules** attribute to specify require names to include the **build_modules** from -**build_requires**: - -.. code-block:: python - - build_requires = ["my_tool/0.0.1"] - - def generate(self): - cmake = CMakeDeps(self) - # generate the config files for the build require - cmake.build_context_activated = ["my_tool"] - # Choose the build modules from "build" context - cmake.build_context_build_modules = ["my_tool"] - cmake.generate() - - -.. _conan-cmake-toolchain: - -CMakeToolchain --------------- -The ``CMakeToolchain`` is the toolchain generator for CMake. It will generate toolchain files that can be used in the -command line invocation of CMake with the ``-DCMAKE_TOOLCHAIN_FILE=conantoolchain.cmake``. This generator translates -the current package configuration, settings, and options, into CMake toolchain syntax. - -It can be declared as: - -.. code-block:: python - - from conans import ConanFile - - class Pkg(ConanFile): - generators = "CMakeToolchain" - -Or fully instantiated in the ``generate()`` method: - -.. code-block:: python - - from conans import ConanFile - from conan.tools.cmake import CMakeToolchain - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - generators = "cmake_find_package_multi" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} - - def generate(self): - tc = CMakeToolchain(self) - tc.variables["MYVAR"] = "MYVAR_VALUE" - tc.preprocessor_definitions["MYDEFINE"] = "MYDEF_VALUE" - tc.generate() - - -This will generate the following files after a ``conan install`` (or when building the package -in the cache) with the information provided in the ``generate()`` method as well as information -translated from the current ``settings``: - -- *conan_toolchain.cmake* file, containing the translation of Conan settings to CMake variables. - Some things that will be defined in this file: - - - Definition of the CMake generator platform and generator toolset - - Definition of the CMake ``build_type`` - - Definition of the ``CMAKE_POSITION_INDEPENDENT_CODE``, based on ``fPIC`` option. - - Definition of the C++ standard as necessary - - Definition of the standard library used for C++ - - Deactivation of rpaths in OSX - -- *conanbuild.json*: The toolchain can also generate a ``conanbuild.json`` file that contains arguments to - the command line ``CMake()`` helper used in the recipe ``build()`` method. At the moment it contains only the CMake - generator and the CMake toolchain file. The CMake generator will be deduced from the current Conan compiler settings: - - - For ``settings.compiler="Visual Studio"``, the CMake generator is a direct mapping of ``compiler.version``, as this version represents the IDE version, not the compiler version. - - For ``settings.compiler=msvc``, the CMake generator will be by default the one of the Visual Studio that introduced this compiler version (``msvc 19.0`` => ``Visual Studio 14``, ``msvc 19.1`` => ``Visual Studio 15``, etc). This can be changed, using the ``tools.microsoft.msbuild:vs_version`` [conf] configuration. If it is defined, that Visual Studio version will be used as the CMake generator, and the specific compiler version and toolset will be defined in the ``conan_toolchain.cmake`` file. - -- *conanvcvars.bat*: In some cases, the Visual Studio environment needs to be defined correctly for building, - like when using the Ninja or NMake generators. If necessary, the ``CMakeToolchain`` will generate this script, - so defining the correct Visual Studio prompt is easier. - - -constructor -+++++++++++ - -.. code:: python - - def __init__(self, conanfile, generator=None): - - -Most of the arguments are optional and will be deduced from the current ``settings``, and not -necessary to define them. - - -preprocessor_definitions -++++++++++++++++++++++++ - -This attribute allows defining CMake variables, for multiple configurations (Debug, Release, etc). - -.. code:: python - - def generate(self): - tc = CMakeToolchain(self) - tc.preprocessor_definitions["MYVAR"] = "MyValue" - tc.preprocessor_definitions.debug["MYCONFIGVAR"] = "MyDebugValue" - tc.preprocessor_definitions.release["MYCONFIGVAR"] = "MyReleaseValue" - tc.generate() - -This will be translated to: - -- One ``set()`` definition for ``MYVAR`` in ``conan_toolchain.cmake`` file. -- One ``set()`` definition, using a cmake generator expression in ``conan_toolchain.cmake`` file, - using the different values for different configurations. - - -The ``CMakeToolchain`` is intended to run with the ``CMakeDeps`` dependencies generator. It might temporarily -work with others like ``cmake_find_package`` and ``cmake_find_package_multi``, but this will be removed soon. - - -Using a custom toolchain file -+++++++++++++++++++++++++++++ - -There are two ways of providing a custom CMake toolchain file: - -- The ``conan_toolchain.cmake`` file can be completely skipped and replaced by a user one, defining the ``tools.cmake.cmaketoolchain:toolchain_file=`` configuration value -- A custom user toolchain file can be added (included from) the ``conan_toolchain.cmake`` one, by using the ``user_toolchain`` block described below, and defining the ``tools.cmake.cmaketoolchain:user_toolchain=`` configuration value. - - -Using the toolchain in developer flow -+++++++++++++++++++++++++++++++++++++ - -One of the advantages of using Conan toolchains is that they can help to achieve the exact same build -with local development flows, than when the package is created in the cache. - -With the ``CMakeToolchain`` it is possible to do, for multi-configuration systems like Visual Studio -(assuming we are using the ``cmake_find_package_multi`` generator): - -.. code:: bash - - # Lets start in the folder containing the conanfile.py - $ mkdir build && cd build - # Install both debug and release deps and create the toolchain - $ conan install .. - $ conan install .. -s build_type=Debug - # the conan_toolchain.cmake is common for both configurations - # Need to pass the generator WITHOUT the platform, that matches your default settings - $ cmake .. -G "Visual Studio 15" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake - # Now you can open the IDE, select Debug or Release config and build - # or, in the command line - $ cmake --build . --config Release - $ cmake --build . --config Debug - - -**NOTE**: The platform (Win64), is already encoded in the toolchain. The command line shouldn't pass it, so using -``-G "Visual Studio 15"`` instead of the ``-G "Visual Studio 15 Win64"`` - - -For single-configuration build systems: - -.. code:: bash - - # Lets start in the folder containing the conanfile.py - $ mkdir build_release && cd build_release - $ conan install .. - # the build type Release is encoded in the toolchain already. - # This conan_toolchain.cmake is specific for release - $ cmake .. -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake - $ cmake --build . # or just "make" - - # debug build requires its own folder - $ cd .. && mkdir build_debug && cd build_debug - $ conan install .. -s build_type=Debug - # the build type Debug is encoded in the toolchain already. - # This conan_toolchain.cmake is specific for debug - $ cmake .. -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake - $ cmake --build . # or just "make" - - -Extending and customizing CMakeToolchain -++++++++++++++++++++++++++++++++++++++++ - -Since Conan 1.36, ``CMakeToolchain`` implements a powerful capability for extending and customizing the resulting toolchain file. - -The following predefined blocks are available, and added in this order: - -- ``user_toolchain``: Allows to include a user toolchain from the ``conan_toolchain.cmake`` file. If the configuration ``tools.cmake.cmaketoolchain:user_toolchain=xxxx`` is defined, its value will be ``include(xxx)`` as the first line in ``conan_toolchain.cmake``. -- ``generic_system``: Defines ``CMAKE_GENERATOR_PLATFORM``, ``CMAKE_GENERATOR_TOOLSET``, ``CMAKE_C_COMPILER``,``CMAKE_CXX_COMPILER`` and ``CMAKE_BUILD_TYPE`` -- ``android_system``: Defines ``ANDROID_PLATFORM``, ``ANDROID_STL``, ``ANDROID_ABI`` and includes ``CMAKE_ANDROID_NDK/build/cmake/android.toolchain.cmake`` - where CMAKE_ANDROID_NDK comes defined in ``tools.android:ndk_path`` configuration value. -- ``apple_system``: Defines ``CMAKE_SYSTEM_NAME``, ``CMAKE_SYSTEM_VERSION``, ``CMAKE_OSX_ARCHITECTURES``, ``CMAKE_OSX_SYSROOT`` for Apple systems. -- ``fpic``: Defines the ``CMAKE_POSITION_INDEPENDENT_CODE`` when there is a ``options.fPIC`` -- ``arch_flags``: Defines C/C++ flags like ``-m32, -m64`` when necessary. -- ``libcxx``: Defines ``-stdlib=libc++`` flag when necessary as well as ``_GLIBCXX_USE_CXX11_ABI``. -- ``vs_runtime``: Defines the ``CMAKE_MSVC_RUNTIME_LIBRARY`` variable, as a generator expression for multiple configurations. -- ``cppstd``: defines ``CMAKE_CXX_STANDARD``, ``CMAKE_CXX_EXTENSIONS`` -- ``parallel``: defines ``/MP`` parallel build flag for Visual. -- ``cmake_flags_init``: defines ``CMAKE_XXX_FLAGS`` variables based on previously defined Conan variables. The blocks above only define ``CONAN_XXX`` variables, and this block will define CMake ones like ``set(CMAKE_CXX_FLAGS_INIT "${CONAN_CXX_FLAGS}" CACHE STRING "" FORCE)```. -- ``try_compile``: Stop processing the toolchain, skipping the blocks below this one, if ``IN_TRY_COMPILE`` CMake property is defined. -- ``find_paths``: Defines ``CMAKE_FIND_PACKAGE_PREFER_CONFIG``, ``CMAKE_MODULE_PATH``, ``CMAKE_PREFIX_PATH`` so the generated files from ``CMakeDeps`` are found. -- ``rpath``: Defines ``CMAKE_SKIP_RPATH``. By default it is disabled, and it is needed to define ``self.blocks["rpath"].skip_rpath=True`` if you want to activate ``CMAKE_SKIP_RPATH`` -- ``shared``: defines ``BUILD_SHARED_LIBS`` - - - -Blocks can be customized in different ways: - -.. code:: python - - # remove an existing block - def generate(self): - tc = CMakeToolchain(self) - tc.blocks.remove("generic_system") - - # modify the template of an existing block - def generate(self): - tc = CMakeToolchain(self) - tmp = tc.blocks["generic_system"].template - new_tmp = tmp.replace(...) # replace, fully replace, append... - tc.blocks["generic_system"].template = new_tmp - - # modify the context (variables) of an existing block - import types - - def generate(self): - tc = CMakeToolchain(self) - generic_block = toolchain.blocks["generic_system"] - - def context(self): - assert self # Your own custom logic here - return {"build_type": "SuperRelease"} - generic_block.context = types.MethodType(context, generic_block) - - # completely replace existing block - def generate(self): - tc = CMakeToolchain(self) - # this could go to a python_requires - class MyGenericBlock(Block): - template = "HelloWorld" - - def context(self): - return {} - - tc.blocks["generic_system"] = MyBlock - - # add a completely new block - def generate(self): - tc = CMakeToolchain(self) - # this could go to a python_requires - class MyBlock(Block): - template = "Hello {{myvar}}!!!" - - def context(self): - return {"myvar": "World"} - - tc.blocks["mynewblock"] = MyBlock - - - # extend from an existing block - def generate(self): - tc = CMakeToolchain(self) - # this could go to a python_requires - class MyBlock(GenericSystemBlock): - template = "Hello {{build_type}}!!" - - def context(self): - c = super(MyBlock, self).context() - c["build_type"] = c["build_type"] + "Super" - return c - - tc.blocks["generic_system"] = MyBlock - -Recall that this is a very **experimental** feature, and these interfaces might change in the following releases. - -For more information about these blocks, please have a look at the source code. - - -CMake ------ -The ``CMake`` build helper is a wrapper around the command line invocation of cmake. It will abstract the -calls like ``cmake --build . --config Release`` into Python method calls. It will also add the argument -``-DCMAKE_TOOLCHAIN_FILE=conantoolchain.cmake`` to the ``configure()`` call. - -The helper is intended to be used in the ``build()`` method, to call CMake commands automatically -when a package is being built directly by Conan (create, install) - - -.. code-block:: python - - from conans import ConanFile - from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps - - class App(ConanFile): - settings = "os", "arch", "compiler", "build_type" - requires = "hello/0.1" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} - - def generate(self): - tc = CMakeToolchain(self) - tc.generate() - deps = CMakeDeps(self) - deps.generate() - - def build(self): - cmake = CMake(self) - cmake.configure() - cmake.build() - -**Note:** This helper includes the additional flag `-DCMAKE_SH="CMAKE_SH-NOTFOUND"` when using the `MinGW Makefiles` CMake's -generator, to avoid the error of `sh` being in the PATH (CMake version < 3.17.0). - -It supports the following methods: - -constructor -+++++++++++ - -.. code:: python - - def __init__(self, conanfile, build_folder=None): - -- ``conanfile``: the current recipe object. Always use ``self``. -- ``build_folder``: Relative path to a folder to contain the temporary build files - - -configure() -+++++++++++ - -.. code:: python - - def configure(self, source_folder=None): - -Calls ``cmake``, with the generator defined in the ``cmake_generator`` field of the -``conanbuild.json`` file, and passing ``-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake``. -If ``conanbuild.json`` file is not there, no generator will be passed. - -- ``source_folder``: Relative path to the folder containing the root *CMakeLists.txt* - - -build() -+++++++ - -.. code:: python - - def build(self, build_type=None, target=None): - - -Calls the build system. Equivalent to :command:`cmake --build .` in the build folder. - - -- ``build_type``: Use it only to override the value defined in the ``settings.build_type`` for a multi-configuration generator (e.g. Visual Studio, XCode). - This value will be ignored for single-configuration generators, they will use the one defined in the toolchain file during the install step. -- ``target``: name of the build target to run. - - -install() -+++++++++ - -.. code:: python - - def install(self, build_type=None): - - -Equivalent to run ``cmake --build . --target=install`` - -- ``build_type``: Use it only to override the value defined in the ``settings.build_type``. It - can fail if the build is single configuration (e.g. Unix Makefiles), as in that case the build - type must be specified at configure time, not build type. - - -test() -++++++ - -.. code:: python - - def test(self, build_type=None, target=None, output_on_failure=False): - - -Equivalent to running :command:`cmake --build . --target=RUN_TESTS`. - -- ``build_type``: Use it only to override the value defined in the ``settings.build_type``. It - can fail if the build is single configuration (e.g. Unix Makefiles), as in that case the build - type must be specified at configure time, not build type. -- ``target``: name of the build target to run, by default ``RUN_TESTS`` or ``test``. - - -conf -++++ - -- ``tools.microsoft.msbuild:verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed - to the ``CMake.build()`` command, when a Visual Studio generator (MSBuild build system) is being used for CMake. It is passed as - an argument to the underlying build system via the call ``cmake --build . --config Release -- /verbosity:Diagnostic`` - -- ``tools.ninja:jobs`` argument for the ``--jobs`` parameter when running Ninja generator. (overrides - the general ``tools.build:processes``). - -- ``tools.microsoft.msbuild:max_cpu_count`` argument for the ``/m`` (``/maxCpuCount``) when running - ``MSBuild`` (overrides the general ``tools.build:processes``). + cmake/cmakedeps + cmake/cmaketoolchain + cmake/cmake diff --git a/reference/conanfile/tools/cmake/cmake.rst b/reference/conanfile/tools/cmake/cmake.rst new file mode 100644 index 000000000000..ebe92fb447c5 --- /dev/null +++ b/reference/conanfile/tools/cmake/cmake.rst @@ -0,0 +1,128 @@ + +CMake +----- + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The ``CMake`` build helper is a wrapper around the command line invocation of cmake. It will abstract the +calls like ``cmake --build . --config Release`` into Python method calls. It will also add the argument +``-DCMAKE_TOOLCHAIN_FILE=conantoolchain.cmake`` to the ``configure()`` call. + +The helper is intended to be used in the ``build()`` method, to call CMake commands automatically +when a package is being built directly by Conan (create, install) + + +.. code-block:: python + + from conans import ConanFile + from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + options = {"shared": [True, False], "fPIC": [True, False]} + default_options = {"shared": False, "fPIC": True} + + def generate(self): + tc = CMakeToolchain(self) + tc.generate() + deps = CMakeDeps(self) + deps.generate() + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + +**Note:** This helper includes the additional flag `-DCMAKE_SH="CMAKE_SH-NOTFOUND"` when using the `MinGW Makefiles` CMake's +generator, to avoid the error of `sh` being in the PATH (CMake version < 3.17.0). + +It supports the following methods: + +constructor ++++++++++++ + +.. code:: python + + def __init__(self, conanfile, build_folder=None): + +- ``conanfile``: the current recipe object. Always use ``self``. +- ``build_folder``: Relative path to a folder to contain the temporary build files + + +configure() ++++++++++++ + +.. code:: python + + def configure(self, source_folder=None): + +Calls ``cmake``, with the generator defined in the ``cmake_generator`` field of the +``conanbuild.json`` file, and passing ``-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake``. +If ``conanbuild.json`` file is not there, no generator will be passed. + +- ``source_folder``: Relative path to the folder containing the root *CMakeLists.txt* + + +build() ++++++++ + +.. code:: python + + def build(self, build_type=None, target=None): + + +Calls the build system. Equivalent to :command:`cmake --build .` in the build folder. + + +- ``build_type``: Use it only to override the value defined in the ``settings.build_type`` for a multi-configuration generator (e.g. Visual Studio, XCode). + This value will be ignored for single-configuration generators, they will use the one defined in the toolchain file during the install step. +- ``target``: name of the build target to run. + + +install() ++++++++++ + +.. code:: python + + def install(self, build_type=None): + + +Equivalent to run ``cmake --build . --target=install`` + +- ``build_type``: Use it only to override the value defined in the ``settings.build_type``. It + can fail if the build is single configuration (e.g. Unix Makefiles), as in that case the build + type must be specified at configure time, not build type. + + +test() +++++++ + +.. code:: python + + def test(self, build_type=None, target=None, output_on_failure=False): + + +Equivalent to running :command:`cmake --build . --target=RUN_TESTS`. + +- ``build_type``: Use it only to override the value defined in the ``settings.build_type``. It + can fail if the build is single configuration (e.g. Unix Makefiles), as in that case the build + type must be specified at configure time, not build type. +- ``target``: name of the build target to run, by default ``RUN_TESTS`` or ``test``. + + +conf +++++ + +- ``tools.microsoft.msbuild:verbosity`` will accept one of ``"Quiet", "Minimal", "Normal", "Detailed", "Diagnostic"`` to be passed + to the ``CMake.build()`` command, when a Visual Studio generator (MSBuild build system) is being used for CMake. It is passed as + an argument to the underlying build system via the call ``cmake --build . --config Release -- /verbosity:Diagnostic`` + +- ``tools.ninja:jobs`` argument for the ``--jobs`` parameter when running Ninja generator. (overrides + the general ``tools.build:processes``). + +- ``tools.microsoft.msbuild:max_cpu_count`` argument for the ``/m`` (``/maxCpuCount``) when running + ``MSBuild`` (overrides the general ``tools.build:processes``). diff --git a/reference/conanfile/tools/cmake/cmakedeps.rst b/reference/conanfile/tools/cmake/cmakedeps.rst new file mode 100644 index 000000000000..5d78bf6c7d6b --- /dev/null +++ b/reference/conanfile/tools/cmake/cmakedeps.rst @@ -0,0 +1,132 @@ +CMakeDeps +--------- + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +Available since: `1.33.0 `_ + +The ``CMakeDeps`` helper will generate one **xxxx-config.cmake** file per dependency, together with other necessary *.cmake* files +like version, flags and directory data or configuration. It can be used like: + + +.. code-block:: python + + from conans import ConanFile + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + generators = "CMakeDeps" + + +The full instantiation, that allows custom configuration can be done in the ``generate()`` method: + + +.. code-block:: python + + from conans import ConanFile + from conan.tools.cmake import CMakeDeps + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + + def generate(self): + cmake = CMakeDeps(self) + cmake.generate() + +There are some attributes you can adjust in the created ``CMakeDeps`` object to change the default behavior: + +configurations +++++++++++++++ + +Allows to define custom user CMake configurations besides the standard +Release, Debug, etc ones. If the **settings.yml** file is customized to add new configurations to the +``settings.build_type``, then, adding it explicitly to ``.configurations`` is not necessary. + +.. code-block:: python + + def generate(self): + cmake = CMakeDeps(self) + cmake.configurations.append("ReleaseShared") + if self.options["hello"].shared: + cmake.configuration = "ReleaseShared" + cmake.generate() + + +build_context_activated ++++++++++++++++++++++++ + +When you have a **build-require**, by default, the config files (`xxx-config.cmake`) files are not generated. +But you can activate it using the **build_context_activated** attribute: + +.. code-block:: python + + build_requires = ["my_tool/0.0.1"] + + def generate(self): + cmake = CMakeDeps(self) + # generate the config files for the build require + cmake.build_context_activated = ["my_tool"] + cmake.generate() + + +build_context_suffix +++++++++++++++++++++ + +When you have the same package as a **build-require** and as a **regular require** it will cause a conflict in the generator +because the file names of the config files will collide as well as the targets names, variables names etc. + +For example, this is a typical situation with some requirements (capnproto, protobuf...) that contain +a tool used to generate source code at build time (so it is a **build_require**), +but also providing a library to link to the final application, so you also have a **regular require**. +Solving this conflict is specially important when we are cross-building because the tool +(that will run in the building machine) belongs to a different binary package than the library, that will "run" in the +host machine. + +You can use the **build_context_suffix** attribute to specify a suffix for a requirement, +so the files/targets/variables of the requirement in the build context (build require) will be renamed: + +.. code-block:: python + + build_requires = ["my_tool/0.0.1"] + requires = ["my_tool/0.0.1"] + + def generate(self): + cmake = CMakeDeps(self) + # generate the config files for the build require + cmake.build_context_activated = ["my_tool"] + # disambiguate the files, targets, etc + cmake.build_context_suffix = {"my_tool": "_BUILD"} + cmake.generate() + + + +build_context_build_modules ++++++++++++++++++++++++++++ + +Also there is another issue with the **build_modules**. As you may know, the recipes of the requirements can declare a +`cppinfo.build_modules` entry containing one or more **.cmake** files. +When the requirement is found by the cmake ``find_package()`` +function, Conan will include automatically these files. + +By default, Conan will include only the build modules from the +``host`` context (regular requires) to avoid the collision, but you can change the default behavior. + +Use the **build_context_build_modules** attribute to specify require names to include the **build_modules** from +**build_requires**: + +.. code-block:: python + + build_requires = ["my_tool/0.0.1"] + + def generate(self): + cmake = CMakeDeps(self) + # generate the config files for the build require + cmake.build_context_activated = ["my_tool"] + # Choose the build modules from "build" context + cmake.build_context_build_modules = ["my_tool"] + cmake.generate() diff --git a/reference/conanfile/tools/cmake/cmaketoolchain.rst b/reference/conanfile/tools/cmake/cmaketoolchain.rst new file mode 100644 index 000000000000..0c37066e1c92 --- /dev/null +++ b/reference/conanfile/tools/cmake/cmaketoolchain.rst @@ -0,0 +1,262 @@ +.. _conan-cmake-toolchain: + +CMakeToolchain +-------------- + +.. warning:: + + These tools are **experimental** and subject to breaking changes. + + +The ``CMakeToolchain`` is the toolchain generator for CMake. It will generate toolchain files that can be used in the +command line invocation of CMake with the ``-DCMAKE_TOOLCHAIN_FILE=conantoolchain.cmake``. This generator translates +the current package configuration, settings, and options, into CMake toolchain syntax. + +It can be declared as: + +.. code-block:: python + + from conans import ConanFile + + class Pkg(ConanFile): + generators = "CMakeToolchain" + +Or fully instantiated in the ``generate()`` method: + +.. code-block:: python + + from conans import ConanFile + from conan.tools.cmake import CMakeToolchain + + class App(ConanFile): + settings = "os", "arch", "compiler", "build_type" + requires = "hello/0.1" + generators = "cmake_find_package_multi" + options = {"shared": [True, False], "fPIC": [True, False]} + default_options = {"shared": False, "fPIC": True} + + def generate(self): + tc = CMakeToolchain(self) + tc.variables["MYVAR"] = "MYVAR_VALUE" + tc.preprocessor_definitions["MYDEFINE"] = "MYDEF_VALUE" + tc.generate() + + +This will generate the following files after a ``conan install`` (or when building the package +in the cache) with the information provided in the ``generate()`` method as well as information +translated from the current ``settings``: + +- *conan_toolchain.cmake* file, containing the translation of Conan settings to CMake variables. + Some things that will be defined in this file: + + - Definition of the CMake generator platform and generator toolset + - Definition of the CMake ``build_type`` + - Definition of the ``CMAKE_POSITION_INDEPENDENT_CODE``, based on ``fPIC`` option. + - Definition of the C++ standard as necessary + - Definition of the standard library used for C++ + - Deactivation of rpaths in OSX + +- *conanbuild.json*: The toolchain can also generate a ``conanbuild.json`` file that contains arguments to + the command line ``CMake()`` helper used in the recipe ``build()`` method. At the moment it contains only the CMake + generator and the CMake toolchain file. The CMake generator will be deduced from the current Conan compiler settings: + + - For ``settings.compiler="Visual Studio"``, the CMake generator is a direct mapping of ``compiler.version``, as this version represents the IDE version, not the compiler version. + - For ``settings.compiler=msvc``, the CMake generator will be by default the one of the Visual Studio that introduced this compiler version (``msvc 19.0`` => ``Visual Studio 14``, ``msvc 19.1`` => ``Visual Studio 15``, etc). This can be changed, using the ``tools.microsoft.msbuild:vs_version`` [conf] configuration. If it is defined, that Visual Studio version will be used as the CMake generator, and the specific compiler version and toolset will be defined in the ``conan_toolchain.cmake`` file. + +- *conanvcvars.bat*: In some cases, the Visual Studio environment needs to be defined correctly for building, + like when using the Ninja or NMake generators. If necessary, the ``CMakeToolchain`` will generate this script, + so defining the correct Visual Studio prompt is easier. + + +constructor ++++++++++++ + +.. code:: python + + def __init__(self, conanfile, generator=None): + + +Most of the arguments are optional and will be deduced from the current ``settings``, and not +necessary to define them. + + +preprocessor_definitions +++++++++++++++++++++++++ + +This attribute allows defining CMake variables, for multiple configurations (Debug, Release, etc). + +.. code:: python + + def generate(self): + tc = CMakeToolchain(self) + tc.preprocessor_definitions["MYVAR"] = "MyValue" + tc.preprocessor_definitions.debug["MYCONFIGVAR"] = "MyDebugValue" + tc.preprocessor_definitions.release["MYCONFIGVAR"] = "MyReleaseValue" + tc.generate() + +This will be translated to: + +- One ``set()`` definition for ``MYVAR`` in ``conan_toolchain.cmake`` file. +- One ``set()`` definition, using a cmake generator expression in ``conan_toolchain.cmake`` file, + using the different values for different configurations. + + +The ``CMakeToolchain`` is intended to run with the ``CMakeDeps`` dependencies generator. It might temporarily +work with others like ``cmake_find_package`` and ``cmake_find_package_multi``, but this will be removed soon. + + +Using a custom toolchain file ++++++++++++++++++++++++++++++ + +There are two ways of providing a custom CMake toolchain file: + +- The ``conan_toolchain.cmake`` file can be completely skipped and replaced by a user one, defining the ``tools.cmake.cmaketoolchain:toolchain_file=`` configuration value +- A custom user toolchain file can be added (included from) the ``conan_toolchain.cmake`` one, by using the ``user_toolchain`` block described below, and defining the ``tools.cmake.cmaketoolchain:user_toolchain=`` configuration value. + + +Using the toolchain in developer flow ++++++++++++++++++++++++++++++++++++++ + +One of the advantages of using Conan toolchains is that they can help to achieve the exact same build +with local development flows, than when the package is created in the cache. + +With the ``CMakeToolchain`` it is possible to do, for multi-configuration systems like Visual Studio +(assuming we are using the ``cmake_find_package_multi`` generator): + +.. code:: bash + + # Lets start in the folder containing the conanfile.py + $ mkdir build && cd build + # Install both debug and release deps and create the toolchain + $ conan install .. + $ conan install .. -s build_type=Debug + # the conan_toolchain.cmake is common for both configurations + # Need to pass the generator WITHOUT the platform, that matches your default settings + $ cmake .. -G "Visual Studio 15" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake + # Now you can open the IDE, select Debug or Release config and build + # or, in the command line + $ cmake --build . --config Release + $ cmake --build . --config Debug + + +**NOTE**: The platform (Win64), is already encoded in the toolchain. The command line shouldn't pass it, so using +``-G "Visual Studio 15"`` instead of the ``-G "Visual Studio 15 Win64"`` + + +For single-configuration build systems: + +.. code:: bash + + # Lets start in the folder containing the conanfile.py + $ mkdir build_release && cd build_release + $ conan install .. + # the build type Release is encoded in the toolchain already. + # This conan_toolchain.cmake is specific for release + $ cmake .. -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake + $ cmake --build . # or just "make" + + # debug build requires its own folder + $ cd .. && mkdir build_debug && cd build_debug + $ conan install .. -s build_type=Debug + # the build type Debug is encoded in the toolchain already. + # This conan_toolchain.cmake is specific for debug + $ cmake .. -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake + $ cmake --build . # or just "make" + + +Extending and customizing CMakeToolchain +++++++++++++++++++++++++++++++++++++++++ + +Since Conan 1.36, ``CMakeToolchain`` implements a powerful capability for extending and customizing the resulting toolchain file. + +The following predefined blocks are available, and added in this order: + +- ``user_toolchain``: Allows to include a user toolchain from the ``conan_toolchain.cmake`` file. If the configuration ``tools.cmake.cmaketoolchain:user_toolchain=xxxx`` is defined, its value will be ``include(xxx)`` as the first line in ``conan_toolchain.cmake``. +- ``generic_system``: Defines ``CMAKE_GENERATOR_PLATFORM``, ``CMAKE_GENERATOR_TOOLSET``, ``CMAKE_C_COMPILER``,``CMAKE_CXX_COMPILER`` and ``CMAKE_BUILD_TYPE`` +- ``android_system``: Defines ``ANDROID_PLATFORM``, ``ANDROID_STL``, ``ANDROID_ABI`` and includes ``CMAKE_ANDROID_NDK/build/cmake/android.toolchain.cmake`` + where CMAKE_ANDROID_NDK comes defined in ``tools.android:ndk_path`` configuration value. +- ``apple_system``: Defines ``CMAKE_SYSTEM_NAME``, ``CMAKE_SYSTEM_VERSION``, ``CMAKE_OSX_ARCHITECTURES``, ``CMAKE_OSX_SYSROOT`` for Apple systems. +- ``fpic``: Defines the ``CMAKE_POSITION_INDEPENDENT_CODE`` when there is a ``options.fPIC`` +- ``arch_flags``: Defines C/C++ flags like ``-m32, -m64`` when necessary. +- ``libcxx``: Defines ``-stdlib=libc++`` flag when necessary as well as ``_GLIBCXX_USE_CXX11_ABI``. +- ``vs_runtime``: Defines the ``CMAKE_MSVC_RUNTIME_LIBRARY`` variable, as a generator expression for multiple configurations. +- ``cppstd``: defines ``CMAKE_CXX_STANDARD``, ``CMAKE_CXX_EXTENSIONS`` +- ``parallel``: defines ``/MP`` parallel build flag for Visual. +- ``cmake_flags_init``: defines ``CMAKE_XXX_FLAGS`` variables based on previously defined Conan variables. The blocks above only define ``CONAN_XXX`` variables, and this block will define CMake ones like ``set(CMAKE_CXX_FLAGS_INIT "${CONAN_CXX_FLAGS}" CACHE STRING "" FORCE)```. +- ``try_compile``: Stop processing the toolchain, skipping the blocks below this one, if ``IN_TRY_COMPILE`` CMake property is defined. +- ``find_paths``: Defines ``CMAKE_FIND_PACKAGE_PREFER_CONFIG``, ``CMAKE_MODULE_PATH``, ``CMAKE_PREFIX_PATH`` so the generated files from ``CMakeDeps`` are found. +- ``rpath``: Defines ``CMAKE_SKIP_RPATH``. By default it is disabled, and it is needed to define ``self.blocks["rpath"].skip_rpath=True`` if you want to activate ``CMAKE_SKIP_RPATH`` +- ``shared``: defines ``BUILD_SHARED_LIBS`` + + + +Blocks can be customized in different ways: + +.. code:: python + + # remove an existing block + def generate(self): + tc = CMakeToolchain(self) + tc.blocks.remove("generic_system") + + # modify the template of an existing block + def generate(self): + tc = CMakeToolchain(self) + tmp = tc.blocks["generic_system"].template + new_tmp = tmp.replace(...) # replace, fully replace, append... + tc.blocks["generic_system"].template = new_tmp + + # modify the context (variables) of an existing block + import types + + def generate(self): + tc = CMakeToolchain(self) + generic_block = toolchain.blocks["generic_system"] + + def context(self): + assert self # Your own custom logic here + return {"build_type": "SuperRelease"} + generic_block.context = types.MethodType(context, generic_block) + + # completely replace existing block + def generate(self): + tc = CMakeToolchain(self) + # this could go to a python_requires + class MyGenericBlock(Block): + template = "HelloWorld" + + def context(self): + return {} + + tc.blocks["generic_system"] = MyBlock + + # add a completely new block + def generate(self): + tc = CMakeToolchain(self) + # this could go to a python_requires + class MyBlock(Block): + template = "Hello {{myvar}}!!!" + + def context(self): + return {"myvar": "World"} + + tc.blocks["mynewblock"] = MyBlock + + + # extend from an existing block + def generate(self): + tc = CMakeToolchain(self) + # this could go to a python_requires + class MyBlock(GenericSystemBlock): + template = "Hello {{build_type}}!!" + + def context(self): + c = super(MyBlock, self).context() + c["build_type"] = c["build_type"] + "Super" + return c + + tc.blocks["generic_system"] = MyBlock + +Recall that this is a very **experimental** feature, and these interfaces might change in the following releases. + +For more information about these blocks, please have a look at the source code. From b7410a1d24ea7dd4f1b74cfb53a8b9bd01350afb Mon Sep 17 00:00:00 2001 From: czoido Date: Wed, 2 Jun 2021 16:15:17 +0200 Subject: [PATCH 180/681] update changelog --- changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.rst b/changelog.rst index 7d92568ff0a5..bbaa9ff2ad05 100644 --- a/changelog.rst +++ b/changelog.rst @@ -37,7 +37,7 @@ Check https://github.com/conan-io/conan for issues and more details about develo - Feature: Update urlib3 Conan dependency setting version `>=1.25.8` to avoid CVE-2020-7212. `#8914 `_ - Feature: Build-requires can define [conf] for its consumers. `#8895 `_ . Docs `here `__ - Feature: support M1 Catalyst. `#8818 `_ -- Feature: New ``conan install --build-require`` and ``conan create --build-require`` (when not using ``test_package``) arguments to explicitly define that the installed or created package has to be a ``build-require``, receiving the build profile instead of the host one. `#8627 `_ +- Feature: New ``conan install --build-require`` and ``conan create --build-require`` (when not using ``test_package``) arguments to explicitly define that the installed or created package has to be a ``build-require``, receiving the build profile instead of the host one. `#8627 `_ . Docs `here `__ - Feature: Introduced the `layout()` method to the recipe to be able to declare the folder structure both for the local development methods (conan source, conan build...) and in the cache. Also, associated to the folders, cppinfo objects to be used in editable packages and file pattern descriptions to enable "auto packaging". `#8554 `_ . Docs `here `__ - Fix: **CMakeDeps** generator: The transitive requirements for a build_require are not included in the `xxx-config.cmake` files generated. `#9015 `_ - Fix: The `CMakeToolchain` now supports Apple M1 cross-building with a profile without environment declared pointing to the system toolchain. `#9011 `_ From 0836d80a53b5f652f3c15d3f38100fabb5c9ff78 Mon Sep 17 00:00:00 2001 From: Michael Maguire Date: Mon, 7 Jun 2021 16:13:33 +0200 Subject: [PATCH 181/681] Correct --build=! examples to show that --build didn't work, while --build=* did Also, show explicitly in the example that more than one build exclusion can be specified. See discussion in: https://cpplang.slack.com/archives/C41CWV9HA/p1623072231189500 and https://cpplang.slack.com/archives/C41CWV9HA/p1623072667191400 --- mastering/policies.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastering/policies.rst b/mastering/policies.rst index 64e6235f79cb..3d88425495d3 100644 --- a/mastering/policies.rst +++ b/mastering/policies.rst @@ -13,7 +13,7 @@ As previously demonstrated, we can use the :command:`--build` option to change t - :command:`--build cascade` will build from code all the nodes with some dependency being built (for any reason). Can be used together with any other build policy. Useful to make sure that any new change introduced in a dependency is incorporated by building again the package. - :command:`--build pattern*` will build only the packages with the reference starting with "pattern". -- :command:`--build --build=!some_package` will build all requirements from sources, except for some_package. +- :command:`--build=* --build=!some_package1 --build=!some_package2` will build all requirements from sources, except for some_package1 and some_package2. With the ``build_policy`` attribute in the `conanfile.py` the package creator can change the default Conan's build behavior. The allowed build_policy values are: From 1833fdb38f6170fff69943ff97037989fe761db4 Mon Sep 17 00:00:00 2001 From: czoido Date: Tue, 8 Jun 2021 13:50:30 +0200 Subject: [PATCH 182/681] 1.37.1 --- .ci/publish.jenkins | 2 +- changelog.rst | 11 ++++++++++- conf.py | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.ci/publish.jenkins b/.ci/publish.jenkins index e2a0a435c7ee..84f9e31d6ddc 100644 --- a/.ci/publish.jenkins +++ b/.ci/publish.jenkins @@ -2,7 +2,7 @@ // TODO: Move to a file and avoid modifying CI script Map versions = [ - 'release/1.37.0': '1.37', + 'release/1.37.1': '1.37', 'release/1.36.0': '1.36', 'release/1.35.2': '1.35', 'release/1.34.1': '1.34', diff --git a/changelog.rst b/changelog.rst index bbaa9ff2ad05..3f3dbf872312 100644 --- a/changelog.rst +++ b/changelog.rst @@ -21,6 +21,16 @@ Check https://github.com/conan-io/conan for issues and more details about develo Conan 1.37 shouldn't break any existing 1.0 recipe or command line invocation. If it does, please submit a report on GitHub. Read more about the :ref:`Conan stability commitment`. +1.37.1 (08-Jun-2021) +-------------------- + +- Fix: Update the experimental ``conan new ... -m=v2_cmake`` template to start using the new ``layout()`` basic info. `#9053 `_ +- Fix: Do not fail in ``CMakeDeps`` when there are ``build_requires`` with same name as host requires, unless ``build_context_activated`` is enabled for those and a different suffix has not been defined. `#9046 `_ +- Fix: When using the new `self.folders.source` (at `layout(self)` method) the sources (from `export`, `export_sources` and `scm`) are copied to the base source folder and not to the `self.folders.source` that is intended to describe where the sources are after fetching them. `#9043 `_ . Docs `here `__ +- BugFix: Do not quote all values and allow integer and macro referencing in ``MSBuildToolchain.preprocessor_definitions`` `#9056 `_ +- Bugfix: The new generators like `CMakeDeps` and `CMakeToolchain`write the generated files defaulting to the `install folder` if no `self.folders.generators` is specified in the `layout()` method. `#9050 `_ +- Bugfix: The `CMakeToolchain` generator now manages correctly a recipe without `arch` declared in an Apple system. `#9045 `_ + 1.37.0 (31-May-2021) -------------------- @@ -56,7 +66,6 @@ Check https://github.com/conan-io/conan for issues and more details about develo - Bugfix: AptTool: add repo key before running apt-add-repository. `#8861 `_ - BugFix: Prevent evil insertions into metadata.json resulted in corrupted package and inability to install. `#8532 `_ - 1.36.0 (28-Apr-2021) -------------------- diff --git a/conf.py b/conf.py index 24aee5687c9c..c432d157e063 100644 --- a/conf.py +++ b/conf.py @@ -43,7 +43,7 @@ # The short X.Y version. version = "1.37" # The full version, including alpha/beta/rc tags. -release = u'1.37.0' +release = u'1.37.1' dir_path = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(dir_path, "versions.json")): From a917939893ec8f4e7b1853cada03d023d483626a Mon Sep 17 00:00:00 2001 From: Luis Martinez de Bartolome Izquierdo Date: Tue, 8 Jun 2021 21:54:43 +0200 Subject: [PATCH 183/681] Toolchain block for XXX_DIRS (#2108) * Toolchain block for XXX_DIRS * Update section --- reference/conanfile/tools/cmake.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reference/conanfile/tools/cmake.rst b/reference/conanfile/tools/cmake.rst index abb29e9be409..35f7b2d9ccdb 100644 --- a/reference/conanfile/tools/cmake.rst +++ b/reference/conanfile/tools/cmake.rst @@ -318,11 +318,12 @@ The following predefined blocks are available, and added in this order: - ``cmake_flags_init``: defines ``CMAKE_XXX_FLAGS`` variables based on previously defined Conan variables. The blocks above only define ``CONAN_XXX`` variables, and this block will define CMake ones like ``set(CMAKE_CXX_FLAGS_INIT "${CONAN_CXX_FLAGS}" CACHE STRING "" FORCE)```. - ``try_compile``: Stop processing the toolchain, skipping the blocks below this one, if ``IN_TRY_COMPILE`` CMake property is defined. - ``find_paths``: Defines ``CMAKE_FIND_PACKAGE_PREFER_CONFIG``, ``CMAKE_MODULE_PATH``, ``CMAKE_PREFIX_PATH`` so the generated files from ``CMakeDeps`` are found. + Also defines ``XXX_DIR`` variable for each requirement when cross building to **iOS**, **tvOS** and **watchOS** where ``CMAKE_PREFIX_PATH`` and ``CMAKE_MODULE_PATH`` are ignored. + - ``rpath``: Defines ``CMAKE_SKIP_RPATH``. By default it is disabled, and it is needed to define ``self.blocks["rpath"].skip_rpath=True`` if you want to activate ``CMAKE_SKIP_RPATH`` - ``shared``: defines ``BUILD_SHARED_LIBS`` - Blocks can be customized in different ways: .. code:: python From ee393a7514d6db28b03c263757810b9d351a06f5 Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Thu, 4 Jun 2020 14:42:09 +0100 Subject: [PATCH 184/681] Initial, sketchy attempt at a Conan Cheatsheet --- cheatsheet.rst | 157 +++++++++++++++++++++++++++++++++++++++++++++++++ index.rst | 1 + 2 files changed, 158 insertions(+) diff --git a/cheatsheet.rst b/cheatsheet.rst index 045ec1427930..5de6e2057a6d 100644 --- a/cheatsheet.rst +++ b/cheatsheet.rst @@ -16,3 +16,160 @@ as both a PDF and PNG. :height: 600 px :width: 800 px :align: center + +.. cheatsheet: + +Cheatsheet +========== + +Consuming Packages +------------------ + +'conan install' installs the requirements specified in a recipe (`conanfile.py` or `conanfile.txt`). + +conanfile.txt + +.. code-block:: text + + [requires] + booost/1.72.0 + poco/1.9.4 + + [generators] + cmake + + [options] + boost:shared=False + poco:shared=False + +Release build: + +.. code-block:: bash + + $ mkdir build + $ cd build + $ conan install .. + $ cmake .. -DCMAKE_BUILD_TYPE=Release + +Debug build: + +.. code-block:: bash + + $ conan install .. -s build_type=Debug + $ cmake .. -DCMAKE_BUILD_TYPE=Debug + + conan search + conan search zlib/1.2.11@ --table=file.html -r=conan-center + +Visualizing Dependencies +++++++++++++++++++++++++ + +.. code-block:: bash + + # In a directory with conanfile.txt or conanfile.py, create image of dependencies: + $ conan info . --graph=file.html + +Searching Packages +++++++++++++++++++ + +'conan search' searches package recipes and binaries in the local cache or a remote. + +.. code-block:: bash + + $ conan search # lists names of packages + $ conan search zlib/1.2.11@ # shows recipe's Package_ID, [options] and [settings] + $ conan search zlib/1.2.11@ --table=file.html -r=conan-center + +Inspecting Packages ++++++++++++++++++++ + +'conan get' + +.. code-block:: bash + + $ conan get zlib/1.2.11@ # prints out the Python recipe of the package + $ conan inspect zlib/1.2.11@ # prints details of the package + +Creating Packages +----------------- + +.. code-block:: bash + + # in a directory that has a conanfile.py representing a package: + $ conan create . user/testing # Creates a release package + $ conan create . user/testing -s build_type=Debug # Creates a debug package + $ conan search hello/0.1@user/testing + +Notes: + +- ConanCenter does not use user/channel +- Custom packages you create should use user/channel + +Options ++++++++ + +.. code-block:: bash + + $ conan create . user/testing -s build_type=Debug -o hello:shared=True + +Profiles +++++++++ + +.. code-block:: bash + + $ conan profile list + $ conan profile show default + $ conan install . -pr=windows -pr=vs2017 # composable, last -pr wins + +Cross-Compiling ++++++++++++++++ + +File rpi_armv7: + +.. code-block:: text + + [settings] + os=Linux + compiler=gcc + compiler.version=6 + compiler.libcxx=libstdc++11 + build_type=Release + arch=armv7 + os_build=Linus + arch_build=x86_64 + + [env] + CC=arm-linux-gnueabihf-gcc + CXX=arm-linux-gnueabihf-g++ + +.. code-block:: bash + + $ conan create . user/testing -pr=rpi_armv7 # Use a different profile + $ conan search hello/0.1@user/testing + + +Publishing Packages +------------------- + +Uploading Packages to Artifactory ++++++++++++++++++++++++++++++++++ + +.. code-block:: bash + + $ conan remote add artifactory http://35.223.57.164:8081/artifactory/api/conan/myconanrepo + $ conan remote list + $ conan upload "hello*" -r artifactory --all + $ conan search "*" -r=artifactory + $ conan search hello/0.1@user/testing -r=artifactory + $ conan upload "*" -r artifactory --all --confirm + + +Other Information +----------------- + +Local Cache ++++++++++++ + +.. code-block:: text + + ~/.conan/ diff --git a/index.rst b/index.rst index c2620d5c1e6f..dd687a800852 100644 --- a/index.rst +++ b/index.rst @@ -46,6 +46,7 @@ commitment to stability, with no breaking changes across all Conan 1.X versions. integrations configuration howtos + cheatsheet reference videos faq From 188582cb4cafacf36b4dea6ea229d65439cc359f Mon Sep 17 00:00:00 2001 From: Daniel Petry Date: Thu, 28 Jan 2021 17:19:19 +0100 Subject: [PATCH 185/681] Refine Conan Cheatsheet The aim of the cheatsheet is to act as a reference for answering questions: "how do I..?". --- cheatsheet.rst | 506 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 423 insertions(+), 83 deletions(-) diff --git a/cheatsheet.rst b/cheatsheet.rst index 5de6e2057a6d..a870776a77d8 100644 --- a/cheatsheet.rst +++ b/cheatsheet.rst @@ -19,157 +19,497 @@ as both a PDF and PNG. .. cheatsheet: -Cheatsheet -========== +Conan Cheatsheet +================ + +.. contents:: + :local: + +Setup and configuration +----------------------- + +Configurations +++++++++++++++ + +Configurations contain hooks_, profiles_, `remote repositories`_ and settings_, making them available for builds once installed. They are installed from a folder, zip, URL or git repo, and the installed items are recorded in ~/.conan/conan.conf. + +Install configurations: + +.. code-block:: bash + + $ conan config install # Copies the relevant contents from to the user's ~/.conan directory. + +Alternatively, copying files and editing conan.conf can be done manually. + +View configurations: + +.. code-block:: bash + + $ conan config get # Shows the conan.conf file + +Set configuration values: + +.. code-block:: bash + + $ conan config set
.= + +Profiles +++++++++ + +Profiles allow users to set aspects of the build environment. This includes settings_, options_, environment variables and build requirements. They can be installed into ~/.conan/profiles. They can also be stored in project directories, which can be useful for specific compilation cases, for example cross-compiling. + +Profiles are stored in text files with no file extension. An example profile: + +.. code-block:: text + + CROSS_GCC=arm-linux-gnueabihf + + include(default) # Can include other configurations, for example the default configuration + + [settings] + os=Linux + compiler=gcc + compiler.version=6 + compiler.libcxx=libstdc++11 + build_type=Release + arch=armv7 + os_build=Linus + arch_build=x86_64 + OpenSSL:compiler.version=4.8 # Dependency-specific value + + [options] + shared=True + + [env] # Environment variables + CC=$CROSS_GCC-gcc # Strings can be defined and substituted + CXX=$CROSS_GCC-g++ + + [build_requires] # Requirements for package builds only + cmake/3.16.3 # Specifying build requirements here rather than in the recipe makes them less binding + +List profiles: + +.. code-block:: bash + + $ conan profile list + +Show a profile: + +.. code-block:: bash -Consuming Packages + $ conan profile show + +Use profile while executing command (e.g., ``conan install`` or ``conan create``): + +.. code-block:: bash + + $ conan . -pr= -pr= # Use installed profile name, or file path + # Composable, last -pr wins for conflicts + +Remote repositories ++++++++++++++++++++ + +Conan Center is configured by default. + +List configured remotes: + +.. code-block:: bash + + $ conan remote list + +Add remote: + +.. code-block:: bash + + $ conan remote add + +Consuming packages ------------------ -'conan install' installs the requirements specified in a recipe (`conanfile.py` or `conanfile.txt`). +Using packages in an application +++++++++++++++++++++++++++++++++ -conanfile.txt +1. Write a Conanfile.txt. This captures the project configuration: .. code-block:: text - [requires] - booost/1.72.0 + [requires] # The Conan packages which are used in the application + boost/1.72.0 # Versions override versions upstream in the dependency graph poco/1.9.4 - [generators] + [build_requires] # The Conan packages which are used to build the application + 7zip/16.00 + + [generators] # Generators create build system files that capture the dependency information cmake - [options] - boost:shared=False - poco:shared=False + [options] # Options here override options upstream in the dependency graph + boost:shared=True # Options can be specified on a per-package basis for dependencies + poco:shared=True + + [imports] # Copies files from the cache to the application directory + bin, *.dll -> ./bin # Copies all .dll files from the packages' bin/ folder to the local bin/ folder -Release build: +2. Get dependencies and generate build system files via ``conan install`` .. code-block:: bash - $ mkdir build - $ cd build - $ conan install .. - $ cmake .. -DCMAKE_BUILD_TYPE=Release + $ conan install . + [-o :