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