Skip to content

Commit 1993d4f

Browse files
author
Lyberta
committed
Added support for find_package.
1 parent 351c102 commit 1993d4f

File tree

9 files changed

+288
-195
lines changed

9 files changed

+288
-195
lines changed

CONSUMING.md

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# IO2D Consuming How-To
2+
3+
First, you need to build and install this library somewhere where it will be found using `find_package`. Then, add the following line to import the targets into your CMake build script:
4+
5+
find_package(io2d REQUIRED)
6+
7+
Then you can choose which target to link your app to. The most reasonable choice is to link to `io2d::io2d`:
8+
9+
target_link_libraries(ExampleApp PRIVATE io2d::io2d)
10+
11+
This will link to backends that were built. This will make your app cross-platform out of the box. If you want to link to specific backend, you can specify it, for example:
12+
13+
target_link_libraries(ExampleApp PRIVATE io2d::io2d_cairo_xlib)
14+
15+
This will link to Cairo/Xlib backend only. Available backends are:
16+
17+
* `io2d::io2d_cairo_win32`
18+
* `io2d::io2d_cairo_xlib`
19+
* `io2d::io2d_coregraphics_mac`
20+
* `io2d::io2d_coregraphics_ios`

P0267_RefImpl/P0267_RefImpl/CMakeLists.txt

+49-30
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
cmake_minimum_required(VERSION 3.0.0)
1+
cmake_minimum_required(VERSION 3.8)
22
project(io2d CXX)
3-
set(CMAKE_CXX_STANDARD 17)
43

54
# If there's no default backend we try to set it automatically
65
if( NOT DEFINED IO2D_DEFAULT )
@@ -24,7 +23,11 @@ if( NOT DEFINED IO2D_ENABLED )
2423
set(IO2D_ENABLED ${IO2D_DEFAULT})
2524
endif()
2625

27-
add_library(io2d
26+
# Core library
27+
# io2d_core contains backend-independent files. It is used by backends. You
28+
# shouldn't directly link to this library.
29+
30+
add_library(io2d_core
2831
rgba_color.cpp
2932
xio2d.h
3033
xbrushes.h
@@ -50,24 +53,53 @@ add_library(io2d
5053
xinterchangebuffer.h
5154
)
5255

53-
target_include_directories(io2d PUBLIC
54-
${CMAKE_CURRENT_SOURCE_DIR}
56+
target_include_directories(io2d_core PUBLIC
57+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
58+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
59+
)
60+
61+
target_compile_features(io2d_core PUBLIC cxx_std_17)
62+
63+
install(
64+
TARGETS io2d_core EXPORT io2d_targets
65+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
66+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
67+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
68+
)
69+
70+
file(
71+
GLOB IO2D_CORE_HEADERS
72+
"${CMAKE_CURRENT_SOURCE_DIR}/*.h"
5573
)
5674

75+
install(
76+
FILES ${IO2D_CORE_HEADERS}
77+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
78+
)
79+
80+
# User facing library
81+
# io2d is a user facing interface library that depends on all enabled backends
82+
# Usually, you want to link only to this library.
83+
84+
add_library(io2d INTERFACE)
5785

5886
# function that maps a backend name into it's path and library name
5987
function(GET_BACKEND_INFO backend_name)
6088
if( ${backend_name} STREQUAL "COREGRAPHICS_MAC" )
61-
set(BACKEND_PATH coregraphics/mac PARENT_SCOPE)
89+
set(BACKEND_PATH1 coregraphics PARENT_SCOPE)
90+
set(BACKEND_PATH2 coregraphics/mac PARENT_SCOPE)
6291
set(BACKEND_LIBRARY io2d_coregraphics_mac PARENT_SCOPE)
6392
elseif( ${backend_name} STREQUAL "COREGRAPHICS_IOS" )
64-
set(BACKEND_PATH coregraphics/ios PARENT_SCOPE)
93+
set(BACKEND_PATH1 coregraphics PARENT_SCOPE)
94+
set(BACKEND_PATH2 coregraphics/ios PARENT_SCOPE)
6595
set(BACKEND_LIBRARY io2d_coregraphics_ios PARENT_SCOPE)
6696
elseif( ${backend_name} STREQUAL "CAIRO_XLIB" )
67-
set(BACKEND_PATH cairo/xlib PARENT_SCOPE)
97+
set(BACKEND_PATH1 cairo PARENT_SCOPE)
98+
set(BACKEND_PATH2 cairo/xlib PARENT_SCOPE)
6899
set(BACKEND_LIBRARY io2d_cairo_xlib PARENT_SCOPE)
69100
elseif( ${backend_name} STREQUAL "CAIRO_WIN32" )
70-
set(BACKEND_PATH cairo/win32 PARENT_SCOPE)
101+
set(BACKEND_PATH1 cairo PARENT_SCOPE)
102+
set(BACKEND_PATH2 cairo/win32 PARENT_SCOPE)
71103
set(BACKEND_LIBRARY io2d_cairo_win32 PARENT_SCOPE)
72104
else()
73105
message( FATAL_ERROR "GET_BACKEND_INFO: unknown backend name" )
@@ -77,31 +109,18 @@ endfunction(GET_BACKEND_INFO)
77109
# fetch info about the default backend
78110
GET_BACKEND_INFO(${IO2D_DEFAULT})
79111

80-
# add a search path depending on a default backend setting
81-
target_include_directories(io2d PUBLIC
82-
${CMAKE_CURRENT_SOURCE_DIR}/${BACKEND_PATH}
83-
)
84-
85112
# add backends themselves
86113
foreach(backend ${IO2D_ENABLED})
87114
GET_BACKEND_INFO(${backend})
88-
add_subdirectory(${BACKEND_PATH})
89-
target_link_libraries(io2d ${BACKEND_LIBRARY})
115+
add_subdirectory(${BACKEND_PATH1})
116+
add_subdirectory(${BACKEND_PATH2})
117+
target_link_libraries(io2d INTERFACE ${BACKEND_LIBRARY})
90118
endforeach(backend)
91119

92-
# installation
93-
install(
94-
TARGETS io2d
95-
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
96-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
97-
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
98-
)
99-
file(
100-
GLOB IO2D_HEADERS
101-
"${CMAKE_CURRENT_SOURCE_DIR}/*.h"
102-
)
120+
install(TARGETS io2d EXPORT io2d_targets)
103121

104-
install(
105-
FILES ${IO2D_HEADERS}
106-
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
122+
install(EXPORT io2d_targets
123+
FILE io2dConfig.cmake
124+
NAMESPACE io2d::
125+
DESTINATION lib/cmake/io2d
107126
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
cmake_minimum_required(VERSION 3.8)
2+
3+
project(io2d CXX)
4+
5+
add_library(io2d_cairo
6+
cairo_renderer-graphicsmagickinit.cpp
7+
xcairo.h
8+
xcairo_brushes_impl.h
9+
xcairo_helpers.h
10+
xcairo_paths_impl.h
11+
xcairo_surfaces_image_impl.h
12+
xcairo_surfaces_impl.h
13+
xcairo_surface_state_props_impl.h
14+
xio2d_cairo_main.h
15+
)
16+
17+
target_include_directories(io2d_cairo PUBLIC
18+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
19+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
20+
)
21+
22+
target_compile_features(io2d_cairo PUBLIC cxx_std_17)
23+
24+
target_link_libraries(io2d_cairo PUBLIC io2d_core)
25+
26+
if(MSVC)
27+
find_path(CAIRO_INCLUDE_DIR cairo.h)
28+
find_path(GRAPHICSMAGICK_INCLUDE_DIR magick/api.h)
29+
find_library(CAIRO_LIB_DEBUG cairod)
30+
find_library(CAIRO_LIB_RELEASE cairo)
31+
find_library(GRAPHICSMAGICK_LIB graphicsmagick)
32+
elseif(APPLE)
33+
find_path(CAIRO_INCLUDE_DIR cairo-xlib.h PATH_SUFFIXES cairo)
34+
find_path(GRAPHICSMAGICK_INCLUDE_DIR magick/api.h PATH_SUFFIXES GraphicsMagick)
35+
find_library(CAIRO_LIB cairo)
36+
find_library(GRAPHICSMAGICK_LIB GraphicsMagick)
37+
else() # Linux
38+
find_path(CAIRO_INCLUDE_DIR cairo-xlib.h PATH_SUFFIXES cairo)
39+
find_path(GRAPHICSMAGICK_INCLUDE_DIR magick/api.h PATH_SUFFIXES GraphicsMagick)
40+
find_library(CAIRO_LIB cairo)
41+
find_library(GRAPHICSMAGICK_LIB GraphicsMagick)
42+
endif()
43+
44+
target_include_directories(io2d_cairo SYSTEM PUBLIC ${CAIRO_INCLUDE_DIR} ${GRAPHICSMAGICK_INCLUDE_DIR})
45+
46+
target_link_libraries(io2d_cairo PUBLIC ${GRAPHICSMAGICK_LIB})
47+
48+
if(MSVC)
49+
target_link_libraries(io2d_cairo PUBLIC debug ${CAIRO_LIB_DEBUG} optimized ${CAIRO_LIB_RELEASE})
50+
else()
51+
target_link_libraries(io2d_cairo PUBLIC ${CAIRO_LIB})
52+
endif()
53+
54+
install(
55+
TARGETS io2d_cairo EXPORT io2d_targets
56+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
57+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
58+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
59+
)
60+
61+
file(
62+
GLOB IO2D_CAIRO_HEADERS
63+
"${CMAKE_CURRENT_SOURCE_DIR}/*.h"
64+
)
65+
66+
install(
67+
FILES ${IO2D_CAIRO_HEADERS}
68+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
69+
)

P0267_RefImpl/P0267_RefImpl/cairo/cairo_renderer-graphicsmagickinit.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#include "io2d.h"
21
#include "xcairo.h"
32
#include <mutex>
43
#include <magick/api.h>
@@ -16,4 +15,4 @@ namespace std::experimental::io2d {
1615
}
1716
}
1817
}
19-
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
cmake_minimum_required(VERSION 3.0.0)
1+
cmake_minimum_required(VERSION 3.8)
22

33
project(io2d CXX)
44

5-
set(CMAKE_CXX_STANDARD 17)
6-
7-
set(IO2D_LIB_SRC
5+
add_library(io2d_cairo_win32
86
io2d.h
97
io2d_cairo_win32.h
108
xio2d_cairo_win32_main.h
@@ -14,33 +12,20 @@ set(IO2D_LIB_SRC
1412
xio2d_cairo_win32_surfaces_impl.h
1513
xio2d_cairo_win32_error.h
1614
cairo_renderer_win32.cpp
17-
../xcairo.h
18-
../xcairo_brushes_impl.h
19-
../xcairo_helpers.h
20-
../xcairo_paths_impl.h
21-
../xcairo_surface_state_props_impl.h
22-
../xcairo_surfaces_image_impl.h
23-
../xcairo_surfaces_impl.h
24-
../xio2d_cairo_main.h
25-
../cairo_renderer-graphicsmagickinit.cpp
2615
)
2716

28-
add_library(io2d_cairo_win32 ${IO2D_LIB_SRC})
29-
3017
target_include_directories(io2d_cairo_win32 PUBLIC
31-
${CMAKE_CURRENT_SOURCE_DIR}
32-
${CMAKE_CURRENT_SOURCE_DIR}/..
33-
${CMAKE_CURRENT_SOURCE_DIR}/../..
18+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
19+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
3420
)
21+
22+
target_compile_features(io2d_cairo_win32 PUBLIC cxx_std_17)
23+
24+
target_link_libraries(io2d_cairo_win32 PUBLIC io2d_cairo)
3525

3626
if(MSVC)
3727
target_compile_definitions(io2d_cairo_win32 PUBLIC -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_WARNINGS)
3828

39-
find_path(CAIRO_INCLUDE_DIR cairo.h)
40-
find_path(GRAPHICSMAGICK_INCLUDE_DIR magick/api.h)
41-
find_library(CAIRO_LIB_DEBUG cairod)
42-
find_library(CAIRO_LIB_RELEASE cairo)
43-
find_library(GRAPHICSMAGICK_LIB graphicsmagick)
4429
find_library(PIXMAN_LIB pixman-1)
4530
find_library(FREETYPE_LIB freetype)
4631
find_library(FONTCONFIG_LIB fontconfig)
@@ -56,26 +41,24 @@ if(MSVC)
5641
find_library(ICONV_LIB libiconv)
5742
find_library(CHARSET_LIB libcharset)
5843

59-
target_include_directories(io2d_cairo_win32 PUBLIC ${CAIRO_INCLUDE_DIR} ${GRAPHICSMAGICK_INCLUDE_DIR})
60-
target_link_libraries(io2d_cairo_win32 ${GRAPHICSMAGICK_LIB} ${PIXMAN_LIB} ${FREETYPE_LIB} ${FONTCONFIG_LIB} ${BZ_LIB} ${JPEG_LIB} ${TIFF_LIB} ${EXPAT_LIB} ${LZMA_LIB} ${ICONV_LIB} ${CHARSET_LIB})
44+
target_link_libraries(io2d_cairo_win32 ${PIXMAN_LIB} ${FREETYPE_LIB} ${FONTCONFIG_LIB} ${BZ_LIB} ${JPEG_LIB} ${TIFF_LIB} ${EXPAT_LIB} ${LZMA_LIB} ${ICONV_LIB} ${CHARSET_LIB})
6145
target_link_libraries(io2d_cairo_win32 debug ${PNG_LIB_DEBUG} optimized ${PNG_LIB_RELEASE})
6246
target_link_libraries(io2d_cairo_win32 debug ${ZLIB_LIB_DEBUG} optimized ${ZLIB_LIB_RELEASE})
63-
target_link_libraries(io2d_cairo_win32 debug ${CAIRO_LIB_DEBUG} optimized ${CAIRO_LIB_RELEASE})
6447
endif()
6548

66-
# installation
6749
install(
68-
TARGETS io2d_cairo_win32
69-
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
70-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
71-
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
50+
TARGETS io2d_cairo_win32 EXPORT io2d_targets
51+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
52+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
53+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
7254
)
55+
7356
file(
74-
GLOB IO2D_HEADERS
75-
"${CMAKE_CURRENT_SOURCE_DIR}/*.h"
76-
"${CMAKE_CURRENT_SOURCE_DIR}/../*.h"
57+
GLOB IO2D_CAIRO_WIN32_HEADERS
58+
"${CMAKE_CURRENT_SOURCE_DIR}/*.h"
7759
)
60+
7861
install(
79-
FILES ${IO2D_HEADERS}
80-
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
62+
FILES ${IO2D_CAIRO_WIN32_HEADERS}
63+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
8164
)

0 commit comments

Comments
 (0)