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

Disallow tools.os_info and platform in requirements/build_requirements/config_options/configure/validate #320

Merged
merged 7 commits into from
Sep 10, 2021

Conversation

madebr
Copy link
Contributor

@madebr madebr commented Jul 20, 2021

In recent weeks, c3i infrastructure + cci recipes received a lot of attention regarding cross building:

  • c3i now builds/tests package on armv8 on Macos
  • @SpaceIm updated a lot of recipes to support cross building to Apple's M1.

While doing so, it became clear that the use of tools.os_info and platform is troublesome if host profile != build profile.
This is even more important for c3i because the arbiter (=entity that sends builds jobs to linux/windows/macos machines) runs on Linux.
So it becomes important that all checks inside config_options/configure/validate/requirements/build_requirements do not depend on e.g. tools.os_info.is_windows or the platform module.

See e.g. the following comments (and more):

Instead of tools.os_info.XXX, we/I propose to use self.settings_build (if available).
See conan-io/conan-center-index#6371 (comment)

So the following python code:

def build_requirements(self):
    if tools.os_info.is_windows and not tools.get_env("CONAN_BASH_PATH"):
        self.build_requires("msys2/cci.latest")

can be replaced with:

@property
def _settings_build(self):
    return getattr(self, "settings_build", self.settings)

def build_requirements(self):
    if self._settings_build.os == "Windows" and not tools.get_env("CONAN_BASH_PATH"):
        self.build_requires("msys2/cci.latest")

This alternative method, which is cross compile proof, has been successfully used by @SpaceIm in the last days.

uilianries
uilianries previously approved these changes Aug 6, 2021
SSE4
SSE4 previously approved these changes Aug 19, 2021
Copy link
Contributor

@SSE4 SSE4 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the usage of the visitor pattern

@SSE4 SSE4 requested a review from danimtb August 19, 2021 10:30
@madebr madebr dismissed stale reviews from SSE4 and uilianries via eb83ccd August 19, 2021 10:58
@madebr
Copy link
Contributor Author

madebr commented Aug 19, 2021

I like the usage of the visitor pattern

Thanks. I used astpretty to analyze the ast.

I made a last minute change.

hooks/conan-center.py Outdated Show resolved Hide resolved
@SSE4
Copy link
Contributor

SSE4 commented Aug 19, 2021

not much

$ grep -RnI "\.os_info" . | grep conanfile | wc
    387    2100   46387

@SSE4
Copy link
Contributor

SSE4 commented Aug 19, 2021

@madebr seems like there are conflicts now

@madebr
Copy link
Contributor Author

madebr commented Aug 19, 2021

@madebr seems like there are conflicts now

I rebased the pr.

SSE4
SSE4 previously approved these changes Aug 19, 2021
hooks/conan-center.py Outdated Show resolved Hide resolved
uilianries
uilianries previously approved these changes Aug 20, 2021
SSE4
SSE4 previously approved these changes Aug 20, 2021
@danimtb
Copy link
Member

danimtb commented Aug 23, 2021

I have run a hook check with the changes in this PR to see what recipes would fail. Here is the list:

FAIL: conan export recipes/7zip/19.00 7zip/19.00@
FAIL: conan export recipes/argon2/all argon2/20190702@
FAIL: conan export recipes/argtable2/all argtable2/2.13@
FAIL: conan export recipes/bison/all bison/3.7.1@
FAIL: conan export recipes/bison/all bison/3.5.3@
FAIL: conan export recipes/cairo/all cairo/1.16.0@
FAIL: conan export recipes/cairo/all cairo/1.17.2@
FAIL: conan export recipes/cairo/all cairo/1.17.4@
FAIL: conan export recipes/cityhash/all cityhash/cci.20130801@
FAIL: conan export recipes/coin-cbc/all coin-cbc/2.10.5@
FAIL: conan export recipes/coin-cgl/all coin-cgl/0.60.3@
FAIL: conan export recipes/coin-clp/all coin-clp/1.17.6@
FAIL: conan export recipes/coin-osi/all coin-osi/0.108.6@
FAIL: conan export recipes/coin-utils/all coin-utils/2.11.4@
FAIL: conan export recipes/cppunit/all cppunit/1.15.1@
FAIL: conan export recipes/doxygen/all doxygen/1.9.1@
FAIL: conan export recipes/doxygen/all doxygen/1.8.20@
FAIL: conan export recipes/doxygen/all doxygen/1.8.18@
FAIL: conan export recipes/doxygen/all doxygen/1.8.17@
FAIL: conan export recipes/elfutils/all elfutils/0.180@
FAIL: conan export recipes/folly/all folly/2019.10.21.00@
FAIL: conan export recipes/folly/all folly/2020.08.10.00@
FAIL: conan export recipes/fontconfig/all fontconfig/2.13.93@
FAIL: conan export recipes/fontconfig/all fontconfig/2.13.92@
FAIL: conan export recipes/fontconfig/all fontconfig/2.13.91@
FAIL: conan export recipes/freexl/all freexl/1.0.5@
FAIL: conan export recipes/freexl/all freexl/1.0.6@
FAIL: conan export recipes/genie/all genie/1141@
FAIL: conan export recipes/genie/all genie/1157@
FAIL: conan export recipes/gettext/all gettext/0.20.1@
FAIL: conan export recipes/gf-complete/all gf-complete/1.03@
FAIL: conan export recipes/gf-complete/all gf-complete/cci.20170410@
FAIL: conan export recipes/giflib/all giflib/5.1.4@
FAIL: conan export recipes/gmp/all gmp/6.2.0@
FAIL: conan export recipes/gmp/all gmp/6.2.1@
FAIL: conan export recipes/gmp/all gmp/6.1.2@
FAIL: conan export recipes/gsoap/all gsoap/2.8.103@
FAIL: conan export recipes/gsoap/all gsoap/2.8.104@
FAIL: conan export recipes/gsoap/all gsoap/2.8.105@
FAIL: conan export recipes/gsoap/all gsoap/2.8.106@
FAIL: conan export recipes/isl/all isl/0.23@
FAIL: conan export recipes/isl/all isl/0.22@
FAIL: conan export recipes/lcms/all lcms/2.9@
FAIL: conan export recipes/lcms/all lcms/2.10@
FAIL: conan export recipes/lcms/all lcms/2.11@
FAIL: conan export recipes/libaom-av1/all libaom-av1/2.0.1@
FAIL: conan export recipes/libaom-av1/all libaom-av1/3.1.1@
FAIL: conan export recipes/libatomic_ops/all libatomic_ops/7.6.10@
FAIL: conan export recipes/libbacktrace/all libbacktrace/cci.20210118@
FAIL: conan export recipes/libcheck/all libcheck/0.15.2@
FAIL: conan export recipes/libconfuse/all libconfuse/3.2.2@
FAIL: conan export recipes/libconfuse/all libconfuse/3.3@
FAIL: conan export recipes/libdb/all libdb/5.3.28@
FAIL: conan export recipes/libdeflate/all libdeflate/1.8@
FAIL: conan export recipes/libdeflate/all libdeflate/1.7@
FAIL: conan export recipes/libdisasm/all libdisasm/0.23@
FAIL: conan export recipes/libev/all libev/4.33@
FAIL: conan export recipes/libev/all libev/4.27@
FAIL: conan export recipes/libev/all libev/4.25@
FAIL: conan export recipes/libfdk_aac/all libfdk_aac/2.0.2@
FAIL: conan export recipes/libfdk_aac/all libfdk_aac/2.0.1@
FAIL: conan export recipes/libfdk_aac/all libfdk_aac/2.0.0@
FAIL: conan export recipes/libffi/all libffi/3.2.1@
FAIL: conan export recipes/libffi/all libffi/3.3@
FAIL: conan export recipes/libffi/all libffi/3.4.2@
FAIL: conan export recipes/libgettext/all libgettext/0.20.1@
FAIL: conan export recipes/libidn/all libidn/1.36@
FAIL: conan export recipes/libidn2/all libidn2/2.3.0@
FAIL: conan export recipes/libltc/all libltc/1.3.1@
FAIL: conan export recipes/libpq/all libpq/13.3@
FAIL: conan export recipes/libpq/all libpq/13.2@
FAIL: conan export recipes/libpq/all libpq/13.1@
FAIL: conan export recipes/libpq/all libpq/13.0@
FAIL: conan export recipes/libpq/all libpq/12.6@
FAIL: conan export recipes/libpq/all libpq/12.4@
FAIL: conan export recipes/libpq/all libpq/12.3@
FAIL: conan export recipes/libpq/all libpq/12.2@
FAIL: conan export recipes/libpq/all libpq/11.11@
FAIL: conan export recipes/libpq/all libpq/11.9@
FAIL: conan export recipes/libpq/all libpq/11.7@
FAIL: conan export recipes/libpq/all libpq/11.5@
FAIL: conan export recipes/libpq/all libpq/10.14@
FAIL: conan export recipes/libpq/all libpq/9.6.19@
FAIL: conan export recipes/librhash/all librhash/1.3.9@
FAIL: conan export recipes/libsafec/all libsafec/3.6.0@
FAIL: conan export recipes/libsmacker/all libsmacker/1.1.1r35@
FAIL: conan export recipes/libsodium/all libsodium/1.0.18@
FAIL: conan export recipes/libtommath/all libtommath/1.2.0@
FAIL: conan export recipes/libtool/all libtool/2.4.6@
FAIL: conan export recipes/liburing/all liburing/0.7@
FAIL: conan export recipes/liburing/all liburing/2.0@
FAIL: conan export recipes/libvpx/all libvpx/1.9.0@
FAIL: conan export recipes/libxml2/all libxml2/2.9.9@
FAIL: conan export recipes/libxml2/all libxml2/2.9.10@
FAIL: conan export recipes/libxml2/all libxml2/2.9.12@
FAIL: conan export recipes/liquid-dsp/all liquid-dsp/1.3.2@
FAIL: conan export recipes/lzip/all lzip/1.21@
FAIL: conan export recipes/lzma_sdk/9.20 lzma_sdk/9.20@
FAIL: conan export recipes/mpdecimal/2.5.x mpdecimal/2.5.1@
FAIL: conan export recipes/mpdecimal/2.5.x mpdecimal/2.5.0@
FAIL: conan export recipes/mpfr/all mpfr/4.1.0@
FAIL: conan export recipes/mpfr/all mpfr/4.0.2@
FAIL: conan export recipes/mpir/all mpir/3.0.0@
FAIL: conan export recipes/nasm/all nasm/2.13.01@
FAIL: conan export recipes/nasm/all nasm/2.13.02@
FAIL: conan export recipes/nasm/all nasm/2.14@
FAIL: conan export recipes/nasm/all nasm/2.15.05@
FAIL: conan export recipes/ncurses/all ncurses/6.2@
FAIL: conan export recipes/nspr/all nspr/4.24@
FAIL: conan export recipes/nspr/all nspr/4.27@
FAIL: conan export recipes/nspr/all nspr/4.29@
FAIL: conan export recipes/openh264/all openh264/2.1.1@
FAIL: conan export recipes/openh264/all openh264/1.7.0@
FAIL: conan export recipes/openssl/1.x.x openssl/1.0.2s@
FAIL: conan export recipes/openssl/1.x.x openssl/1.0.2t@
FAIL: conan export recipes/openssl/1.x.x openssl/1.0.2u@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.0k@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.0l@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1c@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1d@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1e@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1f@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1g@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1h@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1i@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1j@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1k@
FAIL: conan export recipes/opusfile/all opusfile/0.12@
FAIL: conan export recipes/opusfile/all opusfile/0.11@
FAIL: conan export recipes/pixman/all pixman/0.38.4@
FAIL: conan export recipes/pixman/all pixman/0.40.0@
FAIL: conan export recipes/pthreads4w/all pthreads4w/3.0.0@
FAIL: conan export recipes/qt/5.x.x qt/5.15.2@
FAIL: conan export recipes/re2c/all re2c/2.1.1@
FAIL: conan export recipes/re2c/all re2c/2.0.3@
FAIL: conan export recipes/re2c/all re2c/1.3@
FAIL: conan export recipes/subunit/all subunit/1.4.0@
FAIL: conan export recipes/swig/all swig/4.0.2@
FAIL: conan export recipes/swig/all swig/4.0.1@
FAIL: conan export recipes/tbb/all tbb/2019_u9@
FAIL: conan export recipes/tbb/all tbb/2020.0@
FAIL: conan export recipes/tbb/all tbb/2020.1@
FAIL: conan export recipes/tbb/all tbb/2020.2@
FAIL: conan export recipes/tbb/all tbb/2020.3@
FAIL: conan export recipes/tcl/8.6.10 tcl/8.6.10@
FAIL: conan export recipes/tk/all tk/8.6.10@
FAIL: conan export recipes/verilator/all verilator/4.034@
FAIL: conan export recipes/wolfssl/all wolfssl/4.8.1@
FAIL: conan export recipes/wolfssl/all wolfssl/4.7.1@
FAIL: conan export recipes/wolfssl/all wolfssl/4.6.0@
FAIL: conan export recipes/wolfssl/all wolfssl/4.5.0@
FAIL: conan export recipes/wolfssl/all wolfssl/4.4.0@
FAIL: conan export recipes/xapian-core/all xapian-core/1.4.16@
FAIL: conan export recipes/xapian-core/all xapian-core/1.4.18@
FAIL: conan export recipes/zimg/all zimg/2.9.3@
FAIL: conan export recipes/zlib/1.2.8 zlib/1.2.8@
FAIL: conan export recipes/zimg/all zimg/3.0.2@
FAIL: conan export recipes/zimg/all zimg/3.0.1@

We'd probably need to work on some of them before merging this new check.

@jgsogo
Copy link
Contributor

jgsogo commented Aug 23, 2021

Yes, please, let's try to fix some of them before activating the hook. Opening those PRs will also help us to give some visibility to this issue.

@madebr
Copy link
Contributor Author

madebr commented Aug 23, 2021

If anyone is interested to help in porting recipes, the following code automatically replaces usage of tools.os_info.is_windows with self._settings_build.os == "Windows".
The recipe should still be manually updated to add _settings_build though.
It's useful as a first pass.

Execute it as find recipes -iname conanfile.py -exec python script.py {} \;

import ast
import collections
import pathlib
import sys
import typing


Location = collections.namedtuple("Location", ("line", "column", "line_end", "column_end"))
BuildInfo = collections.namedtuple("BuildInfo", ("loc", "what", "func", "ast"))
class BuildInfoVisitor(ast.NodeVisitor):
    INVALID_METHODS = (
        "config_options",
        "configure",
        "build_requirements",
        "requirements",
        "validate",
    )

    def __init__(self):
        self.invalids:  typing.List[BuildInfo] = []
        self.function_def_stack = []
        ast.NodeVisitor.__init__(self)

    def visit_FunctionDef(self, node):
        self.function_def_stack.append(node.name)
        self.generic_visit(node)
        self.function_def_stack.pop()

    def visit_Attribute(self, node):
        methods_stack_no_build_info_allowed = [fdef for fdef in self.function_def_stack if fdef in self.INVALID_METHODS]
        if methods_stack_no_build_info_allowed:
            if isinstance(node.value, ast.Attribute) and isinstance(node.value.value, ast.Name) and node.value.attr == "os_info" \
                    and node.value.value.id == "tools":
                self.invalids.append(BuildInfo(Location(node.lineno, node.col_offset, node.end_lineno, node.end_col_offset), "tools.os_info", methods_stack_no_build_info_allowed[0], node))
            elif isinstance(node.value, ast.Name) and node.value.id == "platform":
                self.invalids.append(BuildInfo(Location(node.lineno, node.col_offset, node.end_lineno, node.end_col_offset), "platform", methods_stack_no_build_info_allowed[0], node))
        self.generic_visit(node)

def check_source(path: pathlib.Path):
    node = ast.parse(path.read_text())
    visitor = BuildInfoVisitor()
    visitor.visit(node)
    return visitor.invalids


def fix_source(path: pathlib.Path, invalids: typing.List[BuildInfo]):
    text_lines = path.read_text().splitlines()
    for invalid in invalids:
        if invalid.loc.line != invalid.loc.line_end:
            raise Exception("Cannot handle multi-line replacement")
        if invalid.what == "tools.os_info":
            if invalid.ast.attr == "is_windows":
                repl = "self._settings_build.os == \"Windows\""
            else:
                raise Exception("{}: unknown \"{}\"".format(path, invalid.ast.attr))

            line = text_lines[invalid.loc.line-1]
            new_line = line[:invalid.loc.column] + repl + line[invalid.loc.column_end:]
            text_lines[invalid.loc.line-1] = new_line
        else:
            print("{}: Unhandled {}".format(path, invalid.what))
    new_text = "\n".join(text_lines)
    if new_text[-1] != "\n":
        new_text += "\n"
    return new_text

def main():
    path = pathlib.Path(sys.argv[1])
    invalids = check_source(path)
    fix = fix_source(path, invalids)
    path.write_text(fix)


if __name__ == "__main__":
    main()

@prince-chrismc
Copy link
Contributor

Could this be added to the bincrafters convention tool? #320 (comment)

@madebr
Copy link
Contributor Author

madebr commented Aug 25, 2021

Yes, but it must be improved because it does not create a _settings_build method.

@@ -1,3 +1,5 @@
import ast
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this like javascript/Typescript AST??? 😱

Copy link
Contributor Author

@madebr madebr Sep 10, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's very basic. See ast.
It allows walking and transforming an ast.
The only downside is that it doesn't preserve comments.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was looking at redbaron yesterday.
It looks very nice to do full source transformation.
That library does preserve full layout.

@jgsogo
Copy link
Contributor

jgsogo commented Sep 10, 2021

Much better now, thanks for the amazing work fixing those hooks:

FAIL: conan export recipes/apr/all apr/1.7.0@
FAIL: conan export recipes/cairo/all cairo/1.16.0@
FAIL: conan export recipes/cairo/all cairo/1.17.2@
FAIL: conan export recipes/cairo/all cairo/1.17.4@
FAIL: conan export recipes/cccl/all cccl/1.1@
FAIL: conan export recipes/coin-cbc/all coin-cbc/2.10.5@
FAIL: conan export recipes/coin-cgl/all coin-cgl/0.60.3@
FAIL: conan export recipes/elfutils/all elfutils/0.180@
FAIL: conan export recipes/folly/all folly/2019.10.21.00@
FAIL: conan export recipes/folly/all folly/2020.08.10.00@
FAIL: conan export recipes/fontconfig/all fontconfig/2.13.93@
FAIL: conan export recipes/fontconfig/all fontconfig/2.13.92@
FAIL: conan export recipes/fontconfig/all fontconfig/2.13.91@
FAIL: conan export recipes/genie/all genie/1141@
FAIL: conan export recipes/genie/all genie/1157@
FAIL: conan export recipes/gettext/all gettext/0.20.1@
FAIL: conan export recipes/gmp/all gmp/6.2.0@
FAIL: conan export recipes/gmp/all gmp/6.2.1@
FAIL: conan export recipes/gmp/all gmp/6.1.2@
FAIL: conan export recipes/gnulib/all gnulib/20200224@
FAIL: conan export recipes/gsoap/all gsoap/2.8.103@
FAIL: conan export recipes/gsoap/all gsoap/2.8.104@
FAIL: conan export recipes/gsoap/all gsoap/2.8.105@
FAIL: conan export recipes/gsoap/all gsoap/2.8.106@
FAIL: conan export recipes/isl/all isl/0.23@
FAIL: conan export recipes/isl/all isl/0.22@
FAIL: conan export recipes/libdb/all libdb/5.3.28@
FAIL: conan export recipes/libgettext/all libgettext/0.20.1@
FAIL: conan export recipes/libidn2/all libidn2/2.3.0@
FAIL: conan export recipes/libnl/all libnl/3.2.25@
FAIL: conan export recipes/libpq/all libpq/13.3@
FAIL: conan export recipes/libpq/all libpq/13.2@
FAIL: conan export recipes/libpq/all libpq/13.1@
FAIL: conan export recipes/libpq/all libpq/13.0@
FAIL: conan export recipes/libpq/all libpq/12.6@
FAIL: conan export recipes/libpq/all libpq/12.4@
FAIL: conan export recipes/libpq/all libpq/12.3@
FAIL: conan export recipes/libpq/all libpq/12.2@
FAIL: conan export recipes/libpq/all libpq/11.11@
FAIL: conan export recipes/libpq/all libpq/11.9@
FAIL: conan export recipes/libpq/all libpq/11.7@
FAIL: conan export recipes/libpq/all libpq/11.5@
FAIL: conan export recipes/libpq/all libpq/10.14@
FAIL: conan export recipes/libpq/all libpq/9.6.19@
FAIL: conan export recipes/libsafec/all libsafec/3.6.0@
FAIL: conan export recipes/liburing/all liburing/0.7@
FAIL: conan export recipes/liburing/all liburing/2.0@
FAIL: conan export recipes/libvpx/all libvpx/1.9.0@
FAIL: conan export recipes/libvpx/all libvpx/1.10.0@
FAIL: conan export recipes/liquid-dsp/all liquid-dsp/1.3.2@
FAIL: conan export recipes/lzip/all lzip/1.21@
FAIL: conan export recipes/mpir/all mpir/3.0.0@
FAIL: conan export recipes/ncurses/all ncurses/6.2@
FAIL: conan export recipes/nspr/all nspr/4.24@
FAIL: conan export recipes/nspr/all nspr/4.27@
FAIL: conan export recipes/nspr/all nspr/4.29@
FAIL: conan export recipes/openssl/1.x.x openssl/1.0.2s@
FAIL: conan export recipes/openssl/1.x.x openssl/1.0.2t@
FAIL: conan export recipes/openssl/1.x.x openssl/1.0.2u@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.0k@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.0l@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1c@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1d@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1e@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1f@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1g@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1h@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1i@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1j@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1k@
FAIL: conan export recipes/openssl/1.x.x openssl/1.1.1l@
FAIL: conan export recipes/qt/5.x.x qt/5.15.2@
FAIL: conan export recipes/swig/all swig/4.0.2@
FAIL: conan export recipes/swig/all swig/4.0.1@
FAIL: conan export recipes/tbb/all tbb/2019_u9@
FAIL: conan export recipes/tbb/all tbb/2020.0@
FAIL: conan export recipes/tbb/all tbb/2020.1@
FAIL: conan export recipes/tbb/all tbb/2020.2@
FAIL: conan export recipes/tbb/all tbb/2020.3@
FAIL: conan export recipes/tk/all tk/8.6.10@
FAIL: conan export recipes/verilator/all verilator/4.034@

@danimtb
Copy link
Member

danimtb commented Sep 10, 2021

time to get this merged. Thank you!

@danimtb danimtb merged commit b545cbd into conan-io:master Sep 10, 2021
@madebr madebr deleted the no-tools-os_info branch September 10, 2021 14:33
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

Successfully merging this pull request may close these issues.

7 participants