Skip to content

Commit

Permalink
Add gobject and wrap it into C++ object
Browse files Browse the repository at this point in the history
  • Loading branch information
Eduard Čuba committed Nov 6, 2017
1 parent 28c9af8 commit 65a1254
Show file tree
Hide file tree
Showing 15 changed files with 430 additions and 25 deletions.
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ ADD_COMPILE_OPTIONS (-std=c++11 -Wall -Wextra -Wno-unused-parameter -fPIC)

PROJECT (libdnf)

# include GLib
find_package(PkgConfig)
SET (CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
PKG_CHECK_MODULES(GLIB gio-unix-2.0>=2.46.0 REQUIRED)
INCLUDE_DIRECTORIES(${GLIB_INCLUDE_DIRS})

if (${PYTHON_DESIRED} STREQUAL "2")
message("Building for python2")
Expand Down
122 changes: 122 additions & 0 deletions cmake/modules/FindGLIB.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# - Try to find Glib and its components (gio, gobject etc)
# Once done, this will define
#
# GLIB_FOUND - system has Glib
# GLIB_INCLUDE_DIRS - the Glib include directories
# GLIB_LIBRARIES - link these to use Glib
#
# Optionally, the COMPONENTS keyword can be passed to find_package()
# and Glib components can be looked for. Currently, the following
# components can be used, and they define the following variables if
# found:
#
# gio: GLIB_GIO_LIBRARIES
# gobject: GLIB_GOBJECT_LIBRARIES
# gmodule: GLIB_GMODULE_LIBRARIES
# gthread: GLIB_GTHREAD_LIBRARIES
#
# Note that the respective _INCLUDE_DIR variables are not set, since
# all headers are in the same directory as GLIB_INCLUDE_DIRS.
#
# Copyright (C) 2012 Raphael Kubo da Costa <[email protected]>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

find_package(PkgConfig)
pkg_check_modules(PC_GLIB QUIET glib-2.0)

find_library(GLIB_LIBRARIES
NAMES glib-2.0
HINTS ${PC_GLIB_LIBDIR}
${PC_GLIB_LIBRARY_DIRS}
)

# Files in glib's main include path may include glibconfig.h, which,
# for some odd reason, is normally in $LIBDIR/glib-2.0/include.
get_filename_component(_GLIB_LIBRARY_DIR ${GLIB_LIBRARIES} PATH)
find_path(GLIBCONFIG_INCLUDE_DIR
NAMES glibconfig.h
HINTS ${PC_LIBDIR} ${PC_LIBRARY_DIRS} ${_GLIB_LIBRARY_DIR}
${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS}
PATH_SUFFIXES glib-2.0/include
)

find_path(GLIB_INCLUDE_DIR
NAMES glib.h
HINTS ${PC_GLIB_INCLUDEDIR}
${PC_GLIB_INCLUDE_DIRS}
PATH_SUFFIXES glib-2.0
)

set(GLIB_INCLUDE_DIRS ${GLIB_INCLUDE_DIR} ${GLIBCONFIG_INCLUDE_DIR})

# Version detection
file(READ "${GLIBCONFIG_INCLUDE_DIR}/glibconfig.h" GLIBCONFIG_H_CONTENTS)
string(REGEX MATCH "#define GLIB_MAJOR_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}")
set(GLIB_VERSION_MAJOR "${CMAKE_MATCH_1}")
string(REGEX MATCH "#define GLIB_MINOR_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}")
set(GLIB_VERSION_MINOR "${CMAKE_MATCH_1}")
string(REGEX MATCH "#define GLIB_MICRO_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}")
set(GLIB_VERSION_MICRO "${CMAKE_MATCH_1}")
set(GLIB_VERSION "${GLIB_VERSION_MAJOR}.${GLIB_VERSION_MINOR}.${GLIB_VERSION_MICRO}")

# Additional Glib components. We only look for libraries, as not all of them
# have corresponding headers and all headers are installed alongside the main
# glib ones.
SET(GLIB_FIND_COMPONENTS gobject; gio; gio-unix;)
foreach (_component ${GLIB_FIND_COMPONENTS})
if (${_component} STREQUAL "gio")
find_library(GLIB_GIO_LIBRARIES NAMES gio-2.0 HINTS ${_GLIB_LIBRARY_DIR})
set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GIO_LIBRARIES)
elseif (${_component} STREQUAL "gobject")
find_library(GLIB_GOBJECT_LIBRARIES NAMES gobject-2.0 HINTS ${_GLIB_LIBRARY_DIR})
set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GOBJECT_LIBRARIES)
elseif (${_component} STREQUAL "gmodule")
find_library(GLIB_GMODULE_LIBRARIES NAMES gmodule-2.0 HINTS ${_GLIB_LIBRARY_DIR})
set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GMODULE_LIBRARIES)
elseif (${_component} STREQUAL "gthread")
find_library(GLIB_GTHREAD_LIBRARIES NAMES gthread-2.0 HINTS ${_GLIB_LIBRARY_DIR})
set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GTHREAD_LIBRARIES)
elseif (${_component} STREQUAL "gio-unix")
# gio-unix is compiled as part of the gio library, but the include paths
# are separate from the shared glib ones. Since this is currently only used
# by WebKitGTK+ we don't go to extraordinary measures beyond pkg-config.
pkg_check_modules(GIO_UNIX QUIET gio-unix-2.0)
include_directories(${GIO_UNIX_INCLUDE_DIRS})
endif ()
endforeach ()

include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLIB REQUIRED_VARS GLIB_INCLUDE_DIRS GLIB_LIBRARIES ${ADDITIONAL_REQUIRED_VARS}
VERSION_VAR GLIB_VERSION)

mark_as_advanced(
GLIBCONFIG_INCLUDE_DIR
GLIB_GIO_LIBRARIES
GLIB_GIO_UNIX_LIBRARIES
GLIB_GMODULE_LIBRARIES
GLIB_GOBJECT_LIBRARIES
GLIB_GTHREAD_LIBRARIES
GLIB_INCLUDE_DIR
GLIB_INCLUDE_DIRS
GLIB_LIBRARIES
)
22 changes: 18 additions & 4 deletions libdnf/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,30 @@ INCLUDE (UseSWIG)
INCLUDE_DIRECTORIES (${PYTHON_INCLUDE_PATH})
INCLUDE_DIRECTORIES ("${PROJECT_BINARY_DIR}")


SET (LIBDNF_SOURCES
repo.cpp
repo.cpp
)

SET (LIBDNF_HEADERS
package.hpp
repo.hpp
package.hpp
repo.hpp
swdb.hpp
)

INCLUDE_DIRECTORIES ("swdb")
ADD_SUBDIRECTORY ("swdb")

ADD_LIBRARY (libdnf SHARED ${LIBDNF_SOURCES})
SET (DNF_SO_VERSION 1)
SET_TARGET_PROPERTIES (libdnf PROPERTIES OUTPUT_NAME "dnf")
SET_TARGET_PROPERTIES (libdnf PROPERTIES SOVERSION ${DNF_SO_VERSION})

TARGET_LINK_LIBRARIES(
libdnf
${GLIB_LIBRARIES}
${GLIB_GOBJECT_LIBRARIES}
${GLIB_GIO_LIBRARIES}
${GLIB_GIO_UNIX_LIBRARIES})

# SWIG_ADD_LIBRARY doesn't work on RHEL 7 (cmake 2.8.12.2), use SWIG_ADD_MODULE instead
# Example: SWIG_ADD_LIBRARY (pylibdnf LANGUAGE python SOURCES pylibdnf.i)
Expand All @@ -36,3 +44,9 @@ SET_SOURCE_FILES_PROPERTIES (repo.i PROPERTIES CPLUSPLUS ON)
SWIG_ADD_MODULE (repo python repo.i)
SWIG_LINK_LIBRARIES (repo libdnf)
SWIG_LINK_LIBRARIES (repo ${PYTHON_LIBRARY})


SET_SOURCE_FILES_PROPERTIES (swdb.i PROPERTIES CPLUSPLUS ON)
SWIG_ADD_MODULE (swdb python swdb.i)
SWIG_LINK_LIBRARIES (swdb libdnf)
SWIG_LINK_LIBRARIES (swdb ${PYTHON_LIBRARY})
39 changes: 19 additions & 20 deletions libdnf/package.hpp
Original file line number Diff line number Diff line change
@@ -1,32 +1,31 @@
#ifndef DNF_PACKAGE_HPP
#define DNF_PACKAGE_HPP


#include "swdb.hpp"
#include <string>


class Package {
public:
Package() {};
virtual ~Package() = default;
std::string name;
class Package
{
public:
Package(){};
virtual ~Package() = default;
std::string name;
};


class RPMPackage : public Package {
public:
RPMPackage() {};
std::string version;
std::string release;
class RPMPackage : public Package
{
public:
RPMPackage(){};
std::string version;
std::string release;
};


class ModulePackage : public Package {
public:
ModulePackage() {};
std::string stream;
long long version;
class ModulePackage : public Package
{
public:
ModulePackage(){};
std::string stream;
long long version;
};


#endif
6 changes: 6 additions & 0 deletions libdnf/swdb.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#ifndef SWDB_H
#define SWDB_H

#include "swdb/package.hpp"

#endif
11 changes: 11 additions & 0 deletions libdnf/swdb.i
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
%module swdb

// wrap headers
%{
#include "swdb.hpp"
#include "swdb/package.hpp"
%}

// make SWIG look into following headers
%include "swdb.hpp"
%include "swdb/package.hpp"
17 changes: 17 additions & 0 deletions libdnf/swdb/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
SET(DNF_SWDB_DIR
${CMAKE_CURRENT_SOURCE_DIR}/dnf-swdb
)

SET(DNF_SWDB_SOURCES
${DNF_SWDB_DIR}/dnf-swdb-pkg.c
)

SET(LIBDNF_SOURCES
${LIBDNF_SOURCES}
${DNF_SWDB_SOURCES}
${CMAKE_CURRENT_SOURCE_DIR}/package.cpp
PARENT_SCOPE
)

INCLUDE_DIRECTORIES ("dnf-swdb")
ADD_SUBDIRECTORY ("dnf-swdb")
80 changes: 80 additions & 0 deletions libdnf/swdb/dnf-swdb/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
SET (DNF_GI_VERSION 42.0)

# source files used for gir generation
SET (DNF_SWDB_SOURCES
dnf-swdb-pkg.c
)

SET (DNF_SWDB_HEADERS
dnf-swdb-pkg.h
)

# gir generation - GObject introspection
# taken from https://github.com/ufo-kit/libuca/blob/master/src/CMakeLists.txt
find_program(INTROSPECTION_SCANNER "g-ir-scanner")
find_program(INTROSPECTION_COMPILER "g-ir-compiler")
pkg_check_modules(GOBJECT_INTROSPECTION gobject-introspection-1.0)

find_package(PkgConfig REQUIRED)
function(pkg_check_variable _pkg _name)
string(TOUPPER ${_pkg} _pkg_upper)
string(TOUPPER ${_name} _name_upper)
string(REPLACE "-" "_" _pkg_upper ${_pkg_upper})
string(REPLACE "-" "_" _name_upper ${_name_upper})
set(_output_name "${_pkg_upper}_${_name_upper}")

execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=${_name} ${_pkg}
OUTPUT_VARIABLE _pkg_result
OUTPUT_STRIP_TRAILING_WHITESPACE)

set("${_output_name}" "${_pkg_result}" CACHE STRING "pkg-config variable
${_name} of ${_pkg}")
endfunction()

if (GOBJECT_INTROSPECTION_FOUND)
option(WITH_GIR "Build introspection files" ON)

if (WITH_GIR)
pkg_check_variable(gobject-introspection-1.0 g_ir_scanner)
pkg_check_variable(gobject-introspection-1.0 g_ir_compiler)

set(GIR_PREFIX "Dnf-${DNF_GI_VERSION}")
set(GIR_XML "${GIR_PREFIX}.gir")
set(GIR_TYPELIB "${GIR_PREFIX}.typelib")

add_custom_command(OUTPUT ${GIR_XML}
COMMAND env CFLAGS=${CMAKE_C_FLAGS} ${GOBJECT_INTROSPECTION_1.0_G_IR_SCANNER}
--namespace=Dnf
--nsversion=${DNF_GI_VERSION}
--library-path=${CMAKE_CURRENT_BINARY_DIR}
--library=dnf
--no-libtool
--include=GObject-2.0
--include=Gio-2.0
-Idirectory ${CMAKE_CURRENT_SOURCE_DIR}
--output ${CMAKE_CURRENT_BINARY_DIR}/${GIR_XML}
--pkg=librepo
--warn-all
--quiet
${DNF_SWDB_SOURCES}
${DNF_SWDB_HEADERS}
DEPENDS libdnf
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

add_custom_command(OUTPUT ${GIR_TYPELIB}
COMMAND ${GOBJECT_INTROSPECTION_1.0_G_IR_COMPILER}
-o ${GIR_TYPELIB}
${GIR_XML}
DEPENDS ${GIR_XML}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
add_custom_target(gir ALL
DEPENDS ${GIR_XML} ${GIR_TYPELIB})

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${GIR_XML}
DESTINATION share/gir-1.0
COMPONENT libraries)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${GIR_TYPELIB}
DESTINATION ${LIB_INSTALL_DIR}/girepository-1.0
COMPONENT libraries)
endif()
endif()
Loading

0 comments on commit 65a1254

Please sign in to comment.