summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Cessenat <cessenat@gmail.com>2021-07-07 15:36:11 +0200
committerGitHub <noreply@github.com>2021-07-07 15:36:11 +0200
commit09d89ef265f2f8d7346e6818f39afae55ee58fa1 (patch)
tree5555c893f051e622cc07639ad0ac771a35a6a043
parent0e3f7ce0ed5099ddfc9aec0529ba69b9b7164ca1 (diff)
downloadspack-09d89ef265f2f8d7346e6818f39afae55ee58fa1.tar.gz
spack-09d89ef265f2f8d7346e6818f39afae55ee58fa1.tar.bz2
spack-09d89ef265f2f8d7346e6818f39afae55ee58fa1.tar.xz
spack-09d89ef265f2f8d7346e6818f39afae55ee58fa1.zip
netpbm: new package (#24063)
-rw-r--r--var/spack/repos/builtin/packages/netpbm/package.py208
1 files changed, 208 insertions, 0 deletions
diff --git a/var/spack/repos/builtin/packages/netpbm/package.py b/var/spack/repos/builtin/packages/netpbm/package.py
new file mode 100644
index 0000000000..7096ac1e12
--- /dev/null
+++ b/var/spack/repos/builtin/packages/netpbm/package.py
@@ -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))