Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Configure dependencies page #3907

Open
memsharded opened this issue Nov 20, 2024 · 2 comments
Open

Configure dependencies page #3907

memsharded opened this issue Nov 20, 2024 · 2 comments
Milestone

Comments

@memsharded
Copy link
Member

It is a bit difficult to see best practices around using and defining options.

  • accesing info via self.dependencies not self.options["dependency"]
  • Pattern usages
  • Best in profiles

Feedback by @mpusz

@memsharded memsharded added this to the 2 milestone Nov 20, 2024
@mpusz
Copy link

mpusz commented Nov 20, 2024

Thanks! My customers are trying to achieve this in different ways, and they often suffer.

The approach people often use is to force something in configure(). Also, they often use the old self.options["mp-units"].cxx_modules = True or mp-units:cxx_modules=True as, despite them being deprecated, they can still easily be Googled in some blogs or StackOverlfow. If you will ask ChatGPT it will provide plenty of invalid answers:

ChatGPT: How to set options for dependencies is Conan?

In Conan, you can set options for dependencies to customize their behavior or features when building your project. Here’s a step-by-step guide on how to configure options for dependencies in Conan:


1. Understand Conan Options

Conan packages often define options to toggle features (e.g., enabling shared libraries or specific modules). You can view available options for a package using the command:

conan inspect <package_name> -a options

For example, for zlib, you might see options like shared, fPIC, etc.


2. Set Options in conanfile.txt

If you're using a conanfile.txt file, specify the options under the [options] section:

[requires]
zlib/1.2.11

[options]
zlib:shared=True

Here:

  • zlib is the package name.
  • shared=True sets the option for the zlib package to build as a shared library.

3. Set Options in conanfile.py

If you're using a conanfile.py, options can be set programmatically in the build_requirements or requirements methods:

from conan import ConanFile

class MyProject(ConanFile):
    requires = "zlib/1.2.11"

    def configure(self):
        self.options["zlib"].shared = True

4. Set Options on the Command Line

You can override options when installing dependencies by using the -o flag:

conan install . -o zlib:shared=True

This is useful for testing or quick builds.


5. Set Global Options in a Profile

You can set options in a Conan profile for consistent configuration across multiple projects:

  • Create or edit a profile (e.g., ~/.conan/profiles/default or custom profiles).
  • Add the [options] section:
[options]
zlib:shared=True

Use the profile with:

conan install . --profile=default

6. Multi-Level Option Management

Options in Conan can be overridden at different levels:

  1. Command-line overrides everything.
  2. Conanfile options (conanfile.txt or conanfile.py) take precedence over profiles.
  3. Profiles provide global configuration defaults.

7. Example: Combine Multiple Options

For multiple dependencies with options:

[requires]
zlib/1.2.11
openssl/1.1.1s

[options]
zlib:shared=True
openssl:shared=False

This configuration ensures zlib is built as a shared library, while openssl remains static.


By understanding these mechanisms, you can fine-tune Conan's dependency management for your project's needs.

This is why a good page that will be easy to find is really needed here. It should discuss and compare various options of doing it:

  • default_options
  • configure
  • requires
  • setting of the same option in more than one recipe at a time
  • profiles
  • command line
    and possibly some more.

@vulder
Copy link

vulder commented Nov 20, 2024

I'll can second what @mpusz said. In addition, I would suggest to add a few lines on pros/cons of certain approaches (e.g., I was not aware that the configure way prevents users from overriding the values, which per say I don't see as nothing strictly bad/good, as it depends on what one wants to achieve. However, it should be easy for an author to judge what pattern is needed/wanted.). Furthermore, maybe a note on the ordering/precedence different ways have would also be helpful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants