-
Notifications
You must be signed in to change notification settings - Fork 1.8k
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
Add soxr library #7728
Add soxr library #7728
Changes from all commits
d6762b3
0aaf9b5
1181965
35e59ad
65b9599
2d46b91
49f7167
5865a82
db2a475
43a9c26
375aca0
ba312c9
d59c954
fc13703
8b969f0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
cmake_minimum_required(VERSION 2.8.11) | ||
project(cmake_wrapper) | ||
|
||
include(conanbuildinfo.cmake) | ||
conan_basic_setup() | ||
|
||
add_subdirectory("source_subfolder") |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
sources: | ||
"0.1.3": | ||
url: https://sourceforge.net/projects/soxr/files/soxr-0.1.3-Source.tar.xz | ||
sha1: "32ea46b1a8c0c15f835422892d02fce8286aec3c" | ||
patches: | ||
"0.1.3": | ||
- base_path: source_subfolder | ||
patch_file: "patches/findpackage-openmp.patch" | ||
- base_path: source_subfolder | ||
patch_file: "patches/cmake-source-dir.patch" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
from conans import ConanFile, CMake, tools | ||
import os | ||
import re | ||
|
||
required_conan_version = ">=1.33.0" | ||
|
||
|
||
class SoxrConan(ConanFile): | ||
name = "soxr" | ||
description = "The SoX Resampler library libsoxr performs fast, high-quality one-dimensional sample rate conversion." | ||
homepage = "https://sourceforge.net/projects/soxr/" | ||
topics = ("resampling", "audio", "sample-rate", "conversion") | ||
license = "LGPL-2.1-or-later" | ||
url = "https://github.com/conan-io/conan-center-index" | ||
settings = "os", "compiler", "build_type", "arch" | ||
options = { | ||
"shared": [True, False], | ||
"fPIC": [True, False], | ||
"with_openmp": [True, False], | ||
"with_lsr_bindings": [True, False] | ||
} | ||
default_options = { | ||
"shared": False, | ||
"fPIC": True, | ||
"with_openmp": False, | ||
"with_lsr_bindings": True | ||
} | ||
generators = "cmake" | ||
exports_sources = ["CMakeLists.txt", "patches/**"] | ||
|
||
_cmake = None | ||
|
||
@property | ||
def _source_subfolder(self): | ||
return "source_subfolder" | ||
|
||
@property | ||
def _build_subfolder(self): | ||
return "build_subfolder" | ||
|
||
def config_options(self): | ||
if self.settings.os == "Windows": | ||
del self.options.fPIC | ||
|
||
def configure(self): | ||
if self.options.shared: | ||
del self.options.fPIC | ||
del self.settings.compiler.cppstd | ||
del self.settings.compiler.libcxx | ||
|
||
def source(self): | ||
tools.get(**self.conan_data["sources"][self.version], | ||
destination=self._source_subfolder, strip_root=True) | ||
|
||
def _configure_cmake(self): | ||
if self._cmake: | ||
return self._cmake | ||
self._cmake = CMake(self) | ||
if self.settings.compiler == "Visual Studio": | ||
self._cmake.definitions["BUILD_SHARED_RUNTIME"] = "MD" in self.settings.compiler.runtime | ||
elif self.settings.compiler == "msvc": | ||
self._cmake.definitions["BUILD_SHARED_RUNTIME"] = self.settings.compiler.runtime == "dynamic" | ||
self._cmake.definitions["BUILD_TESTS"] = False | ||
self._cmake.definitions["WITH_OPENMP"] = self.options.with_openmp | ||
self._cmake.definitions["WITH_LSR_BINDINGS"] = self.options.with_lsr_bindings | ||
self._cmake.configure(build_folder=self._build_subfolder) | ||
return self._cmake | ||
|
||
def build(self): | ||
for patch in self.conan_data.get("patches", {}).get(self.version, []): | ||
tools.patch(**patch) | ||
cmake = self._configure_cmake() | ||
cmake.build() | ||
|
||
def _extract_pffft_license(self): | ||
# extract license header from pffft.c and store it in the package folder | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It can be very simplified: https://docs.conan.io/en/latest/howtos/extract_licenses_from_headers.html There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the pointer. I have rewritten it using |
||
pffft_c = tools.load(os.path.join(self._source_subfolder, "src", "pffft.c")) | ||
license_header = re.search(r"/\* (Copyright.*?)\*/", pffft_c, re.DOTALL).group(1) | ||
license_header = "\n".join(line.lstrip() for line in license_header.splitlines()) | ||
tools.save(os.path.join(self.package_folder, "licenses", "pffft"), license_header) | ||
|
||
def package(self): | ||
self.copy("LICENCE", dst="licenses", src=self._source_subfolder) | ||
self._extract_pffft_license() | ||
cmake = self._configure_cmake() | ||
cmake.install() | ||
tools.rmdir(os.path.join(self.package_folder, "doc")) | ||
tools.rmdir(os.path.join(self.package_folder, "lib", "pkgconfig")) | ||
tools.rmdir(os.path.join(self.package_folder, "share")) | ||
|
||
def package_info(self): | ||
# core component | ||
self.cpp_info.components["core"].names["pkg_config"] = "soxr" | ||
self.cpp_info.components["core"].libs = ["soxr"] | ||
if self.settings.os in ("FreeBSD", "Linux"): | ||
self.cpp_info.components["core"].system_libs = ["m"] | ||
if self.settings.os == "Windows" and self.options.shared: | ||
self.cpp_info.components["core"].defines.append("SOXR_DLL") | ||
if not self.options.shared and self.options.with_openmp: | ||
chausner marked this conversation as resolved.
Show resolved
Hide resolved
|
||
if self.settings.compiler in ("Visual Studio", "msvc"): | ||
openmp_flags = ["-openmp"] | ||
elif self.settings.compiler in ("gcc", "clang"): | ||
openmp_flags = ["-fopenmp"] | ||
elif self.settings.compiler == "apple-clang": | ||
openmp_flags = ["-Xpreprocessor", "-fopenmp"] | ||
else: | ||
openmp_flags = [] | ||
self.cpp_info.components["core"].exelinkflags = openmp_flags | ||
self.cpp_info.components["core"].sharedlinkflags = openmp_flags | ||
# lsr component | ||
if self.options.with_lsr_bindings: | ||
self.cpp_info.components["lsr"].names["pkg_config"] = "soxr-lsr" | ||
self.cpp_info.components["lsr"].libs = ["soxr-lsr"] | ||
if self.settings.os == "Windows" and self.options.shared: | ||
self.cpp_info.components["lsr"].defines.append("SOXR_DLL") | ||
self.cpp_info.components["lsr"].requires = ["core"] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
Patch required for proper resolving of CMake modules when using the CMake conan helper wrapper. | ||
--- CMakeLists.txt | ||
+++ CMakeLists.txt | ||
@@ -84,7 +84,7 @@ mark_as_advanced (WITH_HI_PREC_CLOCK WITH_FLOAT_STD_PREC_CLOCK | ||
|
||
# Introspection: | ||
|
||
-list (APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) | ||
+list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) | ||
|
||
include (CheckFunctionExists) | ||
include (CheckIncludeFiles) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
Adds the REQUIRED flag to find_package for OpenMP so that | ||
we can be sure in the conanfile that if with_openmp is set | ||
that OpenMP is indeed used. This is important since we need to add | ||
compiler flags in package_info() in this case. | ||
--- CMakeLists.txt | ||
+++ CMakeLists.txt | ||
@@ -105,7 +105,7 @@ if (${BUILD_EXAMPLES}) | ||
endif () | ||
|
||
if (WITH_OPENMP) | ||
- find_package (OpenMP) | ||
+ find_package (OpenMP REQUIRED) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is it required? It is an option in the recipe, what happens if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. See the comment at the top of recipes/soxr/all/patches/findpackage-openmp.patch. I am setting the "REQUIRED" flag because I want CMake to fail early if users set "with_openmp=True" and CMake cannot find the package. Otherwise, the build would succeed and later builds would fail when attempting to link to libsoxr because the compiler flags are still getting set for OpenMP in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would be even better to check it on Conan side, the message to the user could be better and the check performed even before trying to build anything. Also, Conan can run the check even if the binary is already available, when a consumer tries to use this recipe (and the compiler flag is propagated), not just when it is being built. Is this some library we can build from sources (we have There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Yes, I agree it would be better to check on the Conan side. But I don't think there is a reliable way to check for the presence of a CMake package from within Conan (without invoking CMake itself), is there? What do you suggest in this case?
Hmm, normally OpenMP is not built from sources. On Linux and macOS, it's commonly installed as a system package. On Windows, it comes with Visual Studio. I am not familiar with There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The build system should follow instructions from the package-manager. If the package manager is configured with If OpenMP is expected to be in the system, then the best way to go is to create a system package, Conan will check if the package is available in the system (using some underlying tool like pkg_config) and generate the proper It would work like any other requirement. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Okay, yes I agree and might have misunderstood you here.
I see. Unfortunately, I will not be able to contribute that one. I am surprised it does not exist yet, as there should be more existing packages in Conan Center that depend on OpenMP in some way. For now, I suggest to either go with the current solution in this PR, or if you prefer, I can also completely remove the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see there are other packages in ConanCenter with a My initial concern about this issue was if creating (and maintaining) a patch to add the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This change looks fine to me. |
||
if (OPENMP_FOUND) | ||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") | ||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
cmake_minimum_required(VERSION 3.1) | ||
project(test_package C) | ||
|
||
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) | ||
conan_basic_setup(TARGETS) | ||
|
||
find_package(soxr CONFIG REQUIRED) | ||
|
||
add_executable(test_package_core test_package_core.c) | ||
target_link_libraries(test_package_core soxr::core) | ||
|
||
if(TARGET soxr::lsr) | ||
add_executable(test_package_lsr test_package_lsr.c) | ||
target_link_libraries(test_package_lsr soxr::lsr) | ||
endif() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import os | ||
from conans import ConanFile, CMake, tools | ||
|
||
class TestPackageConan(ConanFile): | ||
settings = "os", "compiler", "build_type", "arch" | ||
generators = "cmake", "cmake_find_package_multi" | ||
|
||
def build(self): | ||
cmake = CMake(self) | ||
cmake.configure() | ||
cmake.build() | ||
|
||
def test(self): | ||
if not tools.cross_building(self): | ||
# core component | ||
bin_path = os.path.join("bin", "test_package_core") | ||
self.run(bin_path, run_environment=True) | ||
# lsr component | ||
if self.options["soxr"].with_lsr_bindings: | ||
bin_path = os.path.join("bin", "test_package_lsr") | ||
self.run(bin_path, run_environment=True) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
#include <soxr.h> | ||
#include <stdio.h> | ||
|
||
int main() { | ||
printf("soxr version: %s\n", soxr_version()); | ||
return 0; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
#include <soxr-lsr.h> | ||
#include <stdio.h> | ||
|
||
int main() { | ||
printf("soxr-lsr version: %s\n", src_get_version()); | ||
return 0; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
versions: | ||
"0.1.3": | ||
folder: all |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This option will create a
soxr-lsr
library (see bottom of this cmake script)It will also create a
soxr-lsr.pc
file.So you will probably need to use modules in
package_info
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I split it up into two components "core" and "lsr". Please have a look: fc13703
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks for your contribution!