blob: d71415996cd4ac75f74299e3523e9977ef8136d7 [file] [log] [blame]
mtkleine0f06a42015-08-28 11:51:06 -07001# Boilerplate.
mtklein0ce744e2015-09-01 09:22:31 -07002cmake_minimum_required (VERSION 3.1) # First version with CMAKE_CXX_STANDARD.
mtkleine0f06a42015-08-28 11:51:06 -07003project (skimake)
4set (CMAKE_CXX_STANDARD 11)
5
6# Default to Release mode. We're mainly targeting Skia users, not Skia developers.
7if (NOT CMAKE_BUILD_TYPE)
8 set (CMAKE_BUILD_TYPE Release)
9endif ()
10
11# To first approximation, the Skia library comprises all .cpp files under src/.
12file (GLOB_RECURSE srcs ../src/*.cpp)
13
14function (find_include_dirs out)
mtklein2409abb2015-08-31 06:59:21 -070015 file (GLOB_RECURSE headers ${ARGN})
mtkleine0f06a42015-08-28 11:51:06 -070016 foreach (path ${headers})
17 get_filename_component (dir ${path} PATH)
18 list (APPEND include_dirs ${dir})
19 endforeach()
20 list (REMOVE_DUPLICATES include_dirs)
21 set (${out} ${include_dirs} PARENT_SCOPE)
22endfunction()
23
24# We need src/ directories and include/private on our path when building Skia.
25# Users should be able to use Skia with only include/ directories that are not include/private.
26find_include_dirs(private_includes ../src/*.h ../include/private/*.h)
27find_include_dirs(public_includes ../include/*.h)
28list (REMOVE_ITEM public_includes ${private_includes}) # Easiest way to exclude private.
halcanary0cf5ecb2015-11-30 10:29:25 -080029file (GLOB default_include_config "../include/config")
30list (REMOVE_ITEM public_includes ${default_include_config})
halcanaryd1c94a42015-11-30 12:42:58 -080031set (userconfig_directory ${CMAKE_BINARY_DIR}/include)
halcanary0cf5ecb2015-11-30 10:29:25 -080032list (APPEND public_includes ${userconfig_directory})
mtkleine0f06a42015-08-28 11:51:06 -070033
34# These guys are third_party but provided by a Skia checkout.
35list (APPEND srcs ../third_party/etc1/etc1.cpp ../third_party/ktx/ktx.cpp)
36list (APPEND private_includes ../third_party/etc1 ../third_party/ktx)
37
38function (remove_srcs)
mtklein2409abb2015-08-31 06:59:21 -070039 file (GLOB_RECURSE to_remove ${ARGN})
mtkleine0f06a42015-08-28 11:51:06 -070040 list (REMOVE_ITEM srcs ${to_remove})
41 set (srcs ${srcs} PARENT_SCOPE)
42endfunction()
43
44# This file is empty and is only used to trick GYP.
45remove_srcs (../src/core/SkForceCPlusPlusLinking.cpp)
46# This file forces linking for all our supported image decoders. We're more fine-grained.
47remove_srcs (../src/images/SkForceLinking.cpp)
mtklein2409abb2015-08-31 06:59:21 -070048# Chrome only?
49remove_srcs (../src/ports/SkFontHost_fontconfig.cpp
50 ../src/fonts/SkFontMgr_fontconfig.cpp
bungemanc1da4d02015-12-01 14:26:28 -050051 ../src/ports/SkFontConfigInterface_direct.cpp
52 ../src/ports/SkFontConfigInterface_direct_factory.cpp
53 ../src/ports/SkFontConfigInterface_direct_google3.cpp
54 ../src/ports/SkFontConfigInterface_direct_google3_factory.cpp)
mtklein2409abb2015-08-31 06:59:21 -070055# Alternative font managers.
56remove_srcs (../src/ports/SkFontMgr_custom*.cpp)
mtkleine0f06a42015-08-28 11:51:06 -070057
58# Skia sure ships a lot of code no one uses.
59remove_srcs (../src/animator/* ../src/*nacl* ../src/svg/* ../src/views/* ../src/xml/*)
jcgregorio3fc3fea2016-03-03 12:46:12 -080060foreach (include animator svg svg/parser views xml gpu/vk)
halcanary0cbe7ee2015-12-01 09:02:49 -080061 file (GLOB globed_include ../include/${include})
62 list (REMOVE_ITEM public_includes ${globed_include})
63endforeach()
mtkleine0f06a42015-08-28 11:51:06 -070064
mtkleine0f06a42015-08-28 11:51:06 -070065# Remove OS-specific source files.
mtklein56c6a112015-09-30 11:06:53 -070066if (NOT UNIX)
mtklein1ee76512015-11-02 10:20:27 -080067 remove_srcs(../src/ports/*_posix.cpp
mtklein56c6a112015-09-30 11:06:53 -070068 ../src/ports/SkTLS_pthread.cpp
69 ../src/ports/SkTime_Unix.cpp
mtkleina1bde7d2015-10-20 11:05:06 -070070 ../src/utils/SkThreadUtils_pthread.cpp)
mtklein56c6a112015-09-30 11:06:53 -070071endif()
mtklein2409abb2015-08-31 06:59:21 -070072if (APPLE OR NOT UNIX)
73 remove_srcs(../src/gpu/gl/glx/*
74 ../src/images/SkImageDecoder_FactoryDefault.cpp
75 ../src/ports/SkFontMgr_fontconfig*.cpp
Ben Wagnera182b802016-01-21 17:38:13 -050076 ../src/ports/SkFontMgr_android*.cpp
mtklein2409abb2015-08-31 06:59:21 -070077 ../src/*FreeType*)
mtkleine0f06a42015-08-28 11:51:06 -070078endif()
mtkleine0f06a42015-08-28 11:51:06 -070079
80# Remove processor-specific source files.
mtklein0faed582015-09-14 12:02:32 -070081if (NOT CMAKE_SYSTEM_PROCESSOR STREQUAL ARM)
mtkleine0f06a42015-08-28 11:51:06 -070082 remove_srcs(../src/*arm* ../src/*ARM* ../src/*neon* ../src/*NEON*)
83endif()
mtklein0faed582015-09-14 12:02:32 -070084if (NOT CMAKE_SYSTEM_PROCESSOR STREQUAL MIPS)
mtkleine0f06a42015-08-28 11:51:06 -070085 remove_srcs(../src/*mips* ../src/*MIPS*)
86endif()
87
88# Make our ports choices.
89remove_srcs(
90 ../src/*moz* # We're probably not Mozilla.
91 ../src/gpu/GrContextFactory.cpp # For internal testing only.
92 ../src/gpu/gl/GrGLCreateNativeInterface_none.cpp
93 ../src/gpu/gl/GrGLDefaultInterface_none.cpp
94 ../src/gpu/gl/SkCreatePlatformGLContext*.cpp # For internal testing only.
95 ../src/gpu/gl/command_buffer/*
96 ../src/gpu/gl/egl/*
mtkleine0f06a42015-08-28 11:51:06 -070097 ../src/gpu/gl/iOS/*
egdanielb6ce10a2016-02-22 07:19:10 -080098 ../src/gpu/vk/*
mtkleine0f06a42015-08-28 11:51:06 -070099 ../src/opts/SkBitmapProcState_opts_none.cpp
100 ../src/opts/SkBlitMask_opts_none.cpp
101 ../src/opts/SkBlitRow_opts_none.cpp
102 ../src/ports/SkFontMgr_empty_factory.cpp
103 ../src/ports/SkGlobalInitialization_chromium.cpp
104 ../src/ports/SkImageDecoder_empty.cpp
105 ../src/ports/SkImageGenerator_none.cpp
mtklein2409abb2015-08-31 06:59:21 -0700106 ../src/ports/SkTLS_none.cpp)
mtkleine0f06a42015-08-28 11:51:06 -0700107
msarettfdd52c42016-03-09 15:12:31 -0800108if (NOT APPLE)
109 remove_srcs(../src/ports/SkImageGeneratorCG.cpp)
110endif()
111
mtklein56c6a112015-09-30 11:06:53 -0700112if (WIN32)
113 if(SKIA_GDI)
114 remove_srcs(../src/ports/SkFontMgr_win_dw_factory.cpp)
115 else()
116 remove_srcs(../src/ports/SkFontMgr_win_gdi_factory.cpp)
117 endif()
118endif()
119
120remove_srcs(../src/gpu/gl/angle/*) # TODO
mtkleine0f06a42015-08-28 11:51:06 -0700121
mtkleinf6d8d282015-12-17 10:18:04 -0800122# Certain files must be compiled with support for SSSE3, SSE4.1, AVX, or AVX2 intrinsics.
mtkleine0f06a42015-08-28 11:51:06 -0700123file (GLOB_RECURSE ssse3_srcs ../src/*ssse3*.cpp ../src/*SSSE3*.cpp)
124file (GLOB_RECURSE sse41_srcs ../src/*sse4*.cpp ../src/*SSE4*.cpp)
mtkleinf6d8d282015-12-17 10:18:04 -0800125file (GLOB_RECURSE avx_srcs ../src/*_avx.cpp)
126file (GLOB_RECURSE avx2_srcs ../src/*_avx2.cpp)
mtkleine0f06a42015-08-28 11:51:06 -0700127set_source_files_properties(${ssse3_srcs} PROPERTIES COMPILE_FLAGS -mssse3)
128set_source_files_properties(${sse41_srcs} PROPERTIES COMPILE_FLAGS -msse4.1)
mtkleinf6d8d282015-12-17 10:18:04 -0800129set_source_files_properties(${avx_srcs} PROPERTIES COMPILE_FLAGS -mavx)
130set_source_files_properties(${avx2_srcs} PROPERTIES COMPILE_FLAGS -mavx2)
mtkleine0f06a42015-08-28 11:51:06 -0700131
132# Detect our optional dependencies.
133# If we can't find them, don't build the parts of Skia that use them.
mtklein1ee76512015-11-02 10:20:27 -0800134find_package (EXPAT)
mtklein2409abb2015-08-31 06:59:21 -0700135find_package (Lua)
mtkleine0f06a42015-08-28 11:51:06 -0700136find_package (ZLIB)
137# No find_package for libwebp as far as I can tell, so simulate it here.
138find_path (WEBP_INCLUDE_DIRS "webp/decode.h")
139find_library (WEBP_LIBRARIES webp)
halcanary4ae26252015-09-21 09:42:23 -0700140find_path (OSMESA_INCLUDE_DIRS "GL/osmesa.h")
141find_library(OSMESA_LIBRARIES "OSMesa")
mtkleine0f06a42015-08-28 11:51:06 -0700142
mtklein2409abb2015-08-31 06:59:21 -0700143if (UNIX AND NOT APPLE)
144 find_package (Freetype)
145 # Same deal for fontconfig.
146 find_path (FONTCONFIG_INCLUDE_DIRS "fontconfig/fontconfig.h")
147 find_library (FONTCONFIG_LIBRARIES fontconfig)
148 find_package (GIF)
149 find_package (JPEG)
150 find_package (PNG)
151endif()
152
msarett4691d992016-02-16 13:16:39 -0800153# Do not compile SkRawCodec.
154remove_srcs(../src/codec/*Raw*.cpp)
155
mtklein2409abb2015-08-31 06:59:21 -0700156# TODO: macro away this if (found) ... else() ... endif() stuff.
157
mtklein1ee76512015-11-02 10:20:27 -0800158if (EXPAT_FOUND)
159 list (APPEND private_includes ${EXPAT_INCLUDE_DIRS})
160 list (APPEND libs ${EXPAT_LIBRARIES})
161else()
162 remove_srcs (../src/ports/SkFontMgr_android_parser.cpp)
163endif()
164
mtklein2409abb2015-08-31 06:59:21 -0700165if (GIF_FOUND)
166 list (APPEND private_includes ${GIF_INCLUDE_DIRS})
167 list (APPEND libs ${GIF_LIBRARIES})
msarett39b2d5a2016-02-17 08:26:31 -0800168 add_definitions(-DSK_CODEC_DECODES_GIF)
mtklein2409abb2015-08-31 06:59:21 -0700169else()
mtkleine0f06a42015-08-28 11:51:06 -0700170 remove_srcs(../src/images/*gif*)
msarett39b2d5a2016-02-17 08:26:31 -0800171 remove_srcs(../src/codec/*Gif*)
mtkleine0f06a42015-08-28 11:51:06 -0700172endif()
mtklein2409abb2015-08-31 06:59:21 -0700173
174if (JPEG_FOUND)
175 list (APPEND private_includes ${JPEG_INCLUDE_DIRS})
176 list (APPEND libs ${JPEG_LIBRARIES})
msarett39b2d5a2016-02-17 08:26:31 -0800177 add_definitions(-DSK_CODEC_DECODES_JPEG)
mtklein2409abb2015-08-31 06:59:21 -0700178else()
mtkleine0f06a42015-08-28 11:51:06 -0700179 remove_srcs(../src/images/*jpeg*)
msarett39b2d5a2016-02-17 08:26:31 -0800180 remove_srcs(../src/images/*Jpeg*)
181 remove_srcs(../src/codec/*Jpeg*)
mtkleine0f06a42015-08-28 11:51:06 -0700182endif()
mtklein2409abb2015-08-31 06:59:21 -0700183
184if (LUA_FOUND)
185 list (APPEND private_includes ${LUA_INCLUDE_DIR})
186 list (APPEND libs ${LUA_LIBRARIES})
187else()
188 remove_srcs(../src/utils/*Lua*)
mtkleine0f06a42015-08-28 11:51:06 -0700189endif()
mtklein2409abb2015-08-31 06:59:21 -0700190
191if (PNG_FOUND)
192 list (APPEND private_includes ${PNG_INCLUDE_DIRS})
193 list (APPEND libs ${PNG_LIBRARIES})
msarett4691d992016-02-16 13:16:39 -0800194 add_definitions(-DPNG_SKIP_SETJMP_CHECK)
195 add_definitions(-DPNG_SKIP_SKIA_OPTS)
msarett39b2d5a2016-02-17 08:26:31 -0800196 add_definitions(-DSK_CODEC_DECODES_PNG)
mtklein2409abb2015-08-31 06:59:21 -0700197else()
mtkleine0f06a42015-08-28 11:51:06 -0700198 remove_srcs(../src/images/*png*)
msarett39b2d5a2016-02-17 08:26:31 -0800199 remove_srcs(../src/images/*ico*)
200 remove_srcs(../src/codec/*Png*)
201 remove_srcs(../src/codec/*Ico*)
mtkleine0f06a42015-08-28 11:51:06 -0700202endif()
mtklein2409abb2015-08-31 06:59:21 -0700203
204if (ZLIB_FOUND)
205 list (APPEND private_includes ${ZLIB_INCLUDE_DIRS})
206 list (APPEND libs ${ZLIB_LIBRARIES})
halcanary23f4d4d2016-03-12 05:59:39 -0800207 remove_srcs(../src/pdf/SkDocument_PDF_None.cpp)
mtklein2409abb2015-08-31 06:59:21 -0700208else()
halcanary23f4d4d2016-03-12 05:59:39 -0800209 remove_srcs(../src/pdf/*.cpp)
210 set (srcs ${srcs} ../src/pdf/SkDocument_PDF_None.cpp)
mtkleine0f06a42015-08-28 11:51:06 -0700211endif()
mtklein2409abb2015-08-31 06:59:21 -0700212
213if (WEBP_INCLUDE_DIRS AND WEBP_LIBRARIES)
214 list (APPEND private_includes ${WEBP_INCLUDE_DIRS})
215 list (APPEND libs ${WEBP_LIBRARIES})
msarett39b2d5a2016-02-17 08:26:31 -0800216 add_definitions(-DSK_CODEC_DECODES_WEBP)
mtklein2409abb2015-08-31 06:59:21 -0700217else()
mtkleine0f06a42015-08-28 11:51:06 -0700218 remove_srcs(../src/images/*webp*)
msarett39b2d5a2016-02-17 08:26:31 -0800219 remove_srcs(../src/codec/*Webp*)
mtkleine0f06a42015-08-28 11:51:06 -0700220endif()
221
mtklein2409abb2015-08-31 06:59:21 -0700222if (FREETYPE_FOUND)
223 list (APPEND private_includes ${FREETYPE_INCLUDE_DIRS})
224 list (APPEND libs ${FREETYPE_LIBRARIES})
225endif()
226
227if (FONTCONFIG_INCLUDE_DIRS AND FONTCONFIG_LIBRARIES)
228 list (APPEND private_includes ${FONTCONFIG_INCLUDE_DIRS})
229 list (APPEND libs ${FONTCONFIG_LIBRARIES})
230endif()
231
mtkleine0f06a42015-08-28 11:51:06 -0700232if (APPLE)
mtklein2409abb2015-08-31 06:59:21 -0700233 find_library(APPLICATION_SERVICES_FRAMEWORK ApplicationServices REQUIRED)
234 list (APPEND libs ${APPLICATION_SERVICES_FRAMEWORK})
mtkleine0f06a42015-08-28 11:51:06 -0700235endif()
236
halcanary4ae26252015-09-21 09:42:23 -0700237if (OSMESA_LIBRARIES AND OSMESA_INCLUDE_DIRS)
238 list (APPEND libs ${OSMESA_LIBRARIES})
239 list (APPEND private_includes ${OSMESA_INCLUDE_DIRS})
240 list (APPEND public_defines "-DSK_MESA=1")
mtklein014f06b2016-01-05 08:32:32 -0800241 set (SK_MESA 1)
halcanary4ae26252015-09-21 09:42:23 -0700242else()
243 remove_srcs(../src/gpu/gl/mesa/*)
halcanary4ae26252015-09-21 09:42:23 -0700244endif()
245
mtklein56c6a112015-09-30 11:06:53 -0700246if (WIN32)
247 list (APPEND libs FontSub.lib Usp10.lib)
248endif()
249
halcanary2a4a4212015-09-01 10:11:44 -0700250find_package(OpenGL REQUIRED)
251list (APPEND libs ${OPENGL_LIBRARIES})
252
mtkleine0f06a42015-08-28 11:51:06 -0700253# This is our main output, libskia.so.
254# We mostly build an .so here because it helps test we've linked everything,
255# not so much that we think Skia is a good candidate to ship as a shared library.
256add_library (skia SHARED ${srcs})
257
258target_compile_definitions(skia
halcanary4ae26252015-09-21 09:42:23 -0700259 PUBLIC ${public_defines}
mtklein56c6a112015-09-30 11:06:53 -0700260 PRIVATE -DSKIA_DLL -DSKIA_IMPLEMENTATION=1)
mtkleine0f06a42015-08-28 11:51:06 -0700261
262target_include_directories(skia
263 PUBLIC ${public_includes}
mtklein2409abb2015-08-31 06:59:21 -0700264 PRIVATE ${private_includes})
mtkleine0f06a42015-08-28 11:51:06 -0700265
266target_link_libraries(skia
267 PUBLIC
mtklein2409abb2015-08-31 06:59:21 -0700268 PRIVATE ${libs})
269
mtklein56c6a112015-09-30 11:06:53 -0700270if (MSVC)
271 set(cc_flags "/w /GR-")
272else()
273 set(cc_flags "-w -fno-rtti -fno-exceptions")
274endif()
mtkleine0f06a42015-08-28 11:51:06 -0700275
276set_target_properties(skia PROPERTIES
mtklein56c6a112015-09-30 11:06:53 -0700277 COMPILE_FLAGS ${cc_flags}
mtkleine0f06a42015-08-28 11:51:06 -0700278 CXX_VISIBILITY_PRESET hidden
279 VISIBILITY_INLINES_HIDDEN true)
280
halcanary5a9a5b32015-09-03 14:23:17 -0700281# Experimental C API install:
mtkleina5b0f032015-09-29 13:16:33 -0700282file(GLOB c_headers "../include/c/*.h")
283install(FILES ${c_headers} DESTINATION include)
halcanary5a9a5b32015-09-03 14:23:17 -0700284install(TARGETS skia DESTINATION lib)
285
halcanaryd1c94a42015-11-30 12:42:58 -0800286# SkUserConfig.h
halcanaryd1c94a42015-11-30 12:42:58 -0800287if (CMAKE_BUILD_TYPE STREQUAL Release)
mtklein014f06b2016-01-05 08:32:32 -0800288 set (SK_RELEASE 1)
mtklein95bc09b2016-01-07 06:56:11 -0800289else()
290 set (SK_RELEASE 0)
halcanaryd1c94a42015-11-30 12:42:58 -0800291endif()
mtklein014f06b2016-01-05 08:32:32 -0800292configure_file ("SkUserConfig.h.in" "${userconfig_directory}/SkUserConfig.h")
halcanaryd1c94a42015-11-30 12:42:58 -0800293
294# skia_link_arguments.txt
295set (link_arguments ${CMAKE_BINARY_DIR}/skia_link_arguments.txt)
296file (WRITE ${link_arguments} "-L${CMAKE_BINARY_DIR}\n")
297file (APPEND ${link_arguments} "-lskia\n")
298file (APPEND ${link_arguments} "-Wl,-rpath,${CMAKE_BINARY_DIR}\n")
299
300# skia_compile_arguments.txt
301set (compile_arguments ${CMAKE_BINARY_DIR}/skia_compile_arguments.txt)
302file (WRITE ${compile_arguments} "--std=c++11\n")
303foreach (include ${public_includes})
304 get_filename_component (abs_include ${include} ABSOLUTE)
305 file (APPEND ${compile_arguments} "-I${abs_include}\n")
306endforeach()
307
308# cmake .
309# cmake --build . --target skia
310# c++ -c @skia_compile_arguments.txt example.cpp
311# c++ example.o @skia_link_arguments.txt
312
313# skia.h
halcanary0cbe7ee2015-12-01 09:02:49 -0800314set (bad_files GrGLConfig_chrome.h SkJSONCPP.h SkParsePaint.h)
315# make `c++ @skia_compile_arguments.txt include/skia.h` work.
halcanaryd1c94a42015-11-30 12:42:58 -0800316set (skia_h_path ${userconfig_directory}/skia.h)
317file (WRITE ${skia_h_path} "// skia.h generated by CMake.\n")
318file(APPEND ${skia_h_path} "#ifndef skia_DEFINED\n")
319file(APPEND ${skia_h_path} "#define skia_DEFINED\n")
320foreach (include ${public_includes})
321 if (NOT include STREQUAL userconfig_directory)
322 file (APPEND ${skia_h_path} "\n")
323 file (GLOB all_public_headers ${include}/*.h)
324 foreach (public_header ${all_public_headers})
325 get_filename_component (filename_component ${public_header} NAME)
halcanary0cbe7ee2015-12-01 09:02:49 -0800326 if (NOT ";${bad_files};" MATCHES ";${filename_component};")
327 file (APPEND ${skia_h_path} "#include \"${filename_component}\"\n")
328 endif ()
halcanaryd1c94a42015-11-30 12:42:58 -0800329 endforeach()
330 endif()
331endforeach()
332file(APPEND ${skia_h_path} "\n#endif // skia_DEFINED\n")
333
mtkleine0f06a42015-08-28 11:51:06 -0700334# Now build a simple example app that uses Skia via libskia.so.
mtkleine0f06a42015-08-28 11:51:06 -0700335add_executable(example example.cpp)
336target_link_libraries(example skia ${OPENGL_LIBRARIES})