Home | History | Annotate | Download | only in libpng
      1 
      2     Installing libpng
      3 
      4 Contents
      5 
      6        I. Simple installation
      7       II. Rebuilding the configure scripts
      8      III. Using scripts/makefile*
      9       IV. Using cmake
     10        V. Directory structure
     11       VI. Building with project files
     12      VII. Building with makefiles
     13     VIII. Configuring libpng for 16-bit platforms
     14       IX. Configuring for DOS
     15        X. Configuring for Medium Model
     16       XI. Prepending a prefix to exported symbols
     17      XII. Configuring for compiler xxx:
     18     XIII. Removing unwanted object code
     19      XIV. Changes to the build and configuration of libpng in libpng-1.5.x
     20       XV. Setjmp/longjmp issues
     21      XVI. Common linking failures
     22     XVII. Other sources of information about libpng
     23 
     24 I. Simple installation
     25 
     26 On Unix/Linux and similar systems, you can simply type
     27 
     28     ./configure [--prefix=/path]
     29     make check
     30     make install
     31 
     32 and ignore the rest of this document.  "/path" is the path to the directory
     33 where you want to install the libpng "lib", "include", and "bin"
     34 subdirectories.
     35 
     36 If you downloaded a GIT clone, you will need to run ./autogen.sh before
     37 running ./configure, to create "configure" and "Makefile.in" which are
     38 not included in the GIT repository.
     39 
     40 Note that "configure" is only included in the "*.tar" distributions and not
     41 in the "*.zip" or "*.7z" distributions. If you downloaded one of those
     42 distributions, see "Building with project files" or "Building with makefiles",
     43 below.
     44 
     45 II. Rebuilding the configure scripts
     46 
     47 If configure does not work on your system, or if you have a need to
     48 change configure.ac or Makefile.am, and you have a reasonably
     49 up-to-date set of tools, running ./autogen.sh in a git clone before
     50 running ./configure may fix the problem.  To be really sure that you
     51 aren't using any of the included pre-built scripts, especially if you
     52 are building from a tar distribution instead of a git distribution,
     53 do this:
     54 
     55     ./configure --enable-maintainer-mode
     56     make maintainer-clean
     57     ./autogen.sh --maintainer --clean
     58     ./autogen.sh --maintainer
     59     ./configure [--prefix=/path] [other options]
     60     make
     61     make install
     62     make check
     63 
     64 III. Using scripts/makefile*
     65 
     66 Instead, you can use one of the custom-built makefiles in the
     67 "scripts" directory
     68 
     69     cp scripts/pnglibconf.h.prebuilt pnglibconf.h
     70     cp scripts/makefile.system makefile
     71     make test
     72     make install
     73 
     74 The files that are presently available in the scripts directory
     75 are listed and described in scripts/README.txt.
     76 
     77 Or you can use one of the "projects" in the "projects" directory.
     78 
     79 Before installing libpng, you must first install zlib, if it
     80 is not already on your system.  zlib can usually be found
     81 wherever you got libpng; otherwise go to http://zlib.net.  You can place
     82 zlib in the same directory as libpng or in another directory.
     83 
     84 If your system already has a preinstalled zlib you will still need
     85 to have access to the zlib.h and zconf.h include files that
     86 correspond to the version of zlib that's installed.
     87 
     88 If you wish to test with a particular zlib that is not first in the
     89 standard library search path, put ZLIBLIB, ZLIBINC, CPPFLAGS, LDFLAGS,
     90 and LD_LIBRARY_PATH in your environment before running "make test"
     91 or "make distcheck":
     92 
     93     ZLIBLIB=/path/to/lib export ZLIBLIB
     94     ZLIBINC=/path/to/include export ZLIBINC
     95     CPPFLAGS="-I$ZLIBINC" export CPPFLAGS
     96     LDFLAGS="-L$ZLIBLIB" export LDFLAGS
     97     LD_LIBRARY_PATH="$ZLIBLIB:$LD_LIBRARY_PATH" export LD_LIBRARY_PATH
     98 
     99 If you are using one of the makefile scripts, put ZLIBLIB and ZLIBINC
    100 in your environment and type
    101 
    102     make ZLIBLIB=$ZLIBLIB ZLIBINC=$ZLIBINC test
    103 
    104 IV. Using cmake
    105 
    106 If you want to use "cmake" (see www.cmake.org), type
    107 
    108     cmake . -DCMAKE_INSTALL_PREFIX=/path
    109     make
    110     make install
    111 
    112 As when using the simple configure method described above, "/path" points to
    113 the installation directory where you want to put the libpng "lib", "include",
    114 and "bin" subdirectories.
    115 
    116 V. Directory structure
    117 
    118 You can rename the directories that you downloaded (they
    119 might be called "libpng-x.y.z" or "libpngNN" and "zlib-1.2.8"
    120 or "zlib128") so that you have directories called "zlib" and "libpng".
    121 
    122 Your directory structure should look like this:
    123 
    124     .. (the parent directory)
    125       libpng (this directory)
    126           INSTALL (this file)
    127           README
    128           *.h, *.c  => libpng source files
    129           CMakeLists.txt    =>  "cmake" script
    130           configuration files:
    131              configure.ac, configure, Makefile.am, Makefile.in,
    132              autogen.sh, config.guess, ltmain.sh, missing, libpng.pc.in,
    133              libpng-config.in, aclocal.m4, config.h.in, config.sub,
    134              depcomp, install-sh, mkinstalldirs, test-pngtest.sh
    135           contrib
    136              arm-neon, conftest, examples, gregbook, libtests, pngminim,
    137              pngminus, pngsuite, tools, visupng
    138           projects
    139              cbuilder5, owatcom, visualc71, vstudio, xcode
    140           scripts
    141              makefile.*
    142              *.def (module definition files)
    143              etc.
    144           pngtest.png
    145           etc.
    146       zlib
    147           README, *.h, *.c contrib, etc.
    148 
    149 If the line endings in the files look funny, you may wish to get the other
    150 distribution of libpng.  It is available in both tar.gz (UNIX style line
    151 endings) and zip (DOS style line endings) formats.
    152 
    153 VI. Building with project files
    154 
    155 If you are building libpng with MSVC, you can enter the
    156 libpng projects\visualc71 or vstudio directory and follow the instructions
    157 in README.txt.
    158 
    159 Otherwise enter the zlib directory and follow the instructions in zlib/README,
    160 then come back here and run "configure" or choose the appropriate
    161 makefile.sys in the scripts directory.
    162 
    163 VII. Building with makefiles
    164 
    165 Copy the file (or files) that you need from the
    166 scripts directory into this directory, for example
    167 
    168 MSDOS example:
    169 
    170     copy scripts\makefile.msc makefile
    171     copy scripts\pnglibconf.h.prebuilt pnglibconf.h
    172 
    173 UNIX example:
    174 
    175     cp scripts/makefile.std makefile
    176     cp scripts/pnglibconf.h.prebuilt pnglibconf.h
    177 
    178 Read the makefile to see if you need to change any source or
    179 target directories to match your preferences.
    180 
    181 Then read pnglibconf.dfa to see if you want to make any configuration
    182 changes.
    183 
    184 Then just run "make" which will create the libpng library in
    185 this directory and "make test" which will run a quick test that reads
    186 the "pngtest.png" file and writes a "pngout.png" file that should be
    187 identical to it.  Look for "9782 zero samples" in the output of the
    188 test.  For more confidence, you can run another test by typing
    189 "pngtest pngnow.png" and looking for "289 zero samples" in the output.
    190 Also, you can run "pngtest -m contrib/pngsuite/*.png" and compare
    191 your output with the result shown in contrib/pngsuite/README.
    192 
    193 Most of the makefiles will allow you to run "make install" to
    194 put the library in its final resting place (if you want to
    195 do that, run "make install" in the zlib directory first if necessary).
    196 Some also allow you to run "make test-installed" after you have
    197 run "make install".
    198 
    199 VIII. Configuring libpng for 16-bit platforms
    200 
    201 You will want to look into zconf.h to tell zlib (and thus libpng) that
    202 it cannot allocate more than 64K at a time.  Even if you can, the memory
    203 won't be accessible.  So limit zlib and libpng to 64K by defining MAXSEG_64K.
    204 
    205 IX. Configuring for DOS
    206 
    207 For DOS users who only have access to the lower 640K, you will
    208 have to limit zlib's memory usage via a png_set_compression_mem_level()
    209 call.  See zlib.h or zconf.h in the zlib library for more information.
    210 
    211 X. Configuring for Medium Model
    212 
    213 Libpng's support for medium model has been tested on most of the popular
    214 compilers.  Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets
    215 defined, and FAR gets defined to far in pngconf.h, and you should be
    216 all set.  Everything in the library (except for zlib's structure) is
    217 expecting far data.  You must use the typedefs with the p or pp on
    218 the end for pointers (or at least look at them and be careful).  Make
    219 note that the rows of data are defined as png_bytepp, which is
    220 an "unsigned char far * far *".
    221 
    222 XI. Prepending a prefix to exported symbols
    223 
    224 Starting with libpng-1.6.0, you can configure libpng (when using the
    225 "configure" script) to prefix all exported symbols by means of the
    226 configuration option "--with-libpng-prefix=FOO_", where FOO_ can be any
    227 string beginning with a letter and containing only uppercase
    228 and lowercase letters, digits, and the underscore (i.e., a C language
    229 identifier).  This creates a set of macros in pnglibconf.h, so this is
    230 transparent to applications; their function calls get transformed by
    231 the macros to use the modified names.
    232 
    233 XII. Configuring for compiler xxx:
    234 
    235 All includes for libpng are in pngconf.h.  If you need to add, change
    236 or delete an include, this is the place to do it.
    237 The includes that are not needed outside libpng are placed in pngpriv.h,
    238 which is only used by the routines inside libpng itself.
    239 The files in libpng proper only include pngpriv.h and png.h, which
    240 in turn includes pngconf.h and, as of libpng-1.5.0, pnglibconf.h.
    241 As of libpng-1.5.0, pngpriv.h also includes three other private header
    242 files, pngstruct.h, pnginfo.h, and pngdebug.h, which contain material
    243 that previously appeared in the public headers.
    244 
    245 XIII. Removing unwanted object code
    246 
    247 There are a bunch of #define's in pngconf.h that control what parts of
    248 libpng are compiled.  All the defines end in _SUPPORTED.  If you are
    249 never going to use a capability, you can change the #define to #undef
    250 before recompiling libpng and save yourself code and data space, or
    251 you can turn off individual capabilities with defines that begin with
    252 "PNG_NO_".
    253 
    254 In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead.
    255 
    256 You can also turn all of the transforms and ancillary chunk capabilities
    257 off en masse with compiler directives that define
    258 PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS,
    259 or all four, along with directives to turn on any of the capabilities that
    260 you do want.  The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the
    261 extra transformations but still leave the library fully capable of reading
    262 and writing PNG files with all known public chunks. Use of the
    263 PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library
    264 that is incapable of reading or writing ancillary chunks.  If you are
    265 not using the progressive reading capability, you can turn that off
    266 with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING
    267 capability, which you'll still have).
    268 
    269 All the reading and writing specific code are in separate files, so the
    270 linker should only grab the files it needs.  However, if you want to
    271 make sure, or if you are building a stand alone library, all the
    272 reading files start with "pngr" and all the writing files start with "pngw".
    273 The files that don't match either (like png.c, pngtrans.c, etc.)
    274 are used for both reading and writing, and always need to be included.
    275 The progressive reader is in pngpread.c
    276 
    277 If you are creating or distributing a dynamically linked library (a .so
    278 or DLL file), you should not remove or disable any parts of the library,
    279 as this will cause applications linked with different versions of the
    280 library to fail if they call functions not available in your library.
    281 The size of the library itself should not be an issue, because only
    282 those sections that are actually used will be loaded into memory.
    283 
    284 XIV. Changes to the build and configuration of libpng in libpng-1.5.x
    285 
    286 Details of internal changes to the library code can be found in the CHANGES
    287 file and in the GIT repository logs.  These will be of no concern to the vast
    288 majority of library users or builders; however, the few who configure libpng
    289 to a non-default feature set may need to change how this is done.
    290 
    291 There should be no need for library builders to alter build scripts if
    292 these use the distributed build support - configure or the makefiles -
    293 however, users of the makefiles may care to update their build scripts
    294 to build pnglibconf.h where the corresponding makefile does not do so.
    295 
    296 Building libpng with a non-default configuration has changed completely.
    297 The old method using pngusr.h should still work correctly even though the
    298 way pngusr.h is used in the build has been changed; however, library
    299 builders will probably want to examine the changes to take advantage of
    300 new capabilities and to simplify their build system.
    301 
    302 A. Specific changes to library configuration capabilities
    303 
    304 The exact mechanism used to control attributes of API functions has
    305 changed.  A single set of operating system independent macro definitions
    306 is used and operating system specific directives are defined in
    307 pnglibconf.h
    308 
    309 As part of this the mechanism used to choose procedure call standards on
    310 those systems that allow a choice has been changed.  At present this only
    311 affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
    312 running on Intel processors.  As before, PNGAPI is defined where required
    313 to control the exported API functions; however, two new macros, PNGCBAPI
    314 and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
    315 (PNGCAPI) for functions that must match a C library prototype (currently
    316 only png_longjmp_ptr, which must match the C longjmp function.)  The new
    317 approach is documented in pngconf.h
    318 
    319 Despite these changes, libpng 1.5.0 only supports the native C function
    320 calling standard on those platforms tested so far ("__cdecl" on Microsoft
    321 Windows).  This is because the support requirements for alternative
    322 calling conventions seem to no longer exist.  Developers who find it
    323 necessary to set PNG_API_RULE to 1 should advise the mailing list
    324 (png-mng-implement) of this and library builders who use Openwatcom and
    325 therefore set PNG_API_RULE to 2 should also contact the mailing list.
    326 
    327 B. Changes to the configuration mechanism
    328 
    329 Prior to libpng-1.5.0 library builders who needed to configure libpng
    330 had either to modify the exported pngconf.h header file to add system
    331 specific configuration or had to write feature selection macros into
    332 pngusr.h and cause this to be included into pngconf.h by defining
    333 PNG_USER_CONFIG. The latter mechanism had the disadvantage that an
    334 application built without PNG_USER_CONFIG defined would see the
    335 unmodified, default, libpng API and thus would probably fail to link.
    336 
    337 These mechanisms still work in the configure build and in any makefile
    338 build that builds pnglibconf.h, although the feature selection macros
    339 have changed somewhat as described above.  In 1.5.0, however, pngusr.h is
    340 processed only once, at the time the exported header file pnglibconf.h is
    341 built.  pngconf.h no longer includes pngusr.h; therefore, pngusr.h is ignored
    342 after the build of pnglibconf.h and it is never included in an application
    343 build.
    344 
    345 The formerly used alternative of adding a list of feature macros to the
    346 CPPFLAGS setting in the build also still works; however, the macros will be
    347 copied to pnglibconf.h and this may produce macro redefinition warnings
    348 when the individual C files are compiled.
    349 
    350 All configuration now only works if pnglibconf.h is built from
    351 scripts/pnglibconf.dfa.  This requires the program awk.  Brian Kernighan
    352 (the original author of awk) maintains C source code of that awk and this
    353 and all known later implementations (often called by subtly different
    354 names - nawk and gawk for example) are adequate to build pnglibconf.h.
    355 The Sun Microsystems (now Oracle) program 'awk' is an earlier version
    356 and does not work; this may also apply to other systems that have a
    357 functioning awk called 'nawk'.
    358 
    359 Configuration options are now documented in scripts/pnglibconf.dfa.  This
    360 file also includes dependency information that ensures a configuration is
    361 consistent; that is, if a feature is switched off, dependent features are
    362 also switched off.  As a recommended alternative to using feature macros in
    363 pngusr.h a system builder may also define equivalent options in pngusr.dfa
    364 (or, indeed, any file) and add that to the configuration by setting
    365 DFA_XTRA to the file name.  The makefiles in contrib/pngminim illustrate
    366 how to do this, and also illustrate a case where pngusr.h is still required.
    367 
    368 After you have built libpng, the definitions that were recorded in
    369 pnglibconf.h are available to your application (pnglibconf.h is included
    370 in png.h and gets installed alongside png.h and pngconf.h in your
    371 $PREFIX/include directory).  Do not edit pnglibconf.h after you have built
    372 libpng, because than the settings would not accurately reflect the settings
    373 that were used to build libpng.
    374 
    375 XV. Setjmp/longjmp issues
    376 
    377 Libpng uses setjmp()/longjmp() for error handling.  Unfortunately setjmp()
    378 is known to be not thread-safe on some platforms and we don't know of
    379 any platform where it is guaranteed to be thread-safe.  Therefore, if
    380 your application is going to be using multiple threads, you should
    381 configure libpng with PNG_NO_SETJMP in your pngusr.dfa file, with
    382 -DPNG_NO_SETJMP on your compile line, or with
    383 
    384     #undef PNG_SETJMP_SUPPORTED
    385 
    386 in your pnglibconf.h or pngusr.h.
    387 
    388 Starting with libpng-1.6.0, the library included a "simplified API".
    389 This requires setjmp/longjmp, so you must either build the library
    390 with PNG_SETJMP_SUPPORTED defined, or with PNG_SIMPLIFIED_READ_SUPPORTED
    391 and PNG_SIMPLIFIED_WRITE_SUPPORTED undefined.
    392 
    393 XVI. Common linking failures
    394 
    395 If your application fails to find libpng or zlib entries while linking:
    396 
    397   Be sure "-lz" appears after "-lpng" on your linking command.
    398 
    399   Be sure you have built libpng, zlib, and your application for the
    400   same platform (e.g., 32-bit or 64-bit).
    401 
    402   If you are using the vstudio project, observe the WARNING in
    403   project/vstudio/README.txt.
    404 
    405 XVII. Other sources of information about libpng:
    406 
    407 Further information can be found in the README and libpng-manual.txt
    408 files, in the individual makefiles, in png.h, and the manual pages
    409 libpng.3 and png.5.
    410 
    411 Copyright (c) 1998-2002,2006-2016 Glenn Randers-Pehrson
    412 This document is released under the libpng license.
    413 For conditions of distribution and use, see the disclaimer
    414 and license in png.h.
    415