Add a simple generic conanfile.py which can be used for nc projects

This script will automatically load conanfile.txt from well known
locations (assuming it follows the standard  project structure).
This commit is contained in:
Danny Robson 2024-07-18 15:09:43 +10:00
parent 2a5b2c9208
commit 1c5c0dd6d7

90
conanfile.py Normal file
View File

@ -0,0 +1,90 @@
#!/usr/bin/env python3
"""
This is a master conanfile.py which can be symlinked into a root directory and automatically discover conanfile.txt
from child packages from nerdcruft. (ie, from the glob cruft/*/conanfile.txt).
It also looks for a file _conanfile.txt in the same directory as this script. This config is loaded at the end and so
its [options] section will override any other options present in the defaults, or child packages.,
"""
from conans.client.loader_txt import ConanFileTextLoader
from conans.model.options import Options
from conan import ConanFile
from conan.tools.files import copy
import os
import glob
def slurp(path: str) -> str:
with open(path, 'rt') as f:
return f.read()
# Load all the conanfile.txt of submodules
dirname = os.path.abspath(os.path.dirname(__file__))
print(dirname)
subpackages = [
ConanFileTextLoader(slurp(i))
for i in glob.glob(
os.path.join(
dirname, 'cruft', "*", 'conanfile.txt')
)
]
# Attempt to load a conanfile.txt in the root directory too.
try:
subpackages.append(
ConanFileTextLoader(
slurp(os.path.join(dirname, '_conanfile.txt'))
)
)
except FileNotFoundError:
pass
# Combine all the options and requirements
_opt = Options()
for i in subpackages:
_opt.update_options(Options.loads(i.options))
_opt = _opt.serialize()
_requirements = tuple(j for i in subpackages for j in i.requirements)
class RootConan(ConanFile):
name = 'cruft-root'
version = '0.1'
settings = "os", "compiler", "build_type", "arch"
requires = _requirements
tool_requires = (
'cmake/[>=3.23]'
)
generators = 'CMakeDeps', 'CMakeToolchain'
default_options = {'*:shared': True} | _opt
LIB_PATTERNS = (
"*.dylib",
"*.dll",
"*.dll.a",
"*.so",
"*.so.*",
)
# Conan2 doesn't have a "deploy" function.
#
# For the time being use this post-processing step to emulate it.
def generate(self):
for dep in self.dependencies.values():
deps_dir = f"{self.build_folder}/deps"
for src_dir in dep.cpp_info.libdirs + dep.cpp_info.bindirs:
for pattern in self.LIB_PATTERNS:
copy(self, pattern, src_dir, deps_dir)