CMakeLists.txt 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. # CMakeLists.txt
  2. # Copyright (C) 2018 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 37)
  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" ON)
  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. "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
  397. "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
  398. "${CMAKE_CURRENT_SOURCE_DIR}/pnglibconf.h"
  399. PARENT_SCOPE
  400. )
  401. set(libpng_private_hdrs
  402. pngpriv.h
  403. pngdebug.h
  404. pnginfo.h
  405. pngstruct.h
  406. )
  407. if(AWK AND NOT ANDROID)
  408. list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h")
  409. endif()
  410. set(libpng_sources
  411. ${libpng_public_hdrs}
  412. ${libpng_private_hdrs}
  413. png.c
  414. pngerror.c
  415. pngget.c
  416. pngmem.c
  417. pngpread.c
  418. pngread.c
  419. pngrio.c
  420. pngrtran.c
  421. pngrutil.c
  422. pngset.c
  423. pngtrans.c
  424. pngwio.c
  425. pngwrite.c
  426. pngwtran.c
  427. pngwutil.c
  428. ${libpng_arm_sources}
  429. ${libpng_intel_sources}
  430. ${libpng_mips_sources}
  431. ${libpng_powerpc_sources}
  432. )
  433. set(pngtest_sources
  434. pngtest.c
  435. )
  436. set(pngvalid_sources
  437. contrib/libtests/pngvalid.c
  438. )
  439. set(pngstest_sources
  440. contrib/libtests/pngstest.c
  441. )
  442. set(pngunknown_sources
  443. contrib/libtests/pngunknown.c
  444. )
  445. set(pngimage_sources
  446. contrib/libtests/pngimage.c
  447. )
  448. set(pngfix_sources
  449. contrib/tools/pngfix.c
  450. )
  451. set(png_fix_itxt_sources
  452. contrib/tools/png-fix-itxt.c
  453. )
  454. if(MSVC)
  455. add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
  456. endif()
  457. if(PNG_DEBUG)
  458. add_definitions(-DPNG_DEBUG)
  459. endif()
  460. # NOW BUILD OUR TARGET
  461. include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
  462. unset(PNG_LIB_TARGETS)
  463. if(PNG_SHARED)
  464. add_library(png SHARED ${libpng_sources})
  465. set(PNG_LIB_TARGETS png)
  466. set_target_properties(png PROPERTIES OUTPUT_NAME ${PNG_LIB_NAME})
  467. add_dependencies(png genfiles)
  468. if(MSVC)
  469. # msvc does not append 'lib' - do it here to have consistent name
  470. set_target_properties(png PROPERTIES PREFIX "lib")
  471. set_target_properties(png PROPERTIES IMPORT_PREFIX "lib")
  472. endif()
  473. target_link_libraries(png ${ZLIB_LIBRARY} ${M_LIBRARY})
  474. if(UNIX AND AWK)
  475. if(HAVE_LD_VERSION_SCRIPT)
  476. set_target_properties(png PROPERTIES LINK_FLAGS
  477. "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
  478. elseif(HAVE_SOLARIS_LD_VERSION_SCRIPT)
  479. set_target_properties(png PROPERTIES LINK_FLAGS
  480. "-Wl,-M -Wl,'${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
  481. endif()
  482. endif()
  483. endif()
  484. if(PNG_STATIC)
  485. # does not work without changing name
  486. set(PNG_LIB_NAME_STATIC png_static)
  487. add_library(png_static STATIC ${libpng_sources})
  488. add_dependencies(png_static genfiles)
  489. # MSVC doesn't use a different file extension for shared vs. static
  490. # libs. We are able to change OUTPUT_NAME to remove the _static
  491. # for all other platforms.
  492. if(NOT MSVC)
  493. set_target_properties(png_static PROPERTIES
  494. OUTPUT_NAME "${PNG_LIB_NAME}"
  495. CLEAN_DIRECT_OUTPUT 1)
  496. else()
  497. set_target_properties(png_static PROPERTIES
  498. OUTPUT_NAME "${PNG_LIB_NAME}_static"
  499. CLEAN_DIRECT_OUTPUT 1)
  500. endif()
  501. list(APPEND PNG_LIB_TARGETS png_static)
  502. if(MSVC)
  503. # msvc does not append 'lib' - do it here to have consistent name
  504. set_target_properties(png_static PROPERTIES PREFIX "lib")
  505. endif()
  506. target_link_libraries(png_static ${ZLIB_LIBRARY} ${M_LIBRARY})
  507. endif()
  508. if(PNG_FRAMEWORK)
  509. set(PNG_LIB_NAME_FRAMEWORK png_framework)
  510. add_library(png_framework SHARED ${libpng_sources})
  511. add_dependencies(png_framework genfiles)
  512. list(APPEND PNG_LIB_TARGETS png_framework)
  513. set_target_properties(png_framework PROPERTIES
  514. FRAMEWORK TRUE
  515. FRAMEWORK_VERSION ${PNGLIB_VERSION}
  516. MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PNGLIB_MAJOR}.${PNGLIB_MINOR}
  517. MACOSX_FRAMEWORK_BUNDLE_VERSION ${PNGLIB_VERSION}
  518. MACOSX_FRAMEWORK_IDENTIFIER org.libpng.libpng
  519. XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
  520. PUBLIC_HEADER "${libpng_public_hdrs}"
  521. OUTPUT_NAME png)
  522. target_link_libraries(png_framework ${ZLIB_LIBRARY} ${M_LIBRARY})
  523. endif()
  524. if(NOT PNG_LIB_TARGETS)
  525. message(SEND_ERROR
  526. "No library variant selected to build. "
  527. "Please enable at least one of the following options: "
  528. "PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")
  529. endif()
  530. if(PNG_SHARED AND WIN32)
  531. set_target_properties(png PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
  532. endif()
  533. function(png_add_test)
  534. set(options)
  535. set(oneValueArgs NAME COMMAND)
  536. set(multiValueArgs OPTIONS FILES)
  537. cmake_parse_arguments(_PAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  538. if(NOT _PAT_NAME)
  539. message(FATAL_ERROR "png_add_test: Missing NAME argument")
  540. endif()
  541. if(NOT _PAT_COMMAND)
  542. message(FATAL_ERROR "png_add_test: Missing COMMAND argument")
  543. endif()
  544. set(TEST_OPTIONS "${_PAT_OPTIONS}")
  545. set(TEST_FILES "${_PAT_FILES}")
  546. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in"
  547. "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake" @ONLY)
  548. add_test(NAME "${_PAT_NAME}"
  549. COMMAND "${CMAKE_COMMAND}"
  550. "-DLIBPNG=$<TARGET_FILE:png>"
  551. "-DTEST_COMMAND=$<TARGET_FILE:${_PAT_COMMAND}>"
  552. -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")
  553. endfunction()
  554. if(PNG_TESTS AND PNG_SHARED)
  555. # Find test PNG files by globbing, but sort lists to ensure
  556. # consistency between different filesystems.
  557. file(GLOB PNGSUITE_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/*.png")
  558. list(SORT PNGSUITE_PNGS)
  559. file(GLOB TEST_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/testpngs/*.png")
  560. list(SORT TEST_PNGS)
  561. set(PNGTEST_PNG "${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png")
  562. add_executable(pngtest ${pngtest_sources})
  563. target_link_libraries(pngtest png)
  564. png_add_test(NAME pngtest COMMAND pngtest FILES "${PNGTEST_PNG}")
  565. add_executable(pngvalid ${pngvalid_sources})
  566. target_link_libraries(pngvalid png)
  567. png_add_test(NAME pngvalid-gamma-16-to-8
  568. COMMAND pngvalid OPTIONS --gamma-16-to-8)
  569. png_add_test(NAME pngvalid-gamma-alpha-mode
  570. COMMAND pngvalid OPTIONS --gamma-alpha-mode)
  571. png_add_test(NAME pngvalid-gamma-background
  572. COMMAND pngvalid OPTIONS --gamma-background)
  573. png_add_test(NAME pngvalid-gamma-expand16-alpha-mode
  574. COMMAND pngvalid OPTIONS --gamma-alpha-mode --expand16)
  575. png_add_test(NAME pngvalid-gamma-expand16-background
  576. COMMAND pngvalid OPTIONS --gamma-background --expand16)
  577. png_add_test(NAME pngvalid-gamma-expand16-transform
  578. COMMAND pngvalid OPTIONS --gamma-transform --expand16)
  579. png_add_test(NAME pngvalid-gamma-sbit
  580. COMMAND pngvalid OPTIONS --gamma-sbit)
  581. png_add_test(NAME pngvalid-gamma-threshold
  582. COMMAND pngvalid OPTIONS --gamma-threshold)
  583. png_add_test(NAME pngvalid-gamma-transform
  584. COMMAND pngvalid OPTIONS --gamma-transform)
  585. png_add_test(NAME pngvalid-progressive-interlace-standard
  586. COMMAND pngvalid OPTIONS --standard --progressive-read --interlace)
  587. png_add_test(NAME pngvalid-progressive-size
  588. COMMAND pngvalid OPTIONS --size --progressive-read)
  589. png_add_test(NAME pngvalid-progressive-standard
  590. COMMAND pngvalid OPTIONS --standard --progressive-read)
  591. png_add_test(NAME pngvalid-standard
  592. COMMAND pngvalid OPTIONS --standard)
  593. png_add_test(NAME pngvalid-transform
  594. COMMAND pngvalid OPTIONS --transform)
  595. add_executable(pngstest ${pngstest_sources})
  596. target_link_libraries(pngstest png)
  597. foreach(gamma_type 1.8 linear none sRGB)
  598. foreach(alpha_type none alpha)
  599. set(PNGSTEST_FILES)
  600. foreach(test_png ${TEST_PNGS})
  601. string(REGEX MATCH ".*-linear[-.].*" TEST_PNG_LINEAR "${test_png}")
  602. string(REGEX MATCH ".*-sRGB[-.].*" TEST_PNG_SRGB "${test_png}")
  603. string(REGEX MATCH ".*-1.8[-.].*" TEST_PNG_G18 "${test_png}")
  604. string(REGEX MATCH ".*-alpha-.*" TEST_PNG_ALPHA "${test_png}")
  605. set(TEST_PNG_VALID TRUE)
  606. if(TEST_PNG_ALPHA)
  607. if(NOT "${alpha_type}" STREQUAL "alpha")
  608. set(TEST_PNG_VALID FALSE)
  609. endif()
  610. else()
  611. if("${alpha_type}" STREQUAL "alpha")
  612. set(TEST_PNG_VALID FALSE)
  613. endif()
  614. endif()
  615. if(TEST_PNG_LINEAR)
  616. if(NOT "${gamma_type}" STREQUAL "linear")
  617. set(TEST_PNG_VALID FALSE)
  618. endif()
  619. elseif(TEST_PNG_SRGB)
  620. if(NOT "${gamma_type}" STREQUAL "sRGB")
  621. set(TEST_PNG_VALID FALSE)
  622. endif()
  623. elseif(TEST_PNG_G18)
  624. if(NOT "${gamma_type}" STREQUAL "1.8")
  625. set(TEST_PNG_VALID FALSE)
  626. endif()
  627. else()
  628. if(NOT "${gamma_type}" STREQUAL "none")
  629. set(TEST_PNG_VALID FALSE)
  630. endif()
  631. endif()
  632. if(TEST_PNG_VALID)
  633. list(APPEND PNGSTEST_FILES "${test_png}")
  634. endif()
  635. endforeach()
  636. # Should already be sorted, but sort anyway to be certain.
  637. list(SORT PNGSTEST_FILES)
  638. png_add_test(NAME pngstest-${gamma_type}-${alpha_type}
  639. COMMAND pngstest
  640. OPTIONS --tmpfile "${gamma_type}-${alpha_type}-" --log
  641. FILES ${PNGSTEST_FILES})
  642. endforeach()
  643. endforeach()
  644. add_executable(pngunknown ${pngunknown_sources})
  645. target_link_libraries(pngunknown png)
  646. png_add_test(NAME pngunknown-discard COMMAND pngunknown OPTIONS --strict default=discard FILES "${PNGTEST_PNG}")
  647. png_add_test(NAME pngunknown-IDAT COMMAND pngunknown OPTIONS --strict default=discard IDAT=save FILES "${PNGTEST_PNG}")
  648. png_add_test(NAME pngunknown-if-safe COMMAND pngunknown OPTIONS --strict default=if-safe FILES "${PNGTEST_PNG}")
  649. 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}")
  650. png_add_test(NAME pngunknown-save COMMAND pngunknown OPTIONS --strict default=save FILES "${PNGTEST_PNG}")
  651. png_add_test(NAME pngunknown-sTER COMMAND pngunknown OPTIONS --strict sTER=if-safe FILES "${PNGTEST_PNG}")
  652. png_add_test(NAME pngunknown-vpAg COMMAND pngunknown OPTIONS --strict vpAg=if-safe FILES "${PNGTEST_PNG}")
  653. add_executable(pngimage ${pngimage_sources})
  654. target_link_libraries(pngimage png)
  655. png_add_test(NAME pngimage-quick COMMAND pngimage OPTIONS --list-combos --log FILES ${PNGSUITE_PNGS})
  656. png_add_test(NAME pngimage-full COMMAND pngimage OPTIONS --exhaustive --list-combos --log FILES ${PNGSUITE_PNGS})
  657. endif()
  658. if(PNG_SHARED)
  659. add_executable(pngfix ${pngfix_sources})
  660. target_link_libraries(pngfix png)
  661. set(PNG_BIN_TARGETS pngfix)
  662. add_executable(png-fix-itxt ${png_fix_itxt_sources})
  663. target_link_libraries(png-fix-itxt ${ZLIB_LIBRARY} ${M_LIBRARY})
  664. list(APPEND PNG_BIN_TARGETS png-fix-itxt)
  665. endif()
  666. # Set a variable with CMake code which:
  667. # Creates a symlink from src to dest (if possible) or alternatively
  668. # copies if different.
  669. include(CMakeParseArguments)
  670. function(create_symlink DEST_FILE)
  671. cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN})
  672. if(NOT S_TARGET AND NOT S_FILE)
  673. message(FATAL_ERROR "create_symlink: Missing TARGET or FILE argument")
  674. endif()
  675. if(S_TARGET AND S_FILE)
  676. message(FATAL_ERROR "create_symlink: Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; can only have one.")
  677. endif()
  678. if(S_FILE)
  679. # If we don't need to symlink something that's coming from a build target,
  680. # we can go ahead and symlink/copy at configure time.
  681. if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
  682. execute_process(
  683. COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${S_FILE} ${DEST_FILE}
  684. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  685. else()
  686. execute_process(
  687. COMMAND ${CMAKE_COMMAND} -E create_symlink ${S_FILE} ${DEST_FILE}
  688. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  689. endif()
  690. endif()
  691. if(S_TARGET)
  692. # We need to use generator expressions, which can be a bit tricky, so for
  693. # simplicity make the symlink a POST_BUILD step and use the TARGET
  694. # signature of add_custom_command.
  695. if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
  696. add_custom_command(TARGET ${S_TARGET} POST_BUILD
  697. COMMAND "${CMAKE_COMMAND}" -E copy_if_different $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
  698. else()
  699. add_custom_command(TARGET ${S_TARGET} POST_BUILD
  700. COMMAND "${CMAKE_COMMAND}" -E create_symlink $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
  701. endif()
  702. endif()
  703. endfunction()
  704. # Create source generation scripts.
  705. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in
  706. ${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake @ONLY)
  707. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in
  708. ${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake @ONLY)
  709. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in
  710. ${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake @ONLY)
  711. # libpng is a library so default to 'lib'
  712. if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
  713. set(CMAKE_INSTALL_LIBDIR lib)
  714. endif()
  715. # CREATE PKGCONFIG FILES
  716. # We use the same files like ./configure, so we have to set its vars.
  717. # Only do this on Windows for Cygwin - the files don't make much sense outside
  718. # of a UNIX look-alike.
  719. if(NOT WIN32 OR CYGWIN OR MINGW)
  720. set(prefix ${CMAKE_INSTALL_PREFIX})
  721. set(exec_prefix ${CMAKE_INSTALL_PREFIX})
  722. set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
  723. set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
  724. set(LIBS "-lz -lm")
  725. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
  726. ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
  727. create_symlink(libpng.pc FILE ${PNGLIB_NAME}.pc)
  728. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
  729. ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
  730. create_symlink(libpng-config FILE ${PNGLIB_NAME}-config)
  731. endif()
  732. # SET UP LINKS
  733. if(PNG_SHARED)
  734. set_target_properties(png PROPERTIES
  735. # VERSION 16.${PNGLIB_RELEASE}.1.6.37
  736. VERSION 16.${PNGLIB_RELEASE}.0
  737. SOVERSION 16
  738. CLEAN_DIRECT_OUTPUT 1)
  739. endif()
  740. # INSTALL
  741. if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
  742. install(TARGETS ${PNG_LIB_TARGETS}
  743. EXPORT libpng
  744. RUNTIME DESTINATION bin
  745. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  746. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  747. FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})
  748. if(PNG_SHARED)
  749. # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
  750. if(CYGWIN OR MINGW)
  751. create_symlink(libpng${CMAKE_IMPORT_LIBRARY_SUFFIX} TARGET png)
  752. install(FILES $<TARGET_LINKER_FILE_DIR:png>/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
  753. DESTINATION ${CMAKE_INSTALL_LIBDIR})
  754. endif()
  755. if(NOT WIN32)
  756. create_symlink(libpng${CMAKE_SHARED_LIBRARY_SUFFIX} TARGET png)
  757. install(FILES $<TARGET_LINKER_FILE_DIR:png>/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
  758. DESTINATION ${CMAKE_INSTALL_LIBDIR})
  759. endif()
  760. endif()
  761. if(PNG_STATIC)
  762. if(NOT WIN32 OR CYGWIN OR MINGW)
  763. create_symlink(libpng${CMAKE_STATIC_LIBRARY_SUFFIX} TARGET png_static)
  764. install(FILES $<TARGET_LINKER_FILE_DIR:png_static>/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
  765. DESTINATION ${CMAKE_INSTALL_LIBDIR})
  766. endif()
  767. endif()
  768. endif()
  769. if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
  770. install(FILES ${libpng_public_hdrs} DESTINATION include)
  771. install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME})
  772. endif()
  773. if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL)
  774. if(NOT WIN32 OR CYGWIN OR MINGW)
  775. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
  776. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config DESTINATION bin)
  777. endif()
  778. endif()
  779. if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL)
  780. install(TARGETS ${PNG_BIN_TARGETS}
  781. RUNTIME DESTINATION bin)
  782. endif()
  783. if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL)
  784. # Install man pages
  785. if(NOT PNG_MAN_DIR)
  786. set(PNG_MAN_DIR "share/man")
  787. endif()
  788. install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)
  789. install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)
  790. # Install pkg-config files
  791. if(NOT CMAKE_HOST_WIN32 OR CYGWIN OR MINGW)
  792. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
  793. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  794. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
  795. DESTINATION bin)
  796. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
  797. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  798. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
  799. DESTINATION bin)
  800. endif()
  801. endif()
  802. # Create an export file that CMake users can include() to import our targets.
  803. if(NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL)
  804. install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
  805. endif()
  806. # what's with libpng-manual.txt and all the extra files?
  807. # UNINSTALL
  808. # do we need this?
  809. # DIST
  810. # do we need this?
  811. # to create msvc import lib for mingw compiled shared lib
  812. # pexports libpng.dll > libpng.def
  813. # lib /def:libpng.def /machine:x86