Skip to content

Commit 8a7ab4e

Browse files
committed
conan: conan package
1 parent 092abf9 commit 8a7ab4e

4 files changed

Lines changed: 132 additions & 0 deletions

File tree

build/conan/conanfile.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import os
2+
from conan import ConanFile
3+
from conan.tools.scm import Git
4+
from conan.tools.files import load, update_conandata, copy
5+
from conan.tools.layout import basic_layout
6+
7+
class RuisappConan(ConanFile):
8+
name = "ruisapp"
9+
license = "MIT"
10+
author = "Ivan Gagis <igagis@gmail.com>"
11+
url = "http://github.com/cppfw/" + name
12+
description = "cross-platform GUI C++ library OS layer"
13+
topics = ("C++", "cross-platform")
14+
settings = "os", "compiler", "build_type", "arch"
15+
package_type = "library"
16+
options = {"shared": [True, False], "fPIC": [True, False]}
17+
default_options = {"shared": False, "fPIC": True}
18+
generators = "AutotoolsDeps" # this will set CXXFLAGS etc. env vars
19+
20+
def requirements(self):
21+
self.requires("utki/[>=1.1.202]@cppfw/main", transitive_headers=True, transitive_libs=True)
22+
self.requires("papki/[>=0.0.0]@cppfw/main", transitive_headers=True, transitive_libs=True)
23+
self.requires("ruis/[>=0.5.278]@cppfw/main", transitive_headers=True, transitive_libs=True)
24+
25+
def build_requirements(self):
26+
self.tool_requires("prorab/[>=2.0.27]@cppfw/main")
27+
self.tool_requires("prorab-extra/[>=0.2.57]@cppfw/main")
28+
29+
if self.settings.os != "Emscripten":
30+
self.requires("tst/[>=0.3.29]@cppfw/main", visible=False)
31+
32+
def config_options(self):
33+
if self.settings.os == "Windows":
34+
del self.options.fPIC
35+
36+
# save commit and remote URL to conandata.yml for packaging
37+
def export(self):
38+
git = Git(self)
39+
scm_url = git.get_remote_url()
40+
# NOTE: Git.get_commit() doesn't work properly,
41+
# it gets latest commit of the folder in which conanfile.py resides.
42+
# So, we use "git rev-parse HEAD" instead as it gets the actual HEAD
43+
# commit regardless of the current working directory within the repo.
44+
scm_commit = git.run("rev-parse HEAD") # get current commit
45+
update_conandata(self, {"sources": {"commit": scm_commit, "url": scm_url}})
46+
47+
def source(self):
48+
git = Git(self)
49+
sources = self.conan_data["sources"]
50+
# shallow fetch commit
51+
git.fetch_commit(url=sources["url"], commit=sources['commit'])
52+
# shallow clone submodules
53+
git.run("submodule update --init --remote --depth 1")
54+
55+
def build(self):
56+
if self.settings.os == "Emscripten":
57+
self.run("make $MAKE_INCLUDE_DIRS_ARG config=emsc --directory=src")
58+
else:
59+
self.run("make $MAKE_INCLUDE_DIRS_ARG lint=off --directory=src")
60+
# self.run("make $MAKE_INCLUDE_DIRS_ARG lint=off test")
61+
62+
def deploy(self):
63+
copy(conanfile=self, pattern="*", src=os.path.join(self.package_folder, "ruis_res"), dst=os.path.join(self.deploy_folder, "ruis_res"), keep_path=True)
64+
65+
def package(self):
66+
if self.settings.os == "Emscripten":
67+
src_rel_dir = os.path.join(self.build_folder, "src/out/emsc")
68+
else:
69+
src_rel_dir = os.path.join(self.build_folder, "src/out/rel")
70+
71+
src_dir = os.path.join(self.build_folder, "src")
72+
dst_include_dir = os.path.join(self.package_folder, "include")
73+
dst_lib_dir = os.path.join(self.package_folder, "lib")
74+
dst_bin_dir = os.path.join(self.package_folder, "bin")
75+
copy(conanfile=self, pattern="*.h", dst=dst_include_dir, src=src_dir, keep_path=True)
76+
copy(conanfile=self, pattern="*.hpp", dst=dst_include_dir, src=src_dir, keep_path=True)
77+
78+
if self.options.shared:
79+
copy(conanfile=self, pattern="*" + self.name + ".lib", dst=dst_lib_dir, src="", keep_path=False)
80+
copy(conanfile=self, pattern="*.dll", dst=dst_bin_dir, src=src_rel_dir, keep_path=False)
81+
copy(conanfile=self, pattern="*.so", dst=dst_lib_dir, src=src_rel_dir, keep_path=False)
82+
copy(conanfile=self, pattern="*.so.*", dst=dst_lib_dir, src=src_rel_dir, keep_path=False)
83+
copy(conanfile=self, pattern="*.dylib", dst=dst_lib_dir, src=src_rel_dir, keep_path=False)
84+
else:
85+
copy(conanfile=self, pattern="*" + self.name + ".lib", dst=dst_lib_dir, src="", keep_path=False)
86+
copy(conanfile=self, pattern="*.a", dst=dst_lib_dir, src=src_rel_dir, keep_path=False)
87+
88+
def package_info(self):
89+
self.cpp_info.libs = [self.name]
90+
91+
def package_id(self):
92+
# change package id only when minor or major version changes, i.e. when ABI breaks
93+
self.info.requires.minor_mode()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
project(PackageTest CXX)
3+
4+
# set(CMAKE_VERBOSE_MAKEFILE on)
5+
6+
find_package(ruisapp CONFIG REQUIRED)
7+
8+
add_executable(example example.cpp)
9+
target_link_libraries(example ruisapp::ruisapp)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import os
2+
3+
from conan import ConanFile, tools
4+
from conan.tools.cmake import CMake, cmake_layout
5+
6+
class TestConan(ConanFile):
7+
settings = "os", "compiler", "build_type", "arch"
8+
generators = "CMakeToolchain", "CMakeDeps"
9+
10+
def requirements(self):
11+
self.requires(self.tested_reference_str)
12+
13+
def build(self):
14+
cmake = CMake(self)
15+
cmake.configure()
16+
cmake.build()
17+
18+
def layout(self):
19+
cmake_layout(self)
20+
21+
def test(self):
22+
self.run(".%sexample" % os.sep, env="conanrun") # env sets LD_LIBRARY_PATH etc. to find dependency libs
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#include <ruisapp/application.hpp>
2+
3+
const ruisapp::application_factory app_fac([](auto executable, auto args){
4+
5+
std::cout << "Hello ruisapp!" << std::endl;
6+
7+
return nullptr;
8+
});

0 commit comments

Comments
 (0)