CMakeLists.txt 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  1. # CMakeLists.txt
  2. # Copyright (c) 2018-2019 Cosmin Truta
  3. # Copyright (c) 2007,2009-2018 Glenn Randers-Pehrson
  4. # Written by Christian Ehrlicher, 2007
  5. # Revised by Roger Lowman, 2009-2010
  6. # Revised by Clifford Yapp, 2011-2012,2017
  7. # Revised by Roger Leigh, 2016
  8. # Revised by Andreas Franek, 2016
  9. # Revised by Sam Serrels, 2017
  10. # Revised by Vadim Barkov, 2017
  11. # Revised by Vicky Pfau, 2018
  12. # Revised by Cameron Cawley, 2018
  13. # Revised by Cosmin Truta, 2018
  14. # Revised by Kyle Bentley, 2018
  15. # This code is released under the libpng license.
  16. # For conditions of distribution and use, see the disclaimer
  17. # and license in png.h
  18. cmake_minimum_required(VERSION 3.1)
  19. cmake_policy(VERSION 3.1)
  20. project(libpng C ASM)
  21. enable_testing()
  22. set(PNGLIB_MAJOR 1)
  23. set(PNGLIB_MINOR 6)
  24. set(PNGLIB_RELEASE 38)
  25. set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
  26. set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
  27. include(GNUInstallDirs)
  28. # needed packages
  29. # Allow users to specify location of Zlib.
  30. # Useful if zlib is being built alongside this as a sub-project.
  31. option(PNG_BUILD_ZLIB "Custom zlib Location, else find_package is used" OFF)
  32. if(NOT PNG_BUILD_ZLIB)
  33. find_package(ZLIB REQUIRED)
  34. include_directories(${ZLIB_INCLUDE_DIR})
  35. endif()
  36. if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU)
  37. find_library(M_LIBRARY m)
  38. else()
  39. # libm is not needed and/or not available
  40. set(M_LIBRARY "")
  41. endif()
  42. # COMMAND LINE OPTIONS
  43. option(PNG_SHARED "Build shared lib" ON)
  44. option(PNG_STATIC "Build static lib" ON)
  45. option(PNG_TESTS "Build libpng tests" ON)
  46. # Many more configuration options could be added here
  47. option(PNG_FRAMEWORK "Build OS X framework" OFF)
  48. option(PNG_DEBUG "Build with debug output" OFF)
  49. option(PNG_HARDWARE_OPTIMIZATIONS "Enable hardware optimizations" ON)
  50. set(PNG_PREFIX "" CACHE STRING "Prefix to add to the API function names")
  51. set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings")
  52. if(PNG_HARDWARE_OPTIMIZATIONS)
  53. # set definitions and sources for arm
  54. if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR
  55. CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
  56. set(PNG_ARM_NEON_POSSIBLE_VALUES check on off)
  57. set(PNG_ARM_NEON "check" CACHE STRING "Enable ARM NEON optimizations:
  58. check: (default) use internal checking code;
  59. off: disable the optimizations;
  60. on: turn on unconditionally.")
  61. set_property(CACHE PNG_ARM_NEON PROPERTY STRINGS
  62. ${PNG_ARM_NEON_POSSIBLE_VALUES})
  63. list(FIND PNG_ARM_NEON_POSSIBLE_VALUES ${PNG_ARM_NEON} index)
  64. if(index EQUAL -1)
  65. message(FATAL_ERROR
  66. "PNG_ARM_NEON must be one of [${PNG_ARM_NEON_POSSIBLE_VALUES}]")
  67. elseif(NOT ${PNG_ARM_NEON} STREQUAL "off")
  68. set(libpng_arm_sources
  69. arm/arm_init.c
  70. arm/filter_neon.S
  71. arm/filter_neon_intrinsics.c
  72. arm/palette_neon_intrinsics.c)
  73. if(${PNG_ARM_NEON} STREQUAL "on")
  74. add_definitions(-DPNG_ARM_NEON_OPT=2)
  75. elseif(${PNG_ARM_NEON} STREQUAL "check")
  76. add_definitions(-DPNG_ARM_NEON_CHECK_SUPPORTED)
  77. endif()
  78. else()
  79. add_definitions(-DPNG_ARM_NEON_OPT=0)
  80. endif()
  81. endif()
  82. # set definitions and sources for powerpc
  83. if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR
  84. CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*")
  85. set(PNG_POWERPC_VSX_POSSIBLE_VALUES on off)
  86. set(PNG_POWERPC_VSX "on" CACHE STRING "Enable POWERPC VSX optimizations:
  87. off: disable the optimizations.")
  88. set_property(CACHE PNG_POWERPC_VSX PROPERTY STRINGS
  89. ${PNG_POWERPC_VSX_POSSIBLE_VALUES})
  90. list(FIND PNG_POWERPC_VSX_POSSIBLE_VALUES ${PNG_POWERPC_VSX} index)
  91. if(index EQUAL -1)
  92. message(FATAL_ERROR
  93. "PNG_POWERPC_VSX must be one of [${PNG_POWERPC_VSX_POSSIBLE_VALUES}]")
  94. elseif(NOT ${PNG_POWERPC_VSX} STREQUAL "off")
  95. set(libpng_powerpc_sources
  96. powerpc/powerpc_init.c
  97. powerpc/filter_vsx_intrinsics.c)
  98. if(${PNG_POWERPC_VSX} STREQUAL "on")
  99. add_definitions(-DPNG_POWERPC_VSX_OPT=2)
  100. endif()
  101. else()
  102. add_definitions(-DPNG_POWERPC_VSX_OPT=0)
  103. endif()
  104. endif()
  105. # set definitions and sources for intel
  106. if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR
  107. CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*")
  108. set(PNG_INTEL_SSE_POSSIBLE_VALUES on off)
  109. set(PNG_INTEL_SSE "on" CACHE STRING "Enable INTEL_SSE optimizations:
  110. off: disable the optimizations")
  111. set_property(CACHE PNG_INTEL_SSE PROPERTY STRINGS
  112. ${PNG_INTEL_SSE_POSSIBLE_VALUES})
  113. list(FIND PNG_INTEL_SSE_POSSIBLE_VALUES ${PNG_INTEL_SSE} index)
  114. if(index EQUAL -1)
  115. message(FATAL_ERROR
  116. "PNG_INTEL_SSE must be one of [${PNG_INTEL_SSE_POSSIBLE_VALUES}]")
  117. elseif(NOT ${PNG_INTEL_SSE} STREQUAL "off")
  118. set(libpng_intel_sources
  119. intel/intel_init.c
  120. intel/filter_sse2_intrinsics.c)
  121. if(${PNG_INTEL_SSE} STREQUAL "on")
  122. add_definitions(-DPNG_INTEL_SSE_OPT=1)
  123. endif()
  124. else()
  125. add_definitions(-DPNG_INTEL_SSE_OPT=0)
  126. endif()
  127. endif()
  128. # set definitions and sources for MIPS
  129. if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR
  130. CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*")
  131. set(PNG_MIPS_MSA_POSSIBLE_VALUES on off)
  132. set(PNG_MIPS_MSA "on" CACHE STRING "Enable MIPS_MSA optimizations:
  133. off: disable the optimizations")
  134. set_property(CACHE PNG_MIPS_MSA PROPERTY STRINGS
  135. ${PNG_MIPS_MSA_POSSIBLE_VALUES})
  136. list(FIND PNG_MIPS_MSA_POSSIBLE_VALUES ${PNG_MIPS_MSA} index)
  137. if(index EQUAL -1)
  138. message(FATAL_ERROR
  139. "PNG_MIPS_MSA must be one of [${PNG_MIPS_MSA_POSSIBLE_VALUES}]")
  140. elseif(NOT ${PNG_MIPS_MSA} STREQUAL "off")
  141. set(libpng_mips_sources
  142. mips/mips_init.c
  143. mips/filter_msa_intrinsics.c)
  144. if(${PNG_MIPS_MSA} STREQUAL "on")
  145. add_definitions(-DPNG_MIPS_MSA_OPT=2)
  146. endif()
  147. else()
  148. add_definitions(-DPNG_MIPS_MSA_OPT=0)
  149. endif()
  150. endif()
  151. else(PNG_HARDWARE_OPTIMIZATIONS)
  152. # set definitions and sources for arm
  153. if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR
  154. CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
  155. add_definitions(-DPNG_ARM_NEON_OPT=0)
  156. endif()
  157. # set definitions and sources for powerpc
  158. if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR
  159. CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*")
  160. add_definitions(-DPNG_POWERPC_VSX_OPT=0)
  161. endif()
  162. # set definitions and sources for intel
  163. if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR
  164. CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*")
  165. add_definitions(-DPNG_INTEL_SSE_OPT=0)
  166. endif()
  167. # set definitions and sources for MIPS
  168. if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR
  169. CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*")
  170. add_definitions(-DPNG_MIPS_MSA_OPT=0)
  171. endif()
  172. endif(PNG_HARDWARE_OPTIMIZATIONS)
  173. # SET LIBNAME
  174. set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
  175. # to distinguish between debug and release lib
  176. set(CMAKE_DEBUG_POSTFIX "d")
  177. include(CheckCSourceCompiles)
  178. option(ld-version-script "Enable linker version script" ON)
  179. if(ld-version-script AND NOT APPLE)
  180. # Check if LD supports linker scripts.
  181. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" "VERS_1 {
  182. global: sym;
  183. local: *;
  184. };
  185. VERS_2 {
  186. global: sym2;
  187. main;
  188. } VERS_1;
  189. ")
  190. set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
  191. set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/conftest.map'")
  192. check_c_source_compiles("void sym(void) {}
  193. void sym2(void) {}
  194. int main(void) {return 0;}
  195. " HAVE_LD_VERSION_SCRIPT)
  196. if(NOT HAVE_LD_VERSION_SCRIPT)
  197. set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE} "-Wl,-M -Wl,${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
  198. check_c_source_compiles("void sym(void) {}
  199. void sym2(void) {}
  200. int main(void) {return 0;}
  201. " HAVE_SOLARIS_LD_VERSION_SCRIPT)
  202. endif()
  203. set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
  204. file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
  205. endif()
  206. # Find symbol prefix. Likely obsolete and unnecessary with recent
  207. # toolchains (it's not done in many other projects).
  208. function(symbol_prefix)
  209. set(SYMBOL_PREFIX)
  210. execute_process(COMMAND "${CMAKE_C_COMPILER}" "-E" "-"
  211. INPUT_FILE /dev/null
  212. OUTPUT_VARIABLE OUT
  213. RESULT_VARIABLE STATUS)
  214. if(CPP_FAIL)
  215. message(WARNING "Failed to run the C preprocessor")
  216. endif()
  217. string(REPLACE "\n" ";" OUT "${OUT}")
  218. foreach(line ${OUT})
  219. string(REGEX MATCH "^PREFIX=" found_match "${line}")
  220. if(found_match)
  221. string(REGEX REPLACE "^PREFIX=(.*\)" "\\1" prefix "${line}")
  222. string(REGEX MATCH "__USER_LABEL_PREFIX__" found_match "${prefix}")
  223. if(found_match)
  224. string(REGEX REPLACE "(.*)__USER_LABEL_PREFIX__(.*)" "\\1\\2" prefix "${prefix}")
  225. endif()
  226. set(SYMBOL_PREFIX "${prefix}")
  227. endif()
  228. endforeach()
  229. message(STATUS "Symbol prefix: ${SYMBOL_PREFIX}")
  230. set(SYMBOL_PREFIX "${SYMBOL_PREFIX}" PARENT_SCOPE)
  231. endfunction()
  232. if(UNIX)
  233. symbol_prefix()
  234. endif()
  235. find_program(AWK NAMES gawk awk)
  236. include_directories(${CMAKE_CURRENT_BINARY_DIR})
  237. if(NOT AWK OR ANDROID)
  238. # No awk available to generate sources; use pre-built pnglibconf.h
  239. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
  240. ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
  241. add_custom_target(genfiles) # Dummy
  242. else()
  243. include(CMakeParseArguments)
  244. # Generate .chk from .out with awk
  245. # generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
  246. function(generate_chk)
  247. set(options)
  248. set(oneValueArgs INPUT OUTPUT)
  249. set(multiValueArgs DEPENDS)
  250. cmake_parse_arguments(_GC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  251. if(NOT _GC_INPUT)
  252. message(FATAL_ERROR "generate_chk: Missing INPUT argument")
  253. endif()
  254. if(NOT _GC_OUTPUT)
  255. message(FATAL_ERROR "generate_chk: Missing OUTPUT argument")
  256. endif()
  257. add_custom_command(OUTPUT "${_GC_OUTPUT}"
  258. COMMAND "${CMAKE_COMMAND}"
  259. "-DINPUT=${_GC_INPUT}"
  260. "-DOUTPUT=${_GC_OUTPUT}"
  261. -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake"
  262. DEPENDS "${_GC_INPUT}" ${_GC_DEPENDS}
  263. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  264. endfunction()
  265. # Generate .out from .c with awk
  266. # generate_out(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
  267. function(generate_out)
  268. set(options)
  269. set(oneValueArgs INPUT OUTPUT)
  270. set(multiValueArgs DEPENDS)
  271. cmake_parse_arguments(_GO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  272. if(NOT _GO_INPUT)
  273. message(FATAL_ERROR "generate_out: Missing INPUT argument")
  274. endif()
  275. if(NOT _GO_OUTPUT)
  276. message(FATAL_ERROR "generate_out: Missing OUTPUT argument")
  277. endif()
  278. add_custom_command(OUTPUT "${_GO_OUTPUT}"
  279. COMMAND "${CMAKE_COMMAND}"
  280. "-DINPUT=${_GO_INPUT}"
  281. "-DOUTPUT=${_GO_OUTPUT}"
  282. -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake"
  283. DEPENDS "${_GO_INPUT}" ${_GO_DEPENDS}
  284. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  285. endfunction()
  286. # Generate specific source file with awk
  287. # generate_source(OUTPUT outputfile [DEPENDS dep1 [dep2...]])
  288. function(generate_source)
  289. set(options)
  290. set(oneValueArgs OUTPUT)
  291. set(multiValueArgs DEPENDS)
  292. cmake_parse_arguments(_GSO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  293. if(NOT _GSO_OUTPUT)
  294. message(FATAL_ERROR "generate_source: Missing OUTPUT argument")
  295. endif()
  296. add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_GSO_OUTPUT}"
  297. COMMAND "${CMAKE_COMMAND}"
  298. "-DOUTPUT=${_GSO_OUTPUT}"
  299. -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
  300. DEPENDS ${_GSO_DEPENDS}
  301. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  302. endfunction()
  303. # Copy file
  304. function(generate_copy source destination)
  305. add_custom_command(OUTPUT "${destination}"
  306. COMMAND "${CMAKE_COMMAND}" -E remove "${destination}"
  307. COMMAND "${CMAKE_COMMAND}" -E copy "${source}"
  308. "${destination}"
  309. DEPENDS "${source}")
  310. endfunction()
  311. # Generate scripts/pnglibconf.h
  312. generate_source(OUTPUT "scripts/pnglibconf.c"
  313. DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa"
  314. "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk"
  315. "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h")
  316. # Generate pnglibconf.c
  317. generate_source(OUTPUT "pnglibconf.c"
  318. DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa"
  319. "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk"
  320. "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h")
  321. if(PNG_PREFIX)
  322. set(PNGLIBCONF_H_EXTRA_DEPENDS
  323. "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
  324. "${CMAKE_CURRENT_SOURCE_DIR}/scripts/macro.lst")
  325. set(PNGPREFIX_H_EXTRA_DEPENDS
  326. "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out")
  327. endif()
  328. generate_out(INPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
  329. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out")
  330. # Generate pnglibconf.h
  331. generate_source(OUTPUT "pnglibconf.h"
  332. DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out"
  333. ${PNGLIBCONF_H_EXTRA_DEPENDS})
  334. generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/intprefix.c"
  335. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out"
  336. DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
  337. generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/prefix.c"
  338. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
  339. DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
  340. "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
  341. "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out")
  342. # Generate pngprefix.h
  343. generate_source(OUTPUT "pngprefix.h"
  344. DEPENDS ${PNGPREFIX_H_EXTRA_DEPENDS})
  345. generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/sym.c"
  346. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
  347. DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
  348. generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.c"
  349. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
  350. DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
  351. "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
  352. "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt")
  353. generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/vers.c"
  354. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
  355. DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
  356. "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
  357. "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
  358. generate_chk(INPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
  359. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"
  360. DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk"
  361. "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def")
  362. add_custom_target(symbol-check DEPENDS
  363. "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk")
  364. generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
  365. "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
  366. generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
  367. "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
  368. add_custom_target(genvers DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
  369. add_custom_target(gensym DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
  370. add_custom_target("genprebuilt"
  371. COMMAND "${CMAKE_COMMAND}"
  372. "-DOUTPUT=scripts/pnglibconf.h.prebuilt"
  373. -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
  374. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  375. # A single target handles generation of all generated files. If
  376. # they are depended upon separately by multiple targets, this
  377. # confuses parallel make (it would require a separate top-level
  378. # target for each file to track the dependencies properly).
  379. add_custom_target(genfiles DEPENDS
  380. "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym"
  381. "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers"
  382. "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
  383. "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
  384. "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out"
  385. "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h"
  386. "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out"
  387. "${CMAKE_CURRENT_BINARY_DIR}/scripts/pnglibconf.c"
  388. "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
  389. "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
  390. "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"
  391. "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
  392. "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out")
  393. endif(NOT AWK OR ANDROID)
  394. # OUR SOURCES
  395. set(libpng_public_hdrs
  396. png.h
  397. pngconf.h
  398. "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
  399. )
  400. set(libpng_private_hdrs
  401. pngpriv.h
  402. pngdebug.h
  403. pnginfo.h
  404. pngstruct.h
  405. )
  406. if(AWK AND NOT ANDROID)
  407. list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h")
  408. endif()
  409. set(libpng_sources
  410. ${libpng_public_hdrs}
  411. ${libpng_private_hdrs}
  412. png.c
  413. pngerror.c
  414. pngget.c
  415. pngmem.c
  416. pngpread.c
  417. pngread.c
  418. pngrio.c
  419. pngrtran.c
  420. pngrutil.c
  421. pngset.c
  422. pngtrans.c
  423. pngwio.c
  424. pngwrite.c
  425. pngwtran.c
  426. pngwutil.c
  427. ${libpng_arm_sources}
  428. ${libpng_intel_sources}
  429. ${libpng_mips_sources}
  430. ${libpng_powerpc_sources}
  431. )
  432. set(pngtest_sources
  433. pngtest.c
  434. )
  435. set(pngvalid_sources
  436. contrib/libtests/pngvalid.c
  437. )
  438. set(pngstest_sources
  439. contrib/libtests/pngstest.c
  440. )
  441. set(pngunknown_sources
  442. contrib/libtests/pngunknown.c
  443. )
  444. set(pngimage_sources
  445. contrib/libtests/pngimage.c
  446. )
  447. set(pngfix_sources
  448. contrib/tools/pngfix.c
  449. )
  450. set(png_fix_itxt_sources
  451. contrib/tools/png-fix-itxt.c
  452. )
  453. if(MSVC)
  454. add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
  455. endif()
  456. if(PNG_DEBUG)
  457. add_definitions(-DPNG_DEBUG)
  458. endif()
  459. # NOW BUILD OUR TARGET
  460. include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
  461. unset(PNG_LIB_TARGETS)
  462. if(PNG_SHARED)
  463. add_library(png SHARED ${libpng_sources})
  464. set(PNG_LIB_TARGETS png)
  465. set_target_properties(png PROPERTIES OUTPUT_NAME ${PNG_LIB_NAME})
  466. add_dependencies(png genfiles)
  467. if(MSVC)
  468. # msvc does not append 'lib' - do it here to have consistent name
  469. set_target_properties(png PROPERTIES PREFIX "lib")
  470. set_target_properties(png PROPERTIES IMPORT_PREFIX "lib")
  471. endif()
  472. target_link_libraries(png ${ZLIB_LIBRARY} ${M_LIBRARY})
  473. if(UNIX AND AWK)
  474. if(HAVE_LD_VERSION_SCRIPT)
  475. set_target_properties(png PROPERTIES LINK_FLAGS
  476. "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
  477. elseif(HAVE_SOLARIS_LD_VERSION_SCRIPT)
  478. set_target_properties(png PROPERTIES LINK_FLAGS
  479. "-Wl,-M -Wl,'${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
  480. endif()
  481. endif()
  482. endif()
  483. if(PNG_STATIC)
  484. # does not work without changing name
  485. set(PNG_LIB_NAME_STATIC png_static)
  486. add_library(png_static STATIC ${libpng_sources})
  487. add_dependencies(png_static genfiles)
  488. # MSVC doesn't use a different file extension for shared vs. static
  489. # libs. We are able to change OUTPUT_NAME to remove the _static
  490. # for all other platforms.
  491. if(NOT MSVC)
  492. set_target_properties(png_static PROPERTIES
  493. OUTPUT_NAME "${PNG_LIB_NAME}"
  494. CLEAN_DIRECT_OUTPUT 1)
  495. else()
  496. set_target_properties(png_static PROPERTIES
  497. OUTPUT_NAME "${PNG_LIB_NAME}_static"
  498. CLEAN_DIRECT_OUTPUT 1)
  499. endif()
  500. list(APPEND PNG_LIB_TARGETS png_static)
  501. if(MSVC)
  502. # msvc does not append 'lib' - do it here to have consistent name
  503. set_target_properties(png_static PROPERTIES PREFIX "lib")
  504. endif()
  505. target_link_libraries(png_static ${ZLIB_LIBRARY} ${M_LIBRARY})
  506. endif()
  507. if(PNG_FRAMEWORK)
  508. set(PNG_LIB_NAME_FRAMEWORK png_framework)
  509. add_library(png_framework SHARED ${libpng_sources})
  510. add_dependencies(png_framework genfiles)
  511. list(APPEND PNG_LIB_TARGETS png_framework)
  512. set_target_properties(png_framework PROPERTIES
  513. FRAMEWORK TRUE
  514. FRAMEWORK_VERSION ${PNGLIB_VERSION}
  515. MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PNGLIB_MAJOR}.${PNGLIB_MINOR}
  516. MACOSX_FRAMEWORK_BUNDLE_VERSION ${PNGLIB_VERSION}
  517. MACOSX_FRAMEWORK_IDENTIFIER org.libpng.libpng
  518. XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
  519. PUBLIC_HEADER "${libpng_public_hdrs}"
  520. OUTPUT_NAME png)
  521. target_link_libraries(png_framework ${ZLIB_LIBRARY} ${M_LIBRARY})
  522. endif()
  523. if(NOT PNG_LIB_TARGETS)
  524. message(SEND_ERROR
  525. "No library variant selected to build. "
  526. "Please enable at least one of the following options: "
  527. "PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")
  528. endif()
  529. if(PNG_SHARED AND WIN32)
  530. set_target_properties(png PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
  531. endif()
  532. function(png_add_test)
  533. set(options)
  534. set(oneValueArgs NAME COMMAND)
  535. set(multiValueArgs OPTIONS FILES)
  536. cmake_parse_arguments(_PAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  537. if(NOT _PAT_NAME)
  538. message(FATAL_ERROR "png_add_test: Missing NAME argument")
  539. endif()
  540. if(NOT _PAT_COMMAND)
  541. message(FATAL_ERROR "png_add_test: Missing COMMAND argument")
  542. endif()
  543. set(TEST_OPTIONS "${_PAT_OPTIONS}")
  544. set(TEST_FILES "${_PAT_FILES}")
  545. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in"
  546. "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake" @ONLY)
  547. add_test(NAME "${_PAT_NAME}"
  548. COMMAND "${CMAKE_COMMAND}"
  549. "-DLIBPNG=$<TARGET_FILE:png>"
  550. "-DTEST_COMMAND=$<TARGET_FILE:${_PAT_COMMAND}>"
  551. -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")
  552. endfunction()
  553. if(PNG_TESTS AND PNG_SHARED)
  554. # Find test PNG files by globbing, but sort lists to ensure
  555. # consistency between different filesystems.
  556. file(GLOB PNGSUITE_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/*.png")
  557. list(SORT PNGSUITE_PNGS)
  558. file(GLOB TEST_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/testpngs/*.png")
  559. list(SORT TEST_PNGS)
  560. set(PNGTEST_PNG "${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png")
  561. add_executable(pngtest ${pngtest_sources})
  562. target_link_libraries(pngtest png)
  563. png_add_test(NAME pngtest COMMAND pngtest FILES "${PNGTEST_PNG}")
  564. add_executable(pngvalid ${pngvalid_sources})
  565. target_link_libraries(pngvalid png)
  566. png_add_test(NAME pngvalid-gamma-16-to-8
  567. COMMAND pngvalid OPTIONS --gamma-16-to-8)
  568. png_add_test(NAME pngvalid-gamma-alpha-mode
  569. COMMAND pngvalid OPTIONS --gamma-alpha-mode)
  570. png_add_test(NAME pngvalid-gamma-background
  571. COMMAND pngvalid OPTIONS --gamma-background)
  572. png_add_test(NAME pngvalid-gamma-expand16-alpha-mode
  573. COMMAND pngvalid OPTIONS --gamma-alpha-mode --expand16)
  574. png_add_test(NAME pngvalid-gamma-expand16-background
  575. COMMAND pngvalid OPTIONS --gamma-background --expand16)
  576. png_add_test(NAME pngvalid-gamma-expand16-transform
  577. COMMAND pngvalid OPTIONS --gamma-transform --expand16)
  578. png_add_test(NAME pngvalid-gamma-sbit
  579. COMMAND pngvalid OPTIONS --gamma-sbit)
  580. png_add_test(NAME pngvalid-gamma-threshold
  581. COMMAND pngvalid OPTIONS --gamma-threshold)
  582. png_add_test(NAME pngvalid-gamma-transform
  583. COMMAND pngvalid OPTIONS --gamma-transform)
  584. png_add_test(NAME pngvalid-progressive-interlace-standard
  585. COMMAND pngvalid OPTIONS --standard --progressive-read --interlace)
  586. png_add_test(NAME pngvalid-progressive-size
  587. COMMAND pngvalid OPTIONS --size --progressive-read)
  588. png_add_test(NAME pngvalid-progressive-standard
  589. COMMAND pngvalid OPTIONS --standard --progressive-read)
  590. png_add_test(NAME pngvalid-standard
  591. COMMAND pngvalid OPTIONS --standard)
  592. png_add_test(NAME pngvalid-transform
  593. COMMAND pngvalid OPTIONS --transform)
  594. add_executable(pngstest ${pngstest_sources})
  595. target_link_libraries(pngstest png)
  596. foreach(gamma_type 1.8 linear none sRGB)
  597. foreach(alpha_type none alpha)
  598. set(PNGSTEST_FILES)
  599. foreach(test_png ${TEST_PNGS})
  600. string(REGEX MATCH ".*-linear[-.].*" TEST_PNG_LINEAR "${test_png}")
  601. string(REGEX MATCH ".*-sRGB[-.].*" TEST_PNG_SRGB "${test_png}")
  602. string(REGEX MATCH ".*-1.8[-.].*" TEST_PNG_G18 "${test_png}")
  603. string(REGEX MATCH ".*-alpha-.*" TEST_PNG_ALPHA "${test_png}")
  604. set(TEST_PNG_VALID TRUE)
  605. if(TEST_PNG_ALPHA)
  606. if(NOT "${alpha_type}" STREQUAL "alpha")
  607. set(TEST_PNG_VALID FALSE)
  608. endif()
  609. else()
  610. if("${alpha_type}" STREQUAL "alpha")
  611. set(TEST_PNG_VALID FALSE)
  612. endif()
  613. endif()
  614. if(TEST_PNG_LINEAR)
  615. if(NOT "${gamma_type}" STREQUAL "linear")
  616. set(TEST_PNG_VALID FALSE)
  617. endif()
  618. elseif(TEST_PNG_SRGB)
  619. if(NOT "${gamma_type}" STREQUAL "sRGB")
  620. set(TEST_PNG_VALID FALSE)
  621. endif()
  622. elseif(TEST_PNG_G18)
  623. if(NOT "${gamma_type}" STREQUAL "1.8")
  624. set(TEST_PNG_VALID FALSE)
  625. endif()
  626. else()
  627. if(NOT "${gamma_type}" STREQUAL "none")
  628. set(TEST_PNG_VALID FALSE)
  629. endif()
  630. endif()
  631. if(TEST_PNG_VALID)
  632. list(APPEND PNGSTEST_FILES "${test_png}")
  633. endif()
  634. endforeach()
  635. # Should already be sorted, but sort anyway to be certain.
  636. list(SORT PNGSTEST_FILES)
  637. png_add_test(NAME pngstest-${gamma_type}-${alpha_type}
  638. COMMAND pngstest
  639. OPTIONS --tmpfile "${gamma_type}-${alpha_type}-" --log
  640. FILES ${PNGSTEST_FILES})
  641. endforeach()
  642. endforeach()
  643. add_executable(pngunknown ${pngunknown_sources})
  644. target_link_libraries(pngunknown png)
  645. png_add_test(NAME pngunknown-discard COMMAND pngunknown OPTIONS --strict default=discard FILES "${PNGTEST_PNG}")
  646. png_add_test(NAME pngunknown-IDAT COMMAND pngunknown OPTIONS --strict default=discard IDAT=save FILES "${PNGTEST_PNG}")
  647. png_add_test(NAME pngunknown-if-safe COMMAND pngunknown OPTIONS --strict default=if-safe FILES "${PNGTEST_PNG}")
  648. png_add_test(NAME pngunknown-sAPI COMMAND pngunknown OPTIONS --strict bKGD=save cHRM=save gAMA=save all=discard iCCP=save sBIT=save sRGB=save FILES "${PNGTEST_PNG}")
  649. png_add_test(NAME pngunknown-save COMMAND pngunknown OPTIONS --strict default=save FILES "${PNGTEST_PNG}")
  650. png_add_test(NAME pngunknown-sTER COMMAND pngunknown OPTIONS --strict sTER=if-safe FILES "${PNGTEST_PNG}")
  651. png_add_test(NAME pngunknown-vpAg COMMAND pngunknown OPTIONS --strict vpAg=if-safe FILES "${PNGTEST_PNG}")
  652. add_executable(pngimage ${pngimage_sources})
  653. target_link_libraries(pngimage png)
  654. png_add_test(NAME pngimage-quick COMMAND pngimage OPTIONS --list-combos --log FILES ${PNGSUITE_PNGS})
  655. png_add_test(NAME pngimage-full COMMAND pngimage OPTIONS --exhaustive --list-combos --log FILES ${PNGSUITE_PNGS})
  656. endif()
  657. if(PNG_SHARED)
  658. add_executable(pngfix ${pngfix_sources})
  659. target_link_libraries(pngfix png)
  660. set(PNG_BIN_TARGETS pngfix)
  661. add_executable(png-fix-itxt ${png_fix_itxt_sources})
  662. target_link_libraries(png-fix-itxt ${ZLIB_LIBRARY} ${M_LIBRARY})
  663. list(APPEND PNG_BIN_TARGETS png-fix-itxt)
  664. endif()
  665. # Set a variable with CMake code which:
  666. # Creates a symlink from src to dest (if possible) or alternatively
  667. # copies if different.
  668. include(CMakeParseArguments)
  669. function(create_symlink DEST_FILE)
  670. cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN})
  671. if(NOT S_TARGET AND NOT S_FILE)
  672. message(FATAL_ERROR "create_symlink: Missing TARGET or FILE argument")
  673. endif()
  674. if(S_TARGET AND S_FILE)
  675. message(FATAL_ERROR "create_symlink: Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; can only have one.")
  676. endif()
  677. if(S_FILE)
  678. # If we don't need to symlink something that's coming from a build target,
  679. # we can go ahead and symlink/copy at configure time.
  680. if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
  681. execute_process(
  682. COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${S_FILE} ${DEST_FILE}
  683. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  684. else()
  685. execute_process(
  686. COMMAND ${CMAKE_COMMAND} -E create_symlink ${S_FILE} ${DEST_FILE}
  687. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  688. endif()
  689. endif()
  690. if(S_TARGET)
  691. # We need to use generator expressions, which can be a bit tricky, so for
  692. # simplicity make the symlink a POST_BUILD step and use the TARGET
  693. # signature of add_custom_command.
  694. if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
  695. add_custom_command(TARGET ${S_TARGET} POST_BUILD
  696. COMMAND "${CMAKE_COMMAND}" -E copy_if_different $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
  697. else()
  698. add_custom_command(TARGET ${S_TARGET} POST_BUILD
  699. COMMAND "${CMAKE_COMMAND}" -E create_symlink $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
  700. endif()
  701. endif()
  702. endfunction()
  703. # Create source generation scripts.
  704. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in
  705. ${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake @ONLY)
  706. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in
  707. ${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake @ONLY)
  708. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in
  709. ${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake @ONLY)
  710. # libpng is a library so default to 'lib'
  711. if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
  712. set(CMAKE_INSTALL_LIBDIR lib)
  713. endif()
  714. # CREATE PKGCONFIG FILES
  715. # We use the same files like ./configure, so we have to set its vars.
  716. # Only do this on Windows for Cygwin - the files don't make much sense outside
  717. # of a UNIX look-alike.
  718. if(NOT WIN32 OR CYGWIN OR MINGW)
  719. set(prefix ${CMAKE_INSTALL_PREFIX})
  720. set(exec_prefix ${CMAKE_INSTALL_PREFIX})
  721. set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
  722. set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
  723. set(LIBS "-lz -lm")
  724. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
  725. ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
  726. create_symlink(libpng.pc FILE ${PNGLIB_NAME}.pc)
  727. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
  728. ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
  729. create_symlink(libpng-config FILE ${PNGLIB_NAME}-config)
  730. endif()
  731. # SET UP LINKS
  732. if(PNG_SHARED)
  733. set_target_properties(png PROPERTIES
  734. VERSION 16.${PNGLIB_RELEASE}.git
  735. # VERSION 16.${PNGLIB_RELEASE}.0
  736. SOVERSION 16
  737. CLEAN_DIRECT_OUTPUT 1)
  738. endif()
  739. # INSTALL
  740. if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
  741. install(TARGETS ${PNG_LIB_TARGETS}
  742. EXPORT libpng
  743. RUNTIME DESTINATION bin
  744. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  745. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  746. FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})
  747. if(PNG_SHARED)
  748. # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
  749. if(CYGWIN OR MINGW)
  750. create_symlink(libpng${CMAKE_IMPORT_LIBRARY_SUFFIX} TARGET png)
  751. install(FILES $<TARGET_LINKER_FILE_DIR:png>/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
  752. DESTINATION ${CMAKE_INSTALL_LIBDIR})
  753. endif()
  754. if(NOT WIN32)
  755. create_symlink(libpng${CMAKE_SHARED_LIBRARY_SUFFIX} TARGET png)
  756. install(FILES $<TARGET_LINKER_FILE_DIR:png>/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
  757. DESTINATION ${CMAKE_INSTALL_LIBDIR})
  758. endif()
  759. endif()
  760. if(PNG_STATIC)
  761. if(NOT WIN32 OR CYGWIN OR MINGW)
  762. create_symlink(libpng${CMAKE_STATIC_LIBRARY_SUFFIX} TARGET png_static)
  763. install(FILES $<TARGET_LINKER_FILE_DIR:png_static>/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
  764. DESTINATION ${CMAKE_INSTALL_LIBDIR})
  765. endif()
  766. endif()
  767. endif()
  768. if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
  769. install(FILES ${libpng_public_hdrs} DESTINATION include)
  770. install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME})
  771. endif()
  772. if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL)
  773. if(NOT WIN32 OR CYGWIN OR MINGW)
  774. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
  775. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config DESTINATION bin)
  776. endif()
  777. endif()
  778. if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL)
  779. install(TARGETS ${PNG_BIN_TARGETS}
  780. RUNTIME DESTINATION bin)
  781. endif()
  782. if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL)
  783. # Install man pages
  784. if(NOT PNG_MAN_DIR)
  785. set(PNG_MAN_DIR "share/man")
  786. endif()
  787. install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)
  788. install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)
  789. # Install pkg-config files
  790. if(NOT CMAKE_HOST_WIN32 OR CYGWIN OR MINGW)
  791. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
  792. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  793. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
  794. DESTINATION bin)
  795. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
  796. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  797. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
  798. DESTINATION bin)
  799. endif()
  800. endif()
  801. # Create an export file that CMake users can include() to import our targets.
  802. if(NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL)
  803. install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
  804. endif()
  805. # what's with libpng-manual.txt and all the extra files?
  806. # UNINSTALL
  807. # do we need this?
  808. # DIST
  809. # do we need this?
  810. # to create msvc import lib for mingw compiled shared lib
  811. # pexports libpng.dll > libpng.def
  812. # lib /def:libpng.def /machine:x86