Skip to content

Commit

Permalink
Merge pull request #214 from DLR-SC/213_add_support_for_the_conan_pac…
Browse files Browse the repository at this point in the history
…kage_manager

Support for the conan package manager
  • Loading branch information
joergbrech authored Sep 5, 2022
2 parents 64d23e5 + daaecf4 commit 470570d
Show file tree
Hide file tree
Showing 9 changed files with 198 additions and 11 deletions.
6 changes: 5 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ jobs:
- name: Install dependencies
run: |
sudo apt-get update -qq
sudo apt-get install -y cmake cmake-data gfortran libcurl4-openssl-dev libxslt1-dev
sudo apt-get install -y cmake cmake-data gfortran libcurl4-openssl-dev libxslt1-dev python3-setuptools
sudo python3 -m pip install conan
- name: Build TiXI
run: |
mkdir build
Expand All @@ -39,6 +40,9 @@ jobs:
name: build-${{ matrix.os }}-${{ matrix.config }}
path: build
retention-days: 1
- name: Build conan package
run: |
conan create . -o tixi3:shared=True -s build_type=${{ matrix.config }}
build-win64:
strategy:
Expand Down
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
cmake_minimum_required (VERSION 3.1)

if (EXISTS ${CMAKE_BINARY_DIR}/conan_toolchain.cmake)
cmake_policy(SET CMP0091 NEW)
include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)
endif()

# Set a default build type if none was specified
if(NOT DEFINED CMAKE_BUILD_TYPE)
message(STATUS "Setting build type to 'Release' as none was specified.")
Expand Down
6 changes: 4 additions & 2 deletions bindings/matlab/make_tixi_matlab.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@
#ann = CP.Annotation('#annotate out: 3, 4A(3)')

# copy handwritten *.m files into current directory
for mfile in glob.glob(filepath + r'/*.m'):
shutil.copy(mfile, '.')
# only if source directory != binary directory
if os.path.abspath(filepath) != os.path.abspath("."):
for mfile in glob.glob(filepath + r'/*.m'):
shutil.copy(mfile, '.')

parser = CP.CHeaderFileParser()

Expand Down
8 changes: 5 additions & 3 deletions cmake/FindCURL.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
# CURL_LIBRARIES - List of libraries when using curl.
# CURL_FOUND - True if curl found.
# CURL_VERSION_STRING - the version of curl found (since CMake 2.8.8)
#
# Creates the CMake target CURL::libcurl for the curl library

#=============================================================================
# Copyright 2006-2009 Kitware, Inc.
Expand Down Expand Up @@ -57,16 +59,16 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(CURL
VERSION_VAR CURL_VERSION_STRING)

if(CURL_FOUND)
add_library(curllib UNKNOWN IMPORTED)
set_target_properties(curllib PROPERTIES
add_library(CURL::libcurl UNKNOWN IMPORTED)
set_target_properties(CURL::libcurl PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIR}
IMPORTED_LOCATION ${CURL_LIBRARY}
IMPORTED_IMPLIB ${CURL_LIBRARY}
)
if (WIN32)
string(REGEX MATCH "_a.lib$" CURL_STATICLIB ${CURL_LIBRARY})
if (CURL_STATICLIB)
set_target_properties(curllib
set_target_properties(CURL::libcurl
PROPERTIES INTERFACE_COMPILE_DEFINITIONS "CURL_STATICLIB"
)
endif(CURL_STATICLIB)
Expand Down
8 changes: 4 additions & 4 deletions cmake/tixi-config.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,17 @@ if(NOT "$<TARGET_PROPERTY:tixi3,TYPE>" STREQUAL "SHARED_LIBRARY")
set_property(TARGET LibXslt::LibXslt APPEND PROPERTY IMPORTED_LOCATION "${LIBXSLT_LIBRARIES}")
endif()

if(CURL_FOUND AND NOT TARGET curllib)
add_library(curllib UNKNOWN IMPORTED)
set_target_properties(curllib PROPERTIES
if(CURL_FOUND AND NOT TARGET CURL::libcurl)
add_library(CURL::libcurl UNKNOWN IMPORTED)
set_target_properties(CURL::libcurl PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIR}
IMPORTED_LOCATION ${CURL_LIBRARY}
IMPORTED_IMPLIB ${CURL_LIBRARY}
)
if (WIN32)
string(REGEX MATCH "_a.lib$" CURL_STATICLIB ${CURL_LIBRARY})
if (CURL_STATICLIB)
set_target_properties(curllib
set_target_properties(CURL::libcurl
PROPERTIES INTERFACE_COMPILE_DEFINITIONS "CURL_STATICLIB"
)
endif(CURL_STATICLIB)
Expand Down
144 changes: 144 additions & 0 deletions conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout
from conan.tools import files
from conan import ConanFile
import os, re
import textwrap

required_conan_version = ">=1.45.0"

def get_version_from_cmakelists():
if not os.path.exists("CMakeLists.txt"):
return None

major_ver = "0"
minor_ver = "0"
patch_ver = "0"

with open("CMakeLists.txt","r") as file_one:
major_re = re.compile('set\(TIXI_VERSION_MAJOR ([0-9]+)\)')
minor_re = re.compile('set\(TIXI_VERSION_MINOR ([0-9]+)\)')
patch_re = re.compile('set\(TIXI_VERSION_PATCH ([0-9]+(-[a-z, A_Z, 0-9]+)?)\)')
for line in file_one:
m = major_re.match(line)
if m:
major_ver = m.group(1)
m = minor_re.match(line)
if m:
minor_ver = m.group(1)
m = patch_re.match(line)
if m:
patch_ver = m.group(1)

return "%s.%s.%s" % (major_ver, minor_ver, patch_ver)

class Tixi3Conan(ConanFile):
name = "tixi3"
url = "https://github.com/conan-io/conan-center-index"
description = "A simple xml interface based on libxml2 and libxslt"
topics = ("tixi3", "xml")
homepage = "https://github.com/DLR-SC/tixi"
license = "Apache-2.0"
version = get_version_from_cmakelists()

settings = "os", "arch", "compiler", "build_type"
options = {
"shared": [True, False],
"fPIC": [True, False],
}
default_options = {
"shared": False,
"fPIC": True,
}

def generate(self):
tc = CMakeToolchain(self)
tc.generate()
deps = CMakeDeps(self)
deps.generate()

def requirements(self):
self.requires("libxml2/2.9.14")
self.requires("libxslt/1.1.34")
self.requires("libcurl/7.84.0")

def layout(self):
cmake_layout(self)

def config_options(self):
if self.settings.os == "Windows":
del self.options.fPIC

def configure(self):
if self.options.shared:
try:
del self.options.fPIC
except Exception:
pass

# tixi is a c library
try:
del self.settings.compiler.libcxx
except Exception:
pass
try:
del self.settings.compiler.cppstd
except Exception:
pass

def export_sources(self):
self.output.info("Executing export_sources() method")
self.copy("*", dst=self.export_sources_folder)

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

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

def package(self):
cmake = CMake(self)
cmake.install()

files.rmdir(self, os.path.join(self.package_folder, "lib", "tixi3"))
files.copy(self, "LICENSE", dst=os.path.join(self.package_folder, "licenses"), src=self.source_folder)
files.rmdir(self, os.path.join(self.package_folder, "share"))

# provide alias target tixi3 for v1 packages
self._create_cmake_module_alias_targets(
os.path.join(self.package_folder, self._module_file_rel_path),
{"tixi3": "tixi3::tixi3"}
)

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


def package_info(self):
self.cpp_info.includedirs.append(os.path.join("include", "tixi3"))

if self.settings.build_type != "Debug":
self.cpp_info.libs = ['tixi3']
else:
self.cpp_info.libs = ['tixi3-d']

if self.settings.os == "Windows":
self.cpp_info.system_libs = ['Shlwapi']

self.cpp_info.set_property("cmake_file_name", "tixi3")
self.cpp_info.set_property("cmake_target_name", "tixi3")

# provide alias target tixi3 for v1 packages
self.cpp_info.builddirs.append(os.path.join("lib", "cmake"))
self.cpp_info.build_modules["cmake_find_package"] = [self._module_file_rel_path]
self.cpp_info.build_modules["cmake_find_package_multi"] = [self._module_file_rel_path]
2 changes: 1 addition & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ if(CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fmessage-length=0")
endif()

set(TIXI_LIBS curllib LibXslt::LibXslt LibXml2::LibXml2)
set(TIXI_LIBS CURL::libcurl LibXslt::LibXslt LibXml2::LibXml2)
if(WIN32)
set(TIXI_LIBS ${TIXI_LIBS} Shlwapi)
endif(WIN32)
Expand Down
7 changes: 7 additions & 0 deletions test_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 3.12)
project(Tixi-Conan-TestPackage C)

find_package(tixi3 REQUIRED)

add_executable(tixi3_conan_test ../examples/Demo/tixiDemo.c)
target_link_libraries(tixi3_conan_test PRIVATE tixi3)
23 changes: 23 additions & 0 deletions test_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@

from conan import ConanFile
from conan.tools.cmake import CMake, cmake_layout
from conan.tools.build import can_run
import os


class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "CMakeDeps", "CMakeToolchain", "virtualenv"

def layout(self):
cmake_layout(self)

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.bindirs[0], "tixi3_conan_test")
self.run(bin_path, run_environment=True)

0 comments on commit 470570d

Please sign in to comment.