from conan import ConanFile from conan.tools.files import get, copy import os class LibacoConanfile(ConanFile): name = "libaco" description = ( "A blazing fast and lightweight C asymmetric coroutine library 💎 ⛅🚀⛅🌞" ) license = "Apache-2.0 license" homepage = "https://github.com/hnes/libaco" settings = "os", "compiler", "build_type", "arch" topics = ("coroutine", "async", "c") options = { "shared": [True, False], "fPIC": [True, False], "m32": [True, False], } default_options = { "shared": False, "fPIC": True, "m32": False, } def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) def requirements(self): pass def build_requirements(self): pass def generate(self): pass def build(self): cc = os.environ.get("CC") or {"gcc": "gcc", "clang": "clang"}.get( str(self.settings.compiler), "cc" ) ar = os.environ.get("AR") or {"gcc": "ar", "clang": "ar"}.get( str(self.settings.compiler), "ar" ) cflags = [ "-c", "-O2", "-Wall", ] asflags = ["-Wa,--noexecstack"] if self.options.get_safe("fPIC"): cflags.append("-fPIC") if self.options.m32: cflags.append("-m32") if self.settings.build_type == "Debug": cflags.append("-g") self.run(f"{cc} {' '.join(cflags)} -o aco.o aco.c") self.run(f"{cc} {' '.join(cflags)} {' '.join(asflags)} -o acosw.o acosw.S") if self.options.shared: self.run(f"{cc} -shared -o libaco.so aco.o acosw.o") else: self.run(f"{ar} rcs libaco.a aco.o acosw.o") def package(self): copy( self, "aco.h", src=self.source_folder, dst=os.path.join(self.package_folder, "include"), ) # 顺便把 license 拷过去 copy( self, "LICENSE*", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"), ) # 把编译好的文件拷过去 if self.options.shared: copy( self, "*.so", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), ) else: copy( self, "*.a", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), ) def package_info(self): self.cpp_info.libs = ["aco"] # 提供 CMake 变量,保持 find_package 兼容 self.cpp_info.set_property("cmake_file_name", "libaco") self.cpp_info.set_property("cmake_target_name", "libaco::libaco")