Skip to content

Commit b5ae650

Browse files
feat: conan 2.x recipe (#1308)
1 parent 83a86f6 commit b5ae650

File tree

3 files changed

+161
-45
lines changed

3 files changed

+161
-45
lines changed

CMakeLists.txt

+6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ option(RUN_LDCONFIG "Run ldconfig after installation" ON)
2424
option(DPP_INSTALL "Generate the install target" ON)
2525
option(DPP_BUILD_TEST "Build the test program" ON)
2626
option(DPP_NO_VCPKG "No VCPKG" OFF)
27+
option(DPP_NO_CONAN "No Conan" OFF)
28+
option(CONAN_EXPORTED "Exported via Conan - DO NOT SET MANUALLY" OFF)
2729
option(DPP_CORO "Support for C++20 coroutines" OFF)
2830
option(DPP_FORMATTERS "Support for C++20 formatters" OFF)
2931
option(DPP_USE_EXTERNAL_JSON "Use an external installation of nlohmann::json" OFF)
@@ -64,6 +66,10 @@ else()
6466
endif()
6567
endif()
6668

69+
if (DPP_NO_CONAN)
70+
message("-- INFO: Explicitly disabling Conan as running inside the CI action.")
71+
endif()
72+
6773
if (WIN32 AND NOT MINGW AND BUILD_SHARED_LIBS)
6874
message("-- INFO: Configuring .rc resource script")
6975
configure_file("${DPP_ROOT_PATH}/src/dpp/dpp.rc.in" "${DPP_ROOT_PATH}/src/dpp/dpp.rc" NEWLINE_STYLE WIN32)

conanfile.py

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import os
2+
from conan import ConanFile
3+
from conan.tools.build import check_min_cppstd
4+
from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDeps
5+
from conan.tools.scm import Git
6+
from conan.tools.files import download, unzip
7+
8+
required_conan_version = ">=2.0"
9+
10+
class DPPConan(ConanFile):
11+
name = "dpp"
12+
version = "10.0.34"
13+
license = "Apache-2.0"
14+
url = "https://github.com/brainboxdotcc/DPP"
15+
description = "D++ is a lightweight and efficient library for Discord"
16+
topics = ("discord")
17+
settings = "os", "compiler", "build_type", "arch"
18+
options = {"shared": [True, False], "fPIC": [True, False]}
19+
default_options = {"shared": True, "fPIC": True}
20+
21+
@property
22+
def _min_cppstd(self):
23+
return 17
24+
25+
def validate(self):
26+
if self.settings.compiler.get_safe("cppstd"):
27+
check_min_cppstd(self, self._min_cppstd)
28+
29+
def requirements(self):
30+
self.requires("nlohmann_json/3.11.2")
31+
self.requires("openssl/3.1.2")
32+
self.requires("zlib/1.3")
33+
self.requires("opus/1.4")
34+
35+
def config_options(self):
36+
if self.settings.os == "Windows":
37+
self.options.rm_safe("fPIC")
38+
39+
def configure(self):
40+
if self.options.shared:
41+
self.options.rm_safe("fPIC")
42+
43+
def layout(self):
44+
cmake_layout(self)
45+
46+
def export(self):
47+
git = Git(self, self.recipe_folder)
48+
git.coordinates_to_conandata()
49+
50+
def source(self):
51+
# This environment variable should only be set by D++ library developers to ensure that conan builds succeed
52+
# without having to wait for release. It will check out the development branch where conanfile.py is being
53+
# developed and tested. If you are NOT sure what this does, DO NOT SET IT. You won't get the D++ release
54+
# you expect!
55+
if 'DPP_CONAN_TESTING' in os.environ:
56+
git = Git(self)
57+
git.clone(url="https://github.com/brainboxdotcc/DPP.git", target=".")
58+
git.checkout(commit="conan-the-librarian")
59+
zip_name = "DPP.zip"
60+
else:
61+
download(self, f"https://github.com/brainboxdotcc/DPP/archive/refs/tags/v{self.version}.zip", zip_name)
62+
unzip(self, zip_name, '.', False, None, True)
63+
os.unlink(zip_name)
64+
65+
def generate(self):
66+
deps = CMakeDeps(self)
67+
deps.generate()
68+
tc = CMakeToolchain(self)
69+
tc.cache_variables["CONAN_EXPORTED"] = True
70+
tc.cache_variables["BUILD_VOICE_SUPPORT"] = True
71+
tc.cache_variables["DPP_BUILD_TEST"] = False
72+
tc.cache_variables["BUILD_SHARED_LIBS"] = True
73+
tc.generate()
74+
75+
def build(self):
76+
cmake = CMake(self)
77+
cmake.configure()
78+
cmake.build()
79+
80+
def package(self):
81+
cmake = CMake(self)
82+
cmake.install()
83+
84+
def package_info(self):
85+
self.cpp_info.libs = ["dpp"]
86+
self.cpp_info.includedirs = ["include/dpp-10.0"]
87+
self.cpp_info.libdirs = ["lib/dpp-10.0"]

library/CMakeLists.txt

+68-45
Original file line numberDiff line numberDiff line change
@@ -67,31 +67,40 @@ else()
6767
message("-- Building ${Green}dynamic${ColourReset} library.")
6868
endif()
6969

70-
70+
if (CONAN_EXPORTED)
71+
message("-- INFO: ${Green}Conan detected${ColourReset}... finding packages...")
72+
find_package(OpenSSL REQUIRED COMPONENTS SSL Crypto)
73+
find_package(ZLIB REQUIRED)
74+
find_package(Opus)
75+
find_package(Threads REQUIRED)
76+
find_package(Git QUIET)
77+
endif()
7178

7279
if(WIN32 AND NOT MINGW)
7380
# Fake an ssl version number to satisfy MLSPP
7481
set(OPENSSL_VERSION "1.1.1f")
7582
if (NOT WINDOWS_32_BIT)
7683
message("-- Building for windows with precompiled packaged dependencies")
7784
#set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
78-
set(ZLIB_LIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib")
79-
set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include")
80-
set(OPENSSL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include")
81-
set(OPENSSL_LIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib")
82-
#ADD_DEFINITIONS(/bigobj)
83-
84-
link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libssl.lib")
85-
link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libcrypto.lib")
86-
link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/zlib.lib")
87-
link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/opus.lib")
88-
89-
set(OPUS_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include")
90-
set(OPUS_LIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/opus.lib")
91-
set(HAVE_OPUS_OPUS_H "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include/opus/opus.h")
92-
set(OPUS_FOUND 1)
85+
if (NOT CONAN_EXPORTED)
86+
set(ZLIB_LIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib")
87+
set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include")
88+
set(OPENSSL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include")
89+
set(OPENSSL_LIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib")
90+
91+
link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libssl.lib")
92+
link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libcrypto.lib")
93+
link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/zlib.lib")
94+
link_libraries("${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/opus.lib")
95+
96+
set(OPUS_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include")
97+
set(OPUS_LIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/opus.lib")
98+
set(HAVE_OPUS_OPUS_H "${CMAKE_CURRENT_SOURCE_DIR}/../win32/include/opus/opus.h")
99+
100+
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../win32/include")
101+
endif()
93102

94-
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../win32/include")
103+
set(OPUS_FOUND 1)
95104

96105
add_compile_options("/bigobj")
97106
add_compile_definitions(OPENSSL_SYS_WIN32)
@@ -154,31 +163,39 @@ string(ASCII 27 Esc)
154163

155164
set(THREADS_PREFER_PTHREAD_FLAG ON)
156165

157-
find_package(Threads REQUIRED)
166+
if (NOT CONAN_EXPORTED)
167+
find_package(Threads REQUIRED)
168+
endif()
158169
if(MINGW OR NOT WIN32)
159-
find_package(ZLIB REQUIRED)
170+
if (NOT CONAN_EXPORTED)
171+
find_package(ZLIB REQUIRED)
172+
endif()
160173
message("-- ZLIB: ${Green}${ZLIB_LIBRARIES}${ColourReset}")
161174
endif(MINGW OR NOT WIN32)
162175

163-
if(APPLE)
164-
if(CMAKE_APPLE_SILICON_PROCESSOR EQUAL arm64)
165-
set(OPENSSL_ROOT_DIR "/opt/homebrew/opt/openssl")
166-
else()
167-
set(OPENSSL_ROOT_DIR "/usr/local/opt/openssl")
168-
endif()
169-
find_package(OpenSSL REQUIRED)
170-
else()
171-
if(MINGW OR NOT WIN32)
172-
if(NOT BUILD_SHARED_LIBS)
173-
set(OPENSSL_USE_STATIC_LIBS TRUE)
176+
if (NOT CONAN_EXPORTED)
177+
if(APPLE)
178+
if(CMAKE_APPLE_SILICON_PROCESSOR EQUAL arm64)
179+
set(OPENSSL_ROOT_DIR "/opt/homebrew/opt/openssl")
180+
else()
181+
set(OPENSSL_ROOT_DIR "/usr/local/opt/openssl")
174182
endif()
175183
find_package(OpenSSL REQUIRED)
184+
else()
185+
if(MINGW OR NOT WIN32)
186+
if(NOT BUILD_SHARED_LIBS)
187+
set(OPENSSL_USE_STATIC_LIBS TRUE)
188+
endif()
189+
find_package(OpenSSL REQUIRED)
190+
endif()
176191
endif()
177192
endif()
178193

179194
include_directories(${OPENSSL_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS})
180195

181-
find_package(Git QUIET)
196+
if (NOT CONAN_EXPORTED)
197+
find_package(Git QUIET)
198+
endif()
182199

183200
if(NOT GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../.git")
184201
message(FATAL_ERROR "You are using a git version of D++ but do not have git installed. Install git (not 'gh') and try again.")
@@ -263,7 +280,7 @@ foreach (fullmodname ${subdirlist})
263280
)
264281
endif()
265282

266-
if (WIN32 AND NOT MINGW)
283+
if (WIN32 AND NOT MINGW AND NOT CONAN_EXPORTED)
267284

268285
if (NOT WINDOWS_32_BIT)
269286
target_link_libraries(${modname} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../win32/lib/libssl.lib"
@@ -278,7 +295,11 @@ foreach (fullmodname ${subdirlist})
278295
endif()
279296

280297
else()
281-
target_link_libraries(${modname} PUBLIC ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} ${ZLIB_LIBRARIES})
298+
if (CONAN_EXPORTED)
299+
target_link_libraries(${modname} PUBLIC openssl::openssl ZLIB::ZLIB Opus::opus)
300+
else()
301+
target_link_libraries(${modname} PUBLIC ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} ${ZLIB_LIBRARIES})
302+
endif()
282303
if (MINGW)
283304
target_link_libraries(${modname} PUBLIC wsock32 ws2_32 crypt32)
284305
endif ()
@@ -435,18 +456,20 @@ if (DPP_BUILD_TEST)
435456
COMMAND unittest
436457
)
437458
endif()
438-
439-
if(WIN32 AND NOT MINGW)
440-
if (NOT WINDOWS_32_BIT)
441-
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/zlib1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
442-
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/libcrypto-1_1-x64.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
443-
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/libssl-1_1-x64.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
444-
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/opus.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
445-
else()
446-
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/zlib1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
447-
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/libcrypto-1_1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
448-
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/libssl-1_1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
449-
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/opus.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
459+
460+
if (NOT CONAN_EXPORTED)
461+
if(WIN32 AND NOT MINGW)
462+
if (NOT WINDOWS_32_BIT)
463+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/zlib1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
464+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/libcrypto-1_1-x64.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
465+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/libssl-1_1-x64.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
466+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/bin/opus.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
467+
else()
468+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/zlib1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
469+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/libcrypto-1_1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
470+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/libssl-1_1.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
471+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../win32/32/bin/opus.dll" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" COPYONLY)
472+
endif()
450473
endif()
451474
endif()
452475

0 commit comments

Comments
 (0)