2010-11-24 14:30:16 -08:00
cmake_minimum_required ( VERSION 2.4.4 )
2010-07-18 03:26:41 -07:00
set ( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true )
if ( UNIX AND NOT DEFINED CMAKE_BUILD_TYPE )
2010-11-24 14:30:16 -08:00
if ( CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION EQUAL 4 )
# workaround CMake 2.4.x bug
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." )
else ( )
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
" C h o o s e t h e t y p e o f b u i l d , o p t i o n s a r e :
None ( CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used )
D e b u g
R e l e a s e
R e l W i t h D e b I n f o
M i n S i z e R e l . " )
endif ( )
2010-07-18 03:26:41 -07:00
endif ( )
project ( libpng C )
enable_testing ( )
# Copyright (C) 2007-2010 Glenn Randers-Pehrson
# This code is released under the libpng license.
# For conditions of distribution and use, see the disclaimer
# and license in png.h
set ( PNGLIB_MAJOR 1 )
set ( PNGLIB_MINOR 4 )
2010-11-24 14:30:16 -08:00
set ( PNGLIB_RELEASE 4 )
2010-07-18 03:26:41 -07:00
set ( PNGLIB_NAME libpng ${ PNGLIB_MAJOR } ${ PNGLIB_MINOR } )
set ( PNGLIB_VERSION ${ PNGLIB_MAJOR } . ${ PNGLIB_MINOR } . ${ PNGLIB_RELEASE } )
# needed packages
find_package ( ZLIB REQUIRED )
include_directories ( ${ ZLIB_INCLUDE_DIR } )
if ( NOT WIN32 )
find_library ( M_LIBRARY
N A M E S m
P A T H S / u s r / l i b / u s r / l o c a l / l i b
)
if ( NOT M_LIBRARY )
message ( STATUS
" m a t h l i b r a r y ' l i b m ' n o t f o u n d - f l o a t i n g p o i n t s u p p o r t d i s a b l e d " )
endif ( )
else ( )
# not needed on windows
set ( M_LIBRARY "" )
endif ( )
# COMMAND LINE OPTIONS
if ( DEFINED PNG_SHARED )
option ( PNG_SHARED "Build shared lib" ${ PNG_SHARED } )
else ( )
option ( PNG_SHARED "Build shared lib" ON )
endif ( )
if ( DEFINED PNG_STATIC )
option ( PNG_STATIC "Build static lib" ${ PNG_STATIC } )
else ( )
option ( PNG_STATIC "Build static lib" ON )
endif ( )
if ( MINGW )
option ( PNG_TESTS "Build pngtest" NO )
else ( )
option ( PNG_TESTS "Build pngtest" YES )
endif ( )
option ( PNG_NO_CONSOLE_IO "FIXME" YES )
option ( PNG_NO_STDIO "FIXME" YES )
option ( PNG_DEBUG "Build with debug output" NO )
option ( PNGARG "FIXME" YES )
#TODO:
# PNG_CONSOLE_IO_SUPPORTED
# maybe needs improving, but currently I don't know when we can enable what :)
set ( png_asm_tmp "OFF" )
if ( NOT WIN32 )
find_program ( uname_executable NAMES uname PATHS /bin /usr/bin /usr/local/bin )
if ( uname_executable )
exec_program ( ${ uname_executable }
A R G S - - m a c h i n e O U T P U T _ V A R I A B L E u n a m e _ o u t p u t )
if ( "uname_output" MATCHES "^.*i[1-9]86.*$" )
set ( png_asm_tmp "ON" )
else ( "uname_output" MATCHES "^.*i[1-9]86.*$" )
set ( png_asm_tmp "OFF" )
endif ( "uname_output" MATCHES "^.*i[1-9]86.*$" )
endif ( uname_executable )
else ( )
# this env var is normally only set on win64
set ( TEXT "ProgramFiles(x86)" )
if ( "$ENV{${TEXT}}" STREQUAL "" )
set ( png_asm_tmp "ON" )
endif ( "$ENV{${TEXT}}" STREQUAL "" )
endif ( )
# SET LIBNAME
set ( PNG_LIB_NAME png ${ PNGLIB_MAJOR } ${ PNGLIB_MINOR } )
# to distinguish between debug and release lib
set ( CMAKE_DEBUG_POSTFIX "d" )
# OUR SOURCES
set ( libpng_sources
p n g . h
p n g c o n f . h
2010-11-24 14:30:16 -08:00
p n g p r i v . h
2010-07-18 03:26:41 -07:00
p n g . c
p n g e r r o r . c
p n g g e t . c
p n g m e m . c
p n g p r e a d . c
p n g r e a d . c
p n g r i o . c
p n g r t r a n . c
p n g r u t i l . c
p n g s e t . c
p n g t r a n s . c
p n g w i o . c
p n g w r i t e . c
p n g w t r a n . c
p n g w u t i l . c
)
set ( pngtest_sources
p n g t e s t . c
)
# SOME NEEDED DEFINITIONS
add_definitions ( -DPNG_CONFIGURE_LIBPNG )
if ( _AIX )
add_definitions ( -D_ALL_SOURCE )
endif ( _AIX )
if ( MSVC )
add_definitions ( -DPNG_NO_MODULEDEF -D_CRT_SECURE_NO_DEPRECATE )
endif ( MSVC )
if ( PNG_SHARED OR NOT MSVC )
#if building msvc static this has NOT to be defined
add_definitions ( -DZLIB_DLL )
endif ( )
if ( PNG_CONSOLE_IO_SUPPORTED )
add_definitions ( -DPNG_CONSOLE_IO_SUPPORTED )
endif ( )
if ( PNG_NO_CONSOLE_IO )
add_definitions ( -DPNG_NO_CONSOLE_IO )
endif ( )
if ( PNG_NO_STDIO )
add_definitions ( -DPNG_NO_STDIO )
endif ( )
if ( PNG_DEBUG )
add_definitions ( -DPNG_DEBUG )
endif ( )
if ( NOT M_LIBRARY AND NOT WIN32 )
add_definitions ( -DPNG_NO_FLOATING_POINT_SUPPORTED )
endif ( )
# NOW BUILD OUR TARGET
include_directories ( ${ CMAKE_CURRENT_SOURCE_DIR } ${ ZLIB_INCLUDE_DIR } )
if ( PNG_SHARED )
add_library ( ${ PNG_LIB_NAME } SHARED ${ libpng_sources } )
if ( MSVC )
# msvc does not append 'lib' - do it here to have consistent name
set_target_properties ( ${ PNG_LIB_NAME } PROPERTIES PREFIX "lib" )
2010-11-24 14:30:16 -08:00
set_target_properties ( ${ PNG_LIB_NAME } PROPERTIES IMPORT_PREFIX "lib" )
2010-07-18 03:26:41 -07:00
endif ( )
target_link_libraries ( ${ PNG_LIB_NAME } ${ ZLIB_LIBRARY } ${ M_LIBRARY } )
endif ( )
if ( PNG_STATIC )
# does not work without changing name
set ( PNG_LIB_NAME_STATIC ${ PNG_LIB_NAME } _static )
add_library ( ${ PNG_LIB_NAME_STATIC } STATIC ${ libpng_sources } )
if ( MSVC )
# msvc does not append 'lib' - do it here to have consistent name
set_target_properties ( ${ PNG_LIB_NAME_STATIC } PROPERTIES PREFIX "lib" )
endif ( )
2010-11-24 14:30:16 -08:00
target_link_libraries ( ${ PNG_LIB_NAME_STATIC } ${ ZLIB_LIBRARY } ${ M_LIBRARY } )
2010-07-18 03:26:41 -07:00
endif ( )
if ( PNG_SHARED AND WIN32 )
set_target_properties ( ${ PNG_LIB_NAME } PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL )
endif ( )
if ( PNG_TESTS AND PNG_SHARED )
# does not work with msvc due to png_lib_ver issue
add_executable ( pngtest ${ pngtest_sources } )
target_link_libraries ( pngtest ${ PNG_LIB_NAME } )
2010-11-24 14:30:16 -08:00
add_test ( pngtest ./pngtest ${ CMAKE_CURRENT_SOURCE_DIR } /pngtest.png )
2010-07-18 03:26:41 -07:00
endif ( )
2010-11-24 14:30:16 -08:00
#
# Set a variable with CMake code which:
# Creates a symlink from src to dest (if possible) or alternatively
# copies if different.
macro ( _png_generate_symlink_code CODE SRC DEST )
if ( WIN32 AND NOT CYGWIN )
set ( _png_gsc_message "Copying ${SRC} to ${DEST} if needed" )
set ( _png_gsc_operation "copy_if_different" )
else ( )
set ( _png_gsc_message "Symlinking ${SRC} to ${DEST}" )
set ( _png_gsc_operation "create_symlink" )
endif ( )
set ( ${ CODE } "
message ( STATUS \"${_png_gsc_message}\")
execute_process ( COMMAND \${CMAKE_COMMAND} -E ${ _png_gsc_operation }
\ " $ { S R C } \ " \ " $ { D E S T } \ " )
" )
endmacro ( )
2010-07-18 03:26:41 -07:00
# CREATE PKGCONFIG FILES
# we use the same files like ./configure, so we have to set its vars
2010-11-24 14:30:16 -08:00
if ( NOT DEFINED CMAKE_INSTALL_LIBDIR )
set ( CMAKE_INSTALL_LIBDIR ${ CMAKE_INSTALL_PREFIX } /lib )
endif ( NOT DEFINED CMAKE_INSTALL_LIBDIR )
2010-07-18 03:26:41 -07:00
set ( prefix ${ CMAKE_INSTALL_PREFIX } )
set ( exec_prefix ${ CMAKE_INSTALL_PREFIX } )
2010-11-24 14:30:16 -08:00
set ( libdir ${ CMAKE_INSTALL_LIBDIR } )
2010-07-18 03:26:41 -07:00
set ( includedir ${ CMAKE_INSTALL_PREFIX } /include )
2010-11-24 14:30:16 -08:00
set ( LIBS "-lz -lm" )
2010-07-18 03:26:41 -07:00
configure_file ( ${ CMAKE_CURRENT_SOURCE_DIR } /libpng.pc.in
2010-11-24 14:30:16 -08:00
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { P N G L I B _ N A M E } . p c @ O N L Y )
_png_generate_symlink_code ( PNG_PC_INSTALL_CODE ${ PNGLIB_NAME } .pc libpng.pc )
install ( CODE ${ PNG_PC_INSTALL_CODE } )
2010-07-18 03:26:41 -07:00
configure_file ( ${ CMAKE_CURRENT_SOURCE_DIR } /libpng-config.in
2010-11-24 14:30:16 -08:00
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { P N G L I B _ N A M E } - c o n f i g @ O N L Y )
_png_generate_symlink_code ( PNG_CONFIG_INSTALL_CODE ${ PNGLIB_NAME } -config libpng-config )
install ( CODE ${ PNG_CONFIG_INSTALL_CODE } )
2010-07-18 03:26:41 -07:00
# SET UP LINKS
if ( PNG_SHARED )
set_target_properties ( ${ PNG_LIB_NAME } PROPERTIES
2010-11-24 14:30:16 -08:00
# VERSION 14.${PNGLIB_RELEASE}.1.4.4
2010-07-18 03:26:41 -07:00
V E R S I O N 1 4 . $ { P N G L I B _ R E L E A S E } . 0
S O V E R S I O N 1 4
C L E A N _ D I R E C T _ O U T P U T 1 )
endif ( )
if ( PNG_STATIC )
2010-11-24 14:30:16 -08:00
# MSVC doesn't use a different file extension for shared vs. static
# libs. We are able to change OUTPUT_NAME to remove the _static
# for all other platforms.
if ( NOT MSVC )
2010-07-18 03:26:41 -07:00
set_target_properties ( ${ PNG_LIB_NAME_STATIC } PROPERTIES
O U T P U T _ N A M E $ { P N G _ L I B _ N A M E }
C L E A N _ D I R E C T _ O U T P U T 1 )
endif ( )
endif ( )
2010-11-24 14:30:16 -08:00
# If CMake > 2.4.x, we set a variable used below to export
# targets to an export file.
# TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
if ( CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4 )
set ( PNG_EXPORT_RULE EXPORT libpng )
elseif ( CMAKE_MAJOR_VERSION GREATER 2 ) # future proof
set ( PNG_EXPORT_RULE EXPORT libpng )
endif ( )
2010-07-18 03:26:41 -07:00
# INSTALL
if ( NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
if ( PNG_SHARED )
install ( TARGETS ${ PNG_LIB_NAME }
2010-11-24 14:30:16 -08:00
$ { P N G _ E X P O R T _ R U L E }
R U N T I M E D E S T I N A T I O N b i n
L I B R A R Y D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R }
A R C H I V E D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } )
# Create a symlink for libpng.dll.a => libpng14.dll.a on Cygwin
if ( CYGWIN )
_png_generate_symlink_code ( PNG_SHARED_IMPLIB_INSTALL_CODE
$ { P N G L I B _ N A M E } $ { C M A K E _ I M P O R T _ L I B R A R Y _ S U F F I X }
l i b p n g $ { C M A K E _ I M P O R T _ L I B R A R Y _ S U F F I X } )
install ( CODE ${ PNG_SHARED_IMPLIB_INSTALL_CODE } )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /libpng ${ CMAKE_IMPORT_LIBRARY_SUFFIX } DESTINATION ${ CMAKE_INSTALL_LIBDIR } )
endif ( )
if ( NOT WIN32 )
_png_generate_symlink_code ( PNG_SHARED_INSTALL_CODE
$ { P N G L I B _ N A M E } $ { C M A K E _ S H A R E D _ L I B R A R Y _ S U F F I X }
l i b p n g $ { C M A K E _ S H A R E D _ L I B R A R Y _ S U F F I X } )
install ( CODE ${ PNG_SHARED_INSTALL_CODE } )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /libpng ${ CMAKE_SHARED_LIBRARY_SUFFIX } DESTINATION ${ CMAKE_INSTALL_LIBDIR } )
endif ( )
2010-07-18 03:26:41 -07:00
endif ( )
2010-11-24 14:30:16 -08:00
2010-07-18 03:26:41 -07:00
if ( PNG_STATIC )
install ( TARGETS ${ PNG_LIB_NAME_STATIC }
2010-11-24 14:30:16 -08:00
$ { P N G _ E X P O R T _ R U L E }
L I B R A R Y D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R }
A R C H I V E D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } )
if ( NOT WIN32 OR CYGWIN )
_png_generate_symlink_code ( PNG_STATIC_INSTALL_CODE
$ { P N G L I B _ N A M E } $ { C M A K E _ S T A T I C _ L I B R A R Y _ S U F F I X }
l i b p n g $ { C M A K E _ S T A T I C _ L I B R A R Y _ S U F F I X } )
install ( CODE ${ PNG_STATIC_INSTALL_CODE } )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /libpng ${ CMAKE_STATIC_LIBRARY_SUFFIX } DESTINATION ${ CMAKE_INSTALL_LIBDIR } )
endif ( )
2010-07-18 03:26:41 -07:00
endif ( )
endif ( )
if ( NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
install ( FILES png.h pngconf.h DESTINATION include )
install ( FILES png.h pngconf.h DESTINATION include/ ${ PNGLIB_NAME } )
endif ( )
if ( NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
install ( PROGRAMS ${ CMAKE_CURRENT_BINARY_DIR } /libpng-config DESTINATION bin )
install ( PROGRAMS ${ CMAKE_CURRENT_BINARY_DIR } / ${ PNGLIB_NAME } -config
D E S T I N A T I O N b i n )
endif ( )
if ( NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
# Install man pages
2010-11-24 14:30:16 -08:00
if ( NOT PNG_MAN_DIR )
set ( PNG_MAN_DIR "share/man" )
endif ( )
install ( FILES libpng.3 libpngpf.3 DESTINATION ${ PNG_MAN_DIR } /man3 )
install ( FILES png.5 DESTINATION ${ PNG_MAN_DIR } /man5 )
2010-07-18 03:26:41 -07:00
# Install pkg-config files
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } /libpng.pc
2010-11-24 14:30:16 -08:00
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } / p k g c o n f i g )
install ( PROGRAMS ${ CMAKE_CURRENT_BINARY_DIR } /libpng-config
2010-07-18 03:26:41 -07:00
D E S T I N A T I O N b i n )
install ( FILES ${ CMAKE_CURRENT_BINARY_DIR } / ${ PNGLIB_NAME } .pc
2010-11-24 14:30:16 -08:00
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } / p k g c o n f i g )
install ( PROGRAMS ${ CMAKE_CURRENT_BINARY_DIR } / ${ PNGLIB_NAME } -config
2010-07-18 03:26:41 -07:00
D E S T I N A T I O N b i n )
endif ( )
2010-11-24 14:30:16 -08:00
# On versions of CMake that support it, create an export file CMake
# users can include() to import our targets
if ( PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
install ( EXPORT libpng DESTINATION lib/libpng FILE lib ${ PNG_LIB_NAME } .cmake )
endif ( )
2010-07-18 03:26:41 -07:00
# what's with libpng.txt and all the extra files?
# UNINSTALL
# do we need this?
# DIST
# do we need this?
# to create msvc import lib for mingw compiled shared lib
# pexports libpng.dll > libpng.def
# lib /def:libpng.def /machine:x86