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

new recipe for melon/1.0.0-alpha.1 #25189

Merged
merged 4 commits into from
Sep 16, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions recipes/melon/all/conandata.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
sources:
"1.0.0-alpha.1":
Copy link
Member

Choose a reason for hiding this comment

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

Do we have an idea on when proper 1.0.0 would be released?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Actually, algorithms are well tested but I feel like the library lacks some features like serialization/visualization to be complete. I have been asked to submit a recipe and I think that making the library available on Conan-center could stimulate potential feedback and maybe contributions for designing these features.
Given that this is an important project for me, I'll continue working on it for sure :)

Copy link
Member

Choose a reason for hiding this comment

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

Great to hear! Thanks for the extra insight

url: "https://github.com/fhamonic/melon/archive/refs/tags/v1.0.0-alpha.1.tar.gz"
sha256: "370f6bb1fddc68f1ab771c8b659fed6d9dc8da51290897ed72fd87589143220c"
117 changes: 117 additions & 0 deletions recipes/melon/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.build import check_min_cppstd
from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get
from conan.tools.layout import basic_layout
from conan.tools.scm import Version
import os


required_conan_version = ">=1.52.0"

class PackageConan(ConanFile):
name = "melon"
description = "A modern and efficient graph library using C++20 ranges and concepts."
# Use short name only, conform to SPDX License List: https://spdx.org/licenses/
# In case it's not listed there, use "LicenseRef-<license-file-name>"
license = "BSL-1.0"
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://github.com/fhamonic/melon"
# Do not put "conan" nor the project name in topics. Use topics from the upstream listed on GH
# Keep 'header-only' as topic
topics = ("graph", "algorithm", "ranges", "c++20", "header-only")
package_type = "header-library"
# Keep these or explain why it's not required for this particular case
settings = "os", "arch", "compiler", "build_type"
# Do not copy sources to build folder for header only projects, unless you need to apply patches
no_copy_source = True

@property
def _min_cppstd(self):
return 20

# In case the project requires C++14/17/20/... the minimum compiler version should be listed
@property
def _compilers_minimum_version(self):
return {
"apple-clang": "14",
"clang": "17",
"gcc": "12",
"msvc": "192",
"Visual Studio": "17",
}

# Use the export_sources(self) method instead of the exports_sources attribute.
# This allows finer grain exportation of patches per version
def export_sources(self):
export_conandata_patches(self)

def layout(self):
# src_folder must use the same source folder name than the project
basic_layout(self, src_folder="src")

def requirements(self):
# Prefer self.requires method instead of requires attribute
# Direct dependencies of header only libs are always transitive since they are included in public headers
self.requires("range-v3/[>=0.11.0]", transitive_headers=True)
self.requires("fmt/[>=10.0.0]", transitive_headers=True)
fhamonic marked this conversation as resolved.
Show resolved Hide resolved

# same package ID for any package
def package_id(self):
self.info.clear()

def validate(self):
if self.settings.compiler.get_safe("cppstd"):
# Validate the minimum cpp standard supported when installing the package. For C++ projects only
check_min_cppstd(self, self._min_cppstd)
minimum_version = self._compilers_minimum_version.get(str(self.settings.compiler), False)
if minimum_version and Version(self.settings.compiler.version) < minimum_version:
raise ConanInvalidConfiguration(
f"{self.ref} requires C++{self._min_cppstd}, which your compiler does not support."
)

# In case this library does not work in some another configuration, it should be validated here too
if self.settings.os == "Windows":
fhamonic marked this conversation as resolved.
Show resolved Hide resolved
raise ConanInvalidConfiguration(f"{self.ref} can not be used on Windows.")

def source(self):
# Download source package and extract to source folder
get(self, **self.conan_data["sources"][self.version], strip_root=True)

# Not mandatory when there is no patch, but will suppress warning message about missing build() method
def build(self):
# The attribute no_copy_source should not be used when applying patches in build
apply_conandata_patches(self)

# Copy all files to the package folder
def package(self):
copy(self, "LICENSE", self.source_folder, os.path.join(self.package_folder, "licenses"))
copy(
self,
"*.hpp",
os.path.join(self.source_folder, "include"),
os.path.join(self.package_folder, "include"),
)

def package_info(self):
# Folders not used for header-only
self.cpp_info.bindirs = []
self.cpp_info.libdirs = []

# Set these to the appropriate values if the package has an official FindPACKAGE.cmake
# listed in https://cmake.org/cmake/help/latest/manual/cmake-modules.7.html#find-modules
# examples: bzip2, freetype, gdal, icu, libcurl, libjpeg, libpng, libtiff, openssl, sqlite3, zlib...
# self.cpp_info.set_property("cmake_module_file_name", "melon")
# self.cpp_info.set_property("cmake_module_target_name", "melon::melon")

# Set these to the appropriate values if package provides a CMake config file
# (package-config.cmake or packageConfig.cmake, with package::package target, usually installed in <prefix>/lib/cmake/<package>/)
# self.cpp_info.set_property("cmake_file_name", "melon")
# self.cpp_info.set_property("cmake_target_name", "melon::melon")
# Set this to the appropriate value if the package provides a pkgconfig file
# (package.pc, usually installed in <prefix>/lib/pkgconfig/)
# self.cpp_info.set_property("pkg_config_name", "melon")
Copy link
Member

Choose a reason for hiding this comment

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

Feel free to remove these lines, alongside the rest of the comments from the template :)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done!


# Add m, pthread and dl if needed in Linux/FreeBSD
if self.settings.os in ["Linux", "FreeBSD"]:
self.cpp_info.system_libs.extend(["pthread"])
11 changes: 11 additions & 0 deletions recipes/melon/all/test_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
cmake_minimum_required(VERSION 3.15)
# project(test_package LANGUAGES C) # if the project is pure C
project(test_package LANGUAGES CXX) # if the project uses c++

find_package(melon REQUIRED CONFIG)

add_executable(${PROJECT_NAME} test_package.cpp)
# don't link to ${CONAN_LIBS} or CONAN_PKG::package
target_link_libraries(${PROJECT_NAME} PRIVATE melon::melon)
# In case the target project need a specific C++ standard
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20)
27 changes: 27 additions & 0 deletions recipes/melon/all/test_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.cmake import cmake_layout, CMake
import os


# It will become the standard on Conan 2.x
class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "CMakeDeps", "CMakeToolchain", "VirtualRunEnv"
test_type = "explicit"

def layout(self):
cmake_layout(self)

def requirements(self):
self.requires(self.tested_reference_str)

def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()

def test(self):
if can_run(self):
bin_path = os.path.join(self.cpp.build.bindir, "test_package")
self.run(bin_path, env="conanrun")
34 changes: 34 additions & 0 deletions recipes/melon/all/test_package/test_package.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include "melon/algorithm/bidirectional_dijkstra.hpp"
#include "melon/utility/static_digraph_builder.hpp"
#include "melon/container/static_digraph.hpp"

using namespace fhamonic::melon;

int main(int argc, char * argv[]) {
static_digraph_builder<static_digraph, int> builder(6);

builder.add_arc(0u, 1u, 7);
builder.add_arc(0u, 2u, 9);
builder.add_arc(0u, 5u, 14);
builder.add_arc(1u, 0u, 7);
builder.add_arc(1u, 2u, 10);
builder.add_arc(1u, 3u, 15);
builder.add_arc(2u, 0u, 9);
builder.add_arc(2u, 1u, 10);
builder.add_arc(2u, 3u, 12);
builder.add_arc(2u, 5u, 2);
builder.add_arc(3u, 1u, 15);
builder.add_arc(3u, 2u, 12);
builder.add_arc(3u, 4u, 6);
builder.add_arc(4u, 3u, 6);
builder.add_arc(4u, 5u, 9);
builder.add_arc(5u, 0u, 14);
builder.add_arc(5u, 2u, 2);
builder.add_arc(5u, 4u, 9);

auto [graph, length_map] = builder.build();

bidirectional_dijkstra alg(graph, length_map, 0u, 3u);

return alg.run() == 21 ? EXIT_SUCCESS : EXIT_FAILURE;
}
3 changes: 3 additions & 0 deletions recipes/melon/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
versions:
"1.0.0-alpha.1":
folder: all
Loading