Skip to content

Commit

Permalink
(#4808) dcmtk: provide official CMake imported targets + bump deps + …
Browse files Browse the repository at this point in the history
…properly deprecate openjpeg/libsndfile options

* bump dependencies

* deprecate with_openjpeg and with_libsndfile

* add a FIXME to bump openssl

* provide official CMake targets

dcmtk imported targets are not namespaced

* avoid components tests in loop
  • Loading branch information
SpaceIm committed Mar 10, 2021
1 parent 6968d35 commit 5e60890
Showing 1 changed file with 123 additions and 152 deletions.
275 changes: 123 additions & 152 deletions recipes/dcmtk/all/conanfile.py
@@ -1,5 +1,8 @@
from conans import ConanFile, CMake, tools
import os
import textwrap

required_conan_version = ">=1.33.0"


class DCMTKConan(ConanFile):
Expand All @@ -18,10 +21,10 @@ class DCMTKConan(ConanFile):
"charset_conversion": [None, "libiconv", "icu"],
"with_libxml2": [True, False],
"with_zlib": [True, False],
"with_openjpeg": [True, False],
"with_openjpeg": [True, False, "deprecated"],
"with_openssl": [True, False],
"with_libpng": [True, False],
"with_libsndfile": [True, False],
"with_libsndfile": [True, False, "deprecated"],
"with_libtiff": [True, False],
"with_tcpwrappers": [True, False],
}
Expand All @@ -33,10 +36,10 @@ class DCMTKConan(ConanFile):
"charset_conversion": "libiconv",
"with_libxml2": True,
"with_zlib": True,
"with_openjpeg": False,
"with_openjpeg": "deprecated",
"with_openssl": True,
"with_libpng": True,
"with_libsndfile": False,
"with_libsndfile": "deprecated",
"with_libtiff": True,
"with_tcpwrappers": False,
}
Expand All @@ -63,8 +66,10 @@ def configure(self):
if self.settings.os == "Windows":
del self.options.with_tcpwrappers
# Looking into source code, it appears that OpenJPEG and libsndfile are not used
del self.options.with_openjpeg
del self.options.with_libsndfile
if self.options.with_openjpeg != "deprecated":
self.output.warn("with_openjpeg option is deprecated, do not use anymore")
if self.options.with_libsndfile != "deprecated":
self.output.warn("with_libsndfile option is deprecated, do not use anymore")

def source(self):
tools.get(**self.conan_data["sources"][self.version])
Expand All @@ -75,24 +80,26 @@ def requirements(self):
if self.options.charset_conversion == "libiconv":
self.requires("libiconv/1.16")
elif self.options.charset_conversion == "icu":
self.requires("icu/67.1")
self.requires("icu/68.2")
if self.options.with_libxml2:
self.requires("libxml2/2.9.10")
if self.options.with_zlib:
self.requires("zlib/1.2.11")
if self.options.get_safe("with_openjpeg"):
self.requires("openjpeg/2.3.1")
if self.options.with_openssl:
# FIXME: Bump openssl. dcmtk build files have a logic to detect
# various openssl API but for some reason it fails with 1.1 API
self.requires("openssl/1.0.2u")
if self.options.with_libpng:
self.requires("libpng/1.6.37")
if self.options.get_safe("with_libsndfile"):
self.requires("libsndfile/1.0.28")
if self.options.with_libtiff:
self.requires("libtiff/4.1.0")
self.requires("libtiff/4.2.0")
if self.options.get_safe("with_tcpwrappers"):
self.requires("tcp-wrappers/7.6")

def package_id(self):
del self.info.options.with_openjpeg
del self.info.options.with_libsndfile

def _configure_cmake(self):
if self._cmake:
return self._cmake
Expand All @@ -106,18 +113,14 @@ def _configure_cmake(self):
if self.options.charset_conversion == "libiconv":
self._cmake.definitions["WITH_LIBICONVINC"] = self.deps_cpp_info["libiconv"].rootpath
self._cmake.definitions["DCMTK_WITH_ICU"] = self.options.charset_conversion == "icu"
self._cmake.definitions["DCMTK_WITH_OPENJPEG"] = self.options.get_safe("with_openjpeg", False)
if self.options.get_safe("with_openjpeg"):
self._cmake.definitions["WITH_OPENJPEGINC"] = self.deps_cpp_info["openjpeg"].rootpath
self._cmake.definitions["DCMTK_WITH_OPENJPEG"] = False
self._cmake.definitions["DCMTK_WITH_OPENSSL"] = self.options.with_openssl
if self.options.with_openssl:
self._cmake.definitions["WITH_OPENSSLINC"] = self.deps_cpp_info["openssl"].rootpath
self._cmake.definitions["DCMTK_WITH_PNG"] = self.options.with_libpng
if self.options.with_libpng:
self._cmake.definitions["WITH_LIBPNGINC"] = self.deps_cpp_info["libpng"].rootpath
self._cmake.definitions["DCMTK_WITH_SNDFILE"] = self.options.get_safe("with_libsndfile", False)
if self.options.get_safe("with_libsndfile"):
self._cmake.definitions["WITH_SNDFILEINC"] = self.deps_cpp_info["libsndfile"].rootpath
self._cmake.definitions["DCMTK_WITH_SNDFILE"] = False
self._cmake.definitions["DCMTK_WITH_THREADS"] = self.options.with_multithreading
self._cmake.definitions["DCMTK_WITH_TIFF"] = self.options.with_libtiff
if self.options.with_libtiff:
Expand Down Expand Up @@ -167,147 +170,115 @@ def package(self):
tools.rmdir(os.path.join(self.package_folder, "etc"))
tools.rmdir(os.path.join(self.package_folder, "share"))

self._create_cmake_module_alias_targets(
os.path.join(self.package_folder, self._module_file_rel_path),
{target: "DCMTK::{}".format(target) for target in self._dcmtk_components.keys()}
)

@staticmethod
def _create_cmake_module_alias_targets(module_file, targets):
content = ""
for alias, aliased in targets.items():
content += textwrap.dedent("""\
if(TARGET {aliased} AND NOT TARGET {alias})
add_library({alias} INTERFACE IMPORTED)
set_property(TARGET {alias} PROPERTY INTERFACE_LINK_LIBRARIES {aliased})
endif()
""".format(alias=alias, aliased=aliased))
tools.save(module_file, content)

@property
def _module_subfolder(self):
return os.path.join("lib", "cmake")

@property
def _module_file_rel_path(self):
return os.path.join(self._module_subfolder,
"conan-official-{}-targets.cmake".format(self.name))

@property
def _dcmtk_components(self):
def charset_conversion():
if bool(self.options.charset_conversion):
return ["libiconv::libiconv"] if self.options.charset_conversion == "libiconv" else ["icu::icu"]
return []

def zlib():
return ["zlib::zlib"] if self.options.with_zlib else []

def png():
return ["libpng::libpng"] if self.options.with_libpng else []

def tiff():
return ["libtiff::libtiff"] if self.options.with_libtiff else []

def openssl():
return ["openssl::openssl"] if self.options.with_openssl else []

def tcpwrappers():
return ["tcp-wrappers::tcp-wrappers"] if self.options.get_safe("with_tcpwrappers") else []

def xml2():
return ["libxml2::libxml2"] if self.options.with_libxml2 else []

return {
"ofstd" : charset_conversion(),
"oflog" : ["ofstd"],
"dcmdata" : ["ofstd", "oflog"] + zlib(),
"i2d" : ["dcmdata"],
"dcmimgle": ["ofstd", "oflog", "dcmdata"],
"dcmimage": ["oflog", "dcmdata", "dcmimgle"] + png() + tiff(),
"dcmjpeg" : ["ofstd", "oflog", "dcmdata", "dcmimgle", "dcmimage", "ijg8", "ijg12", "ijg16"],
"ijg8" : [],
"ijg12" : [],
"ijg16" : [],
"dcmjpls" : ["ofstd", "oflog", "dcmdata", "dcmimgle", "dcmimage", "charls"],
"charls" : ["ofstd", "oflog"],
"dcmtls" : ["ofstd", "dcmdata", "dcmnet"] + openssl(),
"dcmnet" : ["ofstd", "oflog", "dcmdata"] + tcpwrappers(),
"dcmsr" : ["ofstd", "oflog", "dcmdata", "dcmimgle", "dcmimage"] + xml2(),
"cmr" : ["dcmsr"],
"dcmdsig" : ["ofstd", "dcmdata"] + openssl(),
"dcmwlm" : ["ofstd", "dcmdata", "dcmnet"],
"dcmqrdb" : ["ofstd", "dcmdata", "dcmnet"],
"dcmpstat": ["ofstd", "oflog", "dcmdata", "dcmimgle", "dcmimage", "dcmnet", "dcmdsig", "dcmtls", "dcmsr", "dcmqrdb"] + openssl(),
"dcmrt" : ["ofstd", "oflog", "dcmdata", "dcmimgle"],
"dcmiod" : ["dcmdata", "ofstd", "oflog"],
"dcmfg" : ["dcmiod", "dcmdata", "ofstd", "oflog"],
"dcmseg" : ["dcmfg", "dcmiod", "dcmdata", "ofstd", "oflog"],
"dcmtract": ["dcmiod", "dcmdata", "ofstd", "oflog"],
"dcmpmap" : ["dcmfg", "dcmiod", "dcmdata", "ofstd", "oflog"],
}

@property
def _dcm_datadictionary_path(self):
return os.path.join(self.package_folder, "bin", "share")

def package_info(self):
self.cpp_info.names["cmake_find_package"] = "DCMTK"
self.cpp_info.names["cmake_find_package_multi"] = "DCMTK"
# TODO: imported targets shouldn't be namespaced
includedir = os.path.join("include", "dcmtk")
# ofstd
self.cpp_info.components["ofstd"].includedirs.append(includedir)
self.cpp_info.components["ofstd"].libs = ["ofstd"]
if self.settings.os == "Windows":
self.cpp_info.components["ofstd"].system_libs.extend(["iphlpapi", "ws2_32", "netapi32", "wsock32"])
elif self.settings.os == "Linux":
self.cpp_info.components["ofstd"].system_libs.append("m")
if self.options.with_multithreading:
self.cpp_info.components["ofstd"].system_libs.append("pthread")
if self.options.charset_conversion == "libiconv":
self.cpp_info.components["ofstd"].requires = ["libiconv::libiconv"]
elif self.options.charset_conversion == "icu":
self.cpp_info.components["ofstd"].requires = ["icu::icu"]
# oflog
self.cpp_info.components["oflog"].includedirs.append(includedir)
self.cpp_info.components["oflog"].libs = ["oflog"]
self.cpp_info.components["oflog"].requires = ["ofstd"]
# dcmdata
self.cpp_info.components["dcmdata"].includedirs.append(includedir)
self.cpp_info.components["dcmdata"].libs = ["dcmdata"]
self.cpp_info.components["dcmdata"].requires = ["ofstd", "oflog"]
if self.options.with_zlib:
self.cpp_info.components["dcmdata"].requires.append("zlib::zlib")
# i2d
self.cpp_info.components["i2d"].includedirs.append(includedir)
self.cpp_info.components["i2d"].libs = ["i2d"]
self.cpp_info.components["i2d"].requires = ["dcmdata"]
# dcmimgle
self.cpp_info.components["dcmimgle"].includedirs.append(includedir)
self.cpp_info.components["dcmimgle"].libs = ["dcmimgle"]
self.cpp_info.components["dcmimgle"].requires = ["ofstd", "oflog", "dcmdata"]
# dcmimage
self.cpp_info.components["dcmimage"].includedirs.append(includedir)
self.cpp_info.components["dcmimage"].libs = ["dcmimage"]
self.cpp_info.components["dcmimage"].requires = ["oflog", "dcmdata", "dcmimgle"]
if self.options.with_libpng:
self.cpp_info.components["dcmimage"].requires.append("libpng::libpng")
if self.options.with_libtiff:
self.cpp_info.components["dcmimage"].requires.append("libtiff::libtiff")
# dcmjpeg
self.cpp_info.components["dcmjpeg"].includedirs.append(includedir)
self.cpp_info.components["dcmjpeg"].libs = ["dcmjpeg"]
self.cpp_info.components["dcmjpeg"].requires = [
"ofstd", "oflog", "dcmdata", "dcmimgle",
"dcmimage", "ijg8", "ijg12", "ijg16"
]
# ijg8
self.cpp_info.components["ijg8"].includedirs.append(includedir)
self.cpp_info.components["ijg8"].libs = ["ijg8"]
# ijg12
self.cpp_info.components["ijg12"].includedirs.append(includedir)
self.cpp_info.components["ijg12"].libs = ["ijg12"]
# ijg16
self.cpp_info.components["ijg16"].includedirs.append(includedir)
self.cpp_info.components["ijg16"].libs = ["ijg16"]
# dcmjpls
self.cpp_info.components["dcmjpls"].includedirs.append(includedir)
self.cpp_info.components["dcmjpls"].libs = ["dcmjpls"]
self.cpp_info.components["dcmjpls"].requires = ["ofstd", "oflog", "dcmdata", "dcmimgle", "dcmimage", "charls"]
# charls
self.cpp_info.components["charls"].includedirs.append(includedir)
self.cpp_info.components["charls"].libs = ["charls"]
self.cpp_info.components["charls"].requires = ["ofstd", "oflog"]
# dcmtls
self.cpp_info.components["dcmtls"].includedirs.append(includedir)
self.cpp_info.components["dcmtls"].libs = ["dcmtls"]
self.cpp_info.components["dcmtls"].requires = ["ofstd", "dcmdata", "dcmnet"]
if self.options.with_openssl:
self.cpp_info.components["dcmtls"].requires.append("openssl::openssl")
# dcmnet
self.cpp_info.components["dcmnet"].includedirs.append(includedir)
self.cpp_info.components["dcmnet"].libs = ["dcmnet"]
self.cpp_info.components["dcmnet"].requires = ["ofstd", "oflog", "dcmdata"]
if self.options.get_safe("with_tcpwrappers"):
self.cpp_info.components["dcmnet"].requires.append("tcp-wrappers::tcp-wrappers")
# dcmsr
self.cpp_info.components["dcmsr"].includedirs.append(includedir)
self.cpp_info.components["dcmsr"].libs = ["dcmsr"]
self.cpp_info.components["dcmsr"].requires = ["ofstd", "oflog", "dcmdata", "dcmimgle", "dcmimage"]
if self.options.with_libxml2:
self.cpp_info.components["dcmsr"].requires.append("libxml2::libxml2")
# cmr
self.cpp_info.components["cmr"].includedirs.append(includedir)
self.cpp_info.components["cmr"].libs = ["cmr"]
self.cpp_info.components["cmr"].requires = ["dcmsr"]
# dcmdsig
self.cpp_info.components["dcmdsig"].includedirs.append(includedir)
self.cpp_info.components["dcmdsig"].libs = ["dcmdsig"]
self.cpp_info.components["dcmdsig"].requires = ["ofstd", "dcmdata"]
if self.options.with_openssl:
self.cpp_info.components["dcmdsig"].requires.append("openssl::openssl")
# dcmwlm
self.cpp_info.components["dcmwlm"].includedirs.append(includedir)
self.cpp_info.components["dcmwlm"].libs = ["dcmwlm"]
self.cpp_info.components["dcmwlm"].requires = ["ofstd", "dcmdata", "dcmnet"]
# dcmqrdb
self.cpp_info.components["dcmqrdb"].includedirs.append(includedir)
self.cpp_info.components["dcmqrdb"].libs = ["dcmqrdb"]
self.cpp_info.components["dcmqrdb"].requires = ["ofstd", "dcmdata", "dcmnet"]
# dcmpstat
self.cpp_info.components["dcmpstat"].includedirs.append(includedir)
self.cpp_info.components["dcmpstat"].libs = ["dcmpstat"]
self.cpp_info.components["dcmpstat"].requires = [
"ofstd", "oflog", "dcmdata", "dcmimgle", "dcmimage",
"dcmnet", "dcmdsig", "dcmtls", "dcmsr", "dcmqrdb"
]
if self.options.with_openssl:
self.cpp_info.components["dcmpstat"].requires.append("openssl::openssl")
# dcmrt
self.cpp_info.components["dcmrt"].includedirs.append(includedir)
self.cpp_info.components["dcmrt"].libs = ["dcmrt"]
self.cpp_info.components["dcmrt"].requires = ["ofstd", "oflog", "dcmdata", "dcmimgle"]
# dcmiod
self.cpp_info.components["dcmiod"].includedirs.append(includedir)
self.cpp_info.components["dcmiod"].libs = ["dcmiod"]
self.cpp_info.components["dcmiod"].requires = ["dcmdata", "ofstd", "oflog"]
# dcmfg
self.cpp_info.components["dcmfg"].includedirs.append(includedir)
self.cpp_info.components["dcmfg"].libs = ["dcmfg"]
self.cpp_info.components["dcmfg"].requires = ["dcmiod", "dcmdata", "ofstd", "oflog"]
# dcmseg
self.cpp_info.components["dcmseg"].includedirs.append(includedir)
self.cpp_info.components["dcmseg"].libs = ["dcmseg"]
self.cpp_info.components["dcmseg"].requires = ["dcmfg", "dcmiod", "dcmdata", "ofstd", "oflog"]
# dcmtract
self.cpp_info.components["dcmtract"].includedirs.append(includedir)
self.cpp_info.components["dcmtract"].libs = ["dcmtract"]
self.cpp_info.components["dcmtract"].requires = ["dcmiod", "dcmdata", "ofstd", "oflog"]
# dcmpmap
self.cpp_info.components["dcmpmap"].includedirs.append(includedir)
self.cpp_info.components["dcmpmap"].libs = ["dcmpmap"]
self.cpp_info.components["dcmpmap"].requires = ["dcmfg", "dcmiod", "dcmdata", "ofstd", "oflog"]

def register_components(components):
for target_lib, requires in components.items():
self.cpp_info.components[target_lib].names["cmake_find_package"] = target_lib
self.cpp_info.components[target_lib].names["cmake_find_package_multi"] = target_lib
self.cpp_info.components[target_lib].builddirs.append(self._module_subfolder)
self.cpp_info.components[target_lib].build_modules["cmake_find_package"] = [self._module_file_rel_path]
self.cpp_info.components[target_lib].build_modules["cmake_find_package_multi"] = [self._module_file_rel_path]
self.cpp_info.components[target_lib].libs = [target_lib]
self.cpp_info.components[target_lib].includedirs.append(os.path.join("include", "dcmtk"))
self.cpp_info.components[target_lib].requires = requires

if self.settings.os == "Windows":
self.cpp_info.components["ofstd"].system_libs.extend([
"iphlpapi", "ws2_32", "netapi32", "wsock32"
])
elif self.settings.os == "Linux":
self.cpp_info.components["ofstd"].system_libs.append("m")
if self.options.with_multithreading:
self.cpp_info.components["ofstd"].system_libs.append("pthread")

register_components(self._dcmtk_components)

dcmdictpath = os.path.join(self._dcm_datadictionary_path, "dcmtk", "dicom.dic")
self.output.info("Settings DCMDICTPATH environment variable: {}".format(dcmdictpath))
Expand Down

0 comments on commit 5e60890

Please sign in to comment.