1
0
Fork 0

Add cppgir support

This commit is contained in:
Ilya Fedin 2023-04-22 11:54:27 +04:00 committed by John Preston
parent fecdffbbf4
commit dee3777ffd
7 changed files with 176 additions and 30 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "external/glib/cppgir"]
path = external/glib/cppgir
url = https://gitlab.com/mnauw/cppgir.git

View file

@ -7,33 +7,21 @@
add_library(external_glib INTERFACE IMPORTED GLOBAL) add_library(external_glib INTERFACE IMPORTED GLOBAL)
add_library(desktop-app::external_glib ALIAS external_glib) add_library(desktop-app::external_glib ALIAS external_glib)
function(add_cppgir) # isolate scope
set(BUILD_TESTING OFF)
set(BUILD_DOC OFF)
set(CMAKE_DISABLE_FIND_PACKAGE_Qt5Core ON)
add_subdirectory(cppgir)
endfunction()
add_cppgir()
include(generate_cppgir.cmake)
generate_cppgir(external_glib Gio-2.0)
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
pkg_check_modules(GLIB2 REQUIRED IMPORTED_TARGET glib-2.0) pkg_check_modules(GLIB2 REQUIRED IMPORTED_TARGET glib-2.0 gobject-2.0 gio-2.0 gio-unix-2.0)
pkg_check_modules(GOBJECT REQUIRED IMPORTED_TARGET gobject-2.0)
pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
pkg_check_modules(GIO_UNIX REQUIRED IMPORTED_TARGET gio-unix-2.0)
if (DESKTOP_APP_USE_PACKAGED) target_link_libraries(external_glib
target_link_libraries(external_glib INTERFACE
INTERFACE
PkgConfig::GIO_UNIX
PkgConfig::GIO
PkgConfig::GOBJECT
PkgConfig::GLIB2 PkgConfig::GLIB2
) )
else()
target_include_directories(external_glib SYSTEM
INTERFACE
${GIO_UNIX_INCLUDE_DIRS}
${GIO_INCLUDE_DIRS}
${GOBJECT_INCLUDE_DIRS}
${GLIB2_INCLUDE_DIRS}
)
target_link_libraries(external_glib
INTERFACE
gio-2.0
gobject-2.0
glib-2.0
)
endif()

1
external/glib/cppgir vendored Submodule

@ -0,0 +1 @@
Subproject commit bb2b437760a707fde6d4f51a7679fc4cc6410c3c

43
external/glib/generate_cppgir.cmake vendored Normal file
View file

@ -0,0 +1,43 @@
# This file is part of Desktop App Toolkit,
# a set of libraries for developing nice desktop applications.
#
# For license and copyright information please follow this link:
# https://github.com/desktop-app/legal/blob/master/LEGAL
function(generate_cppgir target_name gir)
# cppgir generates all the dependent headers everytime, better to have a global folder
set(gen_dst ${CMAKE_BINARY_DIR}/gen)
file(MAKE_DIRECTORY ${gen_dst})
set(gen_timestamp ${gen_dst}/${target_name}_cppgir.timestamp)
add_custom_command(
OUTPUT
${gen_timestamp}
COMMAND
cppgir
--class
--expected
--ignore
${cmake_helpers_loc}/external/glib/cppgir/data/cppgir.ignore:${cmake_helpers_loc}/external/glib/cppgir/data/cppgir_unix.ignore
--output
${gen_dst}
${gir}
COMMAND
echo 1> ${gen_timestamp}
COMMENT "Generating C++ wrapper for ${gir} (${target_name})"
DEPENDS
cppgir
$<$<PATH:IS_ABSOLUTE,${gir}>:${gir}>
)
generate_target(${target_name} cppgir ${gen_timestamp} "" ${gen_dst})
get_target_property(target_type ${target_name} TYPE)
if (${target_type} STREQUAL "INTERFACE_LIBRARY")
target_link_libraries(${target_name} INTERFACE gi)
target_compile_definitions(${target_name} INTERFACE GI_INLINE GI_OBJECT_NEWV)
else()
target_link_libraries(${target_name} PUBLIC gi)
target_compile_definitions(${target_name} PUBLIC GI_INLINE GI_OBJECT_NEWV)
endif()
endfunction()

61
external/glib/generate_dbus.cmake vendored Normal file
View file

@ -0,0 +1,61 @@
# This file is part of Desktop App Toolkit,
# a set of libraries for developing nice desktop applications.
#
# For license and copyright information please follow this link:
# https://github.com/desktop-app/legal/blob/master/LEGAL
include(${cmake_helpers_loc}/external/glib/generate_gir.cmake)
include(${cmake_helpers_loc}/external/glib/generate_cppgir.cmake)
function(generate_dbus target_name interface_prefix namespace interface_file)
find_program(DESKTOP_APP_GDBUSCODEGEN gdbus-codegen REQUIRED)
set(gen_dst ${CMAKE_CURRENT_BINARY_DIR}/gen)
file(MAKE_DIRECTORY ${gen_dst})
set(gen_timestamp ${gen_dst}/${target_name}_${namespace}_dbus.timestamp)
set(gen_files
${gen_dst}/${target_name}_${namespace}_dbus.c
${gen_dst}/${target_name}_${namespace}_dbus.h
)
add_custom_command(
OUTPUT
${gen_timestamp}
BYPRODUCTS
${gen_files}
COMMAND
${DESKTOP_APP_GDBUSCODEGEN}
--interface-prefix
${interface_prefix}
--generate-c-code
${gen_dst}/${target_name}_${namespace}_dbus
--c-namespace
${namespace}
--c-generate-object-manager
${interface_file}
COMMAND
echo 1> ${gen_timestamp}
COMMENT "Generating D-Bus C code for ${namespace} (${target_name})"
DEPENDS
${DESKTOP_APP_GDBUSCODEGEN}
)
add_library(${target_name}_${namespace}_dbus STATIC)
init_target(${target_name}_${namespace}_dbus "(gen)")
target_link_libraries(${target_name}_${namespace}_dbus PUBLIC desktop-app::external_glib)
generate_target(${target_name}_${namespace}_dbus timestamp ${gen_timestamp} "${gen_files}" ${gen_dst})
add_library(${target_name}_${namespace} INTERFACE)
init_target_folder(${target_name}_${namespace} "(gen)")
target_link_libraries(${target_name}_${namespace} INTERFACE ${target_name}_${namespace}_dbus)
generate_gir(${target_name}_${namespace} ${namespace} Gio-2.0 ${target_name}_${namespace}_dbus)
generate_cppgir(${target_name}_${namespace} ${CMAKE_CURRENT_BINARY_DIR}/gen/${target_name}_${namespace}.gir)
get_target_property(target_type ${target_name} TYPE)
if (${target_type} STREQUAL "INTERFACE_LIBRARY")
target_link_libraries(${target_name} INTERFACE ${target_name}_${namespace})
else()
target_link_libraries(${target_name} PUBLIC ${target_name}_${namespace})
endif()
endfunction()

45
external/glib/generate_gir.cmake vendored Normal file
View file

@ -0,0 +1,45 @@
# This file is part of Desktop App Toolkit,
# a set of libraries for developing nice desktop applications.
#
# For license and copyright information please follow this link:
# https://github.com/desktop-app/legal/blob/master/LEGAL
function(generate_gir target_name namespace deps src_target_name)
find_program(DESKTOP_APP_GIRSCANNER g-ir-scanner REQUIRED)
set(gen_dst ${CMAKE_CURRENT_BINARY_DIR}/gen)
file(MAKE_DIRECTORY ${gen_dst})
set(gen_timestamp ${gen_dst}/${target_name}_gir.timestamp)
set(gen_file ${gen_dst}/${target_name}.gir)
add_custom_command(
OUTPUT
${gen_timestamp}
BYPRODUCTS
${gen_file}
COMMAND
${DESKTOP_APP_GIRSCANNER}
-n
${namespace}
--nsversion
1.0
-l
$<TARGET_FILE:${src_target_name}>
--c-include
"$<JOIN:$<FILTER:$<TARGET_PROPERTY:${src_target_name},SOURCES>,INCLUDE,\\.h$>,$<SEMICOLON>--c-include>"
-i
"$<JOIN:${deps},$<SEMICOLON>-i>"
-o
${gen_file}
"$<TARGET_PROPERTY:${src_target_name},SOURCES>"
COMMAND
echo 1> ${gen_timestamp}
COMMAND_EXPAND_LISTS
COMMENT "Generating GIR (${target_name})"
DEPENDS
${DESKTOP_APP_GIRSCANNER}
${src_target_name}
)
generate_target(${target_name} gir ${gen_timestamp} "${gen_file}" ${gen_dst})
endfunction()

View file

@ -8,7 +8,12 @@ function(generate_target parent_name postfix generated_timestamp generated_files
add_custom_target(${parent_name}_${postfix} DEPENDS ${generated_timestamp}) add_custom_target(${parent_name}_${postfix} DEPENDS ${generated_timestamp})
init_target_folder(${parent_name}_${postfix} "(gen)") init_target_folder(${parent_name}_${postfix} "(gen)")
add_dependencies(${parent_name} ${parent_name}_${postfix}) add_dependencies(${parent_name} ${parent_name}_${postfix})
get_target_property(parent_type ${parent_name} TYPE)
if (${parent_type} STREQUAL "INTERFACE_LIBRARY")
target_include_directories(${parent_name} SYSTEM INTERFACE ${gen_dst})
else()
target_include_directories(${parent_name} SYSTEM PUBLIC ${gen_dst})
target_sources(${parent_name} PRIVATE ${generated_files}) target_sources(${parent_name} PRIVATE ${generated_files})
target_include_directories(${parent_name} PUBLIC ${gen_dst}) endif()
source_group("(gen)" FILES ${generated_files}) source_group("(gen)" FILES ${generated_files})
endfunction() endfunction()