netpbm: new package (#24063)

This commit is contained in:
Olivier Cessenat 2021-07-07 15:36:11 +02:00 committed by GitHub
parent 0e3f7ce0ed
commit 09d89ef265
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -0,0 +1,208 @@
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
from shutil import copyfile
from spack import *
class Netpbm(MakefilePackage):
"""Netpbm - graphics tools and converters.
A whole bunch of utilities for primitive manipulation of
graphic images. Wide array of converters
from one graphics format to another. E.g.
from g3 fax format to jpeg. Many basic graphics
editing tools such as magnifying and cropping.
"""
homepage = "http://netpbm.sourceforge.net"
url = "https://sourceforge.net/projects/netpbm/files/super_stable/10.73.35/netpbm-10.73.35.tgz"
maintainers = ['cessenat']
version('10.73.35', sha256='628dbe8490bc43557813d1fedb2720dfdca0b80dd3f2364cb2a45c6ff04b0f18')
# As a default we wish to commpile absolutely everything at once.
# Variants are there in case compilation was a problem.
variant('all', default=True,
description='Enable all 3rd party libs')
variant('X', default=True,
description='Enable X libs for pamx')
variant('fiasco', default=True,
description='Enable fiasco')
variant('ghostscript', default=True,
description='Ghostscript is called by pstopnm and pbmtextps')
# netpbm can provide it's own jasper and jbig : better use the ones
# from their respective spack package.
variant('builtin', default=False,
description='Use builtin libs instead of 3rd party')
depends_on('perl', type=('build', 'run'))
depends_on('gmake', type='build')
depends_on('pkgconfig', type='build')
# These are general pre-requisites indicated at
# http://netpbm.sourceforge.net/prereq.html
depends_on('zlib')
depends_on('jpeg')
depends_on('libtiff')
depends_on('libpng')
# Ghostscript is called as "gs" by pstopnm and pbmtextps
depends_on('ghostscript', type='run', when='+ghostscript')
# These are the optional libs:
# svgtopam : http://netpbm.sourceforge.net/prereq.html
# homebrew also sets a dependancy to libxml2
# https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/netpbm.rb
depends_on('libxml2', when='+all')
# thinkjettopbm : http://netpbm.sourceforge.net/prereq.html
depends_on('flex', type=('build', 'run'), when='+all')
# https://formulae.brew.sh/formula/netpbm
depends_on('jasper', when='+all~builtin')
# Only Mac Ports sets a dependency to jbig
# https://ports.macports.org/port/netpbm/summary
depends_on('jbigkit', when='+all~builtin')
# pamx depends on X11 libraries:
depends_on('libx11', when='+X')
def edit(self, spec, prefix):
# We better not run the interactive perl script buildtools/configure.pl
# as explained by Todd in
# https://groups.google.com/g/spack/c/8sEqDkZ68DA/m/wpbB0wHaAgAJ
# so we will mimic the perl script bahavior
copyfile('config.mk.in', 'config.mk')
config = []
config.append('####Lines above were copied from config.mk.in')
# This is already the default but we make sure it is set
# even for a dev release for instance:
config.append('DEFAULT_TARGET = nonmerge')
config.append('NETPBMLIBSUFFIX={0}'.format(dso_suffix))
if 'platform=darwin' in spec:
config.append('NETPBMLIBTYPE=dylib')
args = ['-dynamiclib', '-Wl,-install_name']
args.append('-Wl,@rpath/libnetpbm.dylib')
config.append('LDSHLIB = {0}'.format(' '.join(args)))
elif 'platform=cygwin' in spec:
config.append('NETPBMLIBTYPE=dll')
config.append('NETPBMLIBSUFFIX=dll')
config.append('SHLIBPREFIXLIST=cyg lib')
config.append('EXE = .exe')
config.append('SYMLINK = cp')
config.append('LINKERISCOMPILER = Y')
config.append('WINICON_OBJECT = $(BUILDDIR)/icon/netpbm.o')
config.append('DLLVER=$(NETPBM_MAJOR_RELEASE)')
args = ['-shared', '-Wl,--image-base=0x10000000']
args.append('-Wl,--enable-auto-import')
config.append('LDSHLIB = {0}'.format(' '.join(args)))
else:
config.append('NETPBMLIBTYPE=unixshared')
if '~fiasco' in spec:
config.append('BUILD_FIASCO = N')
config.append('STATICLIB_TOO=Y')
config.append('OMIT_NETWORK = Y')
config.append('CC = {0}'.format(spack_cc))
config.append('LD = {0}'.format(spack_cc))
config.append('CC_FOR_BUILD = {0}'.format(spack_cc))
config.append('LD_FOR_BUILD = {0}'.format(spack_cc))
config.append('CFLAGS_SHLIB += {0}'.format(self.compiler.cc_pic_flag))
if '%gcc' in spec or 'platform=darwin' in spec:
cflags = ['-O3', '-ffast-math', '-pedantic', '-Wall', '-Wimplicit']
cflags.extend(['-Wno-uninitialized', '-Wmissing-declarations'])
cflags.extend(['-Wwrite-strings', '-Wmissing-prototypes'])
cflags.extend(['-Wundef', '-Wno-unknown-pragmas'])
if 'platform=darwin' in spec:
# https://github.com/macports/macports-ports/blob/master/graphics/netpbm/Portfile
cflags.append('-D_DARWIN_C_SOURCE')
# http://www.linuxquestions.org/questions/linux-from-scratch-13/can't-compile-luit-xorg-applications-4175476308/
# cflags.append('-U_XOPEN_SOURCE')
# http://www.mistys-internet.website/blog/blog/2013/10/19/no-cpp-precomp-the-compiler-flag-that-time-forgot/
# cflags.append('-no-cpp-precomp')
config.append('CFLAGS = {0}'.format(' '.join(cflags)))
config.append('CFLAGS_SHLIB += -fno-common')
if '+all' in spec:
flex = join_path(spec['flex'].prefix.bin, 'flex')
if os.path.exists(flex):
config.append('LEX = {0}'.format(flex))
config.append('TIFFLIB={0}'.format(
spec['libtiff'].libs.ld_flags))
config.append('TIFFHDR_DIR={0}'.format(
spec['libtiff'].headers.directories[0]))
config.append('PNGLIB={0}'.format(
spec['libpng'].libs.ld_flags))
config.append('PNGHDR_DIR={0}'.format(
spec['libpng'].headers.directories[0]))
config.append('JPEGLIB={0}'.format(
spec['jpeg'].libs.ld_flags))
config.append('JPEGHDR_DIR={0}'.format(
spec['jpeg'].headers.directories[0]))
if '+all' in spec and '+builtin' not in spec:
config.append('JASPERLIB={0}'.format(
spec['jasper'].libs.ld_flags))
config.append('JASPERHDR_DIR={0}'.format(
spec['jasper'].headers.directories[0]))
config.append('JBIGLIB={0}'.format(
spec['jbigkit'].libs.ld_flags))
config.append('JBIGHDR_DIR={0}'.format(
spec['jbigkit'].headers.directories[0]))
if '+X' in spec:
pkg_config = which('pkg-config')
if not pkg_config('x11', '--exists'):
config.append('X11LIB={0}'.format(
spec['libx11'].libs.ld_flags))
config.append('X11HDR_DIR={0}'.format(
spec['libx11'].headers.directories[0]))
config.append('ZLIB={0}'.format(spec['zlib'].libs.ld_flags))
config.append('NETPBM_DOCURL = http://netpbm.sourceforge.net/doc/')
if spec.target.family == 'x86_64':
config.append('WANT_SSE = Y')
with open('config.mk', 'a') as mk:
mk.write('\n'.join(config))
def build(self, spec, prefix):
make()
def install(self, spec, prefix):
bdir = join_path(self.build_directory, 'build')
make('package', 'pkgdir={0}'.format(bdir), parallel=False)
# Same as before build, mimic the interactive
# perl script buildtools/installnetpbm.pl
mkdirp(prefix.bin)
mkdirp(prefix.lib)
mkdirp(prefix.include)
mkdirp(prefix.man)
with working_dir('build'):
install_tree("bin", prefix.bin)
install_tree("lib", prefix.lib)
install_tree("misc", prefix.lib)
install_tree("include", prefix.include)
install_tree(join_path("include", "netpbm"), prefix.include)
if os.path.exists('man'):
install_tree("man", prefix.man)
# As a default a static lib is also created.
# We could put that as an option
staticlib = join_path('staticlink', 'libnetpbm.a')
if os.path.exists(staticlib):
install(staticlib, prefix.lib)
else:
staticlib = join_path('link', 'libnetpbm.a')
if os.path.exists(staticlib):
install(staticlib, prefix.lib)
# Make the .pc as done by installnetpbm.pl
src = join_path('buildtools', 'pkgconfig_template')
pdir = join_path(prefix.lib, 'pkgconfig')
mkdirp(pdir)
copyfile(src, join_path(pdir, 'netpbm.pc'))
pfic = FileFilter(join_path(pdir, 'netpbm.pc'))
pfic.filter('@VERSION@', 'Netpbm {0}'.format(str(spec.version)))
pfic.filter('@LINKDIR@', '{0}'.format(prefix.lib))
pfic.filter('@INCLUDEDIR@', '{0}'.format(prefix.include))