spack/var/spack/repos/builtin/packages/cgal/package.py
Todd Gamblin 3cdf4e7ccf
packages: eliminate unnecessary implicit string concatenation
Python lets you do things like

```python
"these are " "one string"

'so are' "these"
```

This can be useful for breaking strings over multiple lines. It also often happens
unintentionally and indicates that there are subtle errors in the code.

There are a lot of variant descriptions that have implicit concatenation harmlessly
due to refactors, e.g.:

```python
    variant("myvariant", default=True, description="this used to be" "on two lines")
```

But there are also real bugs, like this, where the author probably omitted a comma and
didn't notice that `black` reformatted the implicit concatenation onto one line:

```python
args = [
     "--with-thing",
     "--with-second-thing" "--with-third-thing",
]
```

And other bugs like this, where the author probably intended to add a space, but didn't:

```python
options = "${CFLAGS}" "${SPECIAL_PIC_OPTION}"
```

Some things are harmless but confusing:

```python
"first part of string {0} " "second part {1}".format("zero", "one")
```

It's not broken. String concatenation happens *before* the `format()` call, and the
whole string is formatted. But it sure is hard to read.

Unfortunately, you can't detect this stuff with an AST pass, as implicit concatenation
is done at the parsing phase. I had to detect this with grep:

```console
> grep -l '^[^"]*"[^"]*" "' */package.py
> grep -l "^[^']*'[^']*' '" */package.py
```

- [x] Get rid of nearly all implicit string concatenation in packages

Signed-off-by: Todd Gamblin <tgamblin@llnl.gov>
2025-01-31 20:35:21 -08:00

177 lines
7.5 KiB
Python

# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack.package import *
class Cgal(CMakePackage):
"""The Computational Geometry Algorithms Library (CGAL) is a C++ library
that aims to provide easy access to efficient and reliable algorithms in
computational geometry. CGAL is used in various areas needing geometric
computation, such as geographic information systems, computer aided design,
molecular biology, medical imaging, computer graphics, and robotics.
"""
homepage = "https://www.cgal.org/"
url = "https://github.com/CGAL/cgal/releases/download/v5.4.1/CGAL-5.4.1.tar.xz"
version("6.0.1", sha256="0acdfbf317c556630dd526f3253780f29b6ec9713ee92903e81b5c93c0f59b7f")
version("5.6", sha256="dcab9b08a50a06a7cc2cc69a8a12200f8d8f391b9b8013ae476965c10b45161f")
version("5.5.3", sha256="0a04f662693256328b05babfabb5e3a5b7db2f5a58d52e3c520df9d0828ddd73")
version("5.5.2", sha256="b2b05d5616ecc69facdc24417cce0b04fb4321491d107db45103add520e3d8c3")
version("5.4.1", sha256="4c3dd7ee4d36d237111a4d72b6e14170093271595d5b695148532daa95323d76")
version("5.3.2", sha256="af917dbc550388ebcb206f774e610fbdb914d95a4b2932fa952279129103852b")
version("5.1.5", sha256="b1bb8a6053aa12baa5981aef20a542cd3e617a86826963fb8fb6852b1a0da97c")
version("5.0.3", sha256="e5a3672e35e5e92e3c1b4452cd3c1d554f3177dc512bd98b29edf21866a4288c")
version("5.0", sha256="e1e7e932988c5d149aa471c1afd69915b7603b5b31b9b317a0debb20ecd42dcc")
version("4.13", sha256="3e3dd7a64febda58be54c3cbeba329ab6a73b72d4d7647ba4931ecd1fad0e3bc")
version("4.12", sha256="442ef4fffb2ad6e4141e5a7902993ae6a4e73f7cb641fae1010bb586f6ca5e3f")
version("4.11", sha256="27a7762e5430f5392a1fe12a3a4abdfe667605c40224de1c6599f49d66cfbdd2")
version("4.9.1", sha256="56557da971b5310c2678ffc5def4109266666ff3adc7babbe446797ee2b90cca")
version("4.9", sha256="63ac5df71f912f34f2f0f2e54a303578df51f4ec2627db593a65407d791f9039")
version("4.7", sha256="50bd0a1cad7a8957b09012f831eebaf7d670e2a3467e8f365ec0c71fa5436369")
version("4.6.3", sha256="e338027b8767c0a7a6e4fd8679182d1b83b5b1a0da0a1fe4546e7c0ca094fc21")
depends_on("c", type="build")
depends_on("cxx", type="build")
# @5: is header only and doesn't build shared libs
variant(
"shared", default=True, description="Enables the build of shared libraries", when="@:4.14"
)
variant(
"build_type",
default="Release",
description="The build type to build",
values=("Debug", "Release"),
)
# header only is the default and only option for 5+
# https://doc.cgal.org/latest/Manual/installation.html
variant("header_only", default=False, description="Install in header only mode", when="@:4.13")
# ---- See "7 CGAL Libraries" at:
# https://doc.cgal.org/latest/Manual/installation.html
# The CORE library provides exact arithmetic for geometric computations.
# See: https://cs.nyu.edu/exact/core_pages/
# https://cs.nyu.edu/exact/core_pages/svn-core.html
variant("core", default=False, description="Build the CORE library for algebraic numbers")
variant("imageio", default=False, description="Build utilities to read/write image files")
variant("demos", default=False, description="Build CGAL demos", when="@:5")
variant("eigen", default=True, description="Build with Eigen support")
# Starting with cgal 6, GMP/MPFR are no longer mandatory and Core library
# is based on on Boost.Multiprecision. However, either GMP backend or Boost
# backend can be used. Downstream cmake users must also set -DCGAL_DISABLE_GMP=1
# or the macro CMAKE_OVERRIDDEN_DEFAULT_ENT_BACKEND if GMP is disabled.
# This variant doesn't change how cgal is installed, but it does change spack to
# not depend on gmp & mpfr.
# More details here https://github.com/CGAL/cgal/issues/8606
variant("gmp", default=True, description="Enable the GMP backend", when="@6:")
# Upper bound follows CGAL's @6: CMakeLists.txt
depends_on("cmake@3.12:3.29", type="build", when="@6:")
depends_on("cmake@2.8.11:", type="build", when="@:5")
# Essential Third Party Libraries
depends_on("boost+exception+math+random+container", when="@5.0:")
depends_on("boost@1.72.0:+exception+math+random+container", when="@6:")
depends_on("boost+thread+system", when="@:5.0")
depends_on("gmp", when="@:5")
depends_on("mpfr", when="@:5")
depends_on("gmp", when="@6: +gmp")
depends_on("mpfr", when="@6: +gmp")
# Required for CGAL_ImageIO
# depends_on('opengl', when='+imageio') # not yet in Spack
depends_on("zlib-api")
# Optional to build CGAL_Qt5 (demos)
# depends_on('opengl', when='+demos') # not yet in Spack
depends_on("qt@5:", when="@:5 +demos")
# Demos are now based on qt6, but at the moment qt6 is not in spack
# depends_on("qt@6:", when="@6: +demos")
# Optional Third Party Libraries
depends_on("eigen", when="+eigen")
# depends_on('leda')
# depends_on('mpfi')
# depends_on('rs')
# depends_on('rs3')
# depends_on('ntl')
# depends_on('libqglviewer')
# depends_on('esbtl')
# depends_on('intel-tbb')
# @6: requires C++17 or later. The table gives tested
# compilers, so use the lwoer limit of that as the bounds
# https://www.cgal.org/2024/10/22/cgal601/
with when("@6:"):
# Gnu g++ 11.4.0 or later (on Linux or macOS)
conflicts("%gcc @:11.3.0", when="platform=darwin")
conflicts("%gcc @:11.3.0", when="platform=linux")
# LLVM Clang version 15.0.7 or later (on Linux)
conflicts("%clang @:15.0.6", when="platform=linux")
# Apple Clang compiler versions 10.0.1, 12.0.5, and 15.0.0 (on macOS)
# (10+ has C++17 support)
conflicts("%apple-clang @:10.0.0", when="platform=darwin")
# Visual C++ 15.9 or later
conflicts("%msvc @:15.8", when="platform=windows")
conflicts(
"~header_only",
when="@:4.9",
msg="Header only builds became optional in 4.9, default thereafter",
)
def url_for_version(self, version):
url = "https://github.com/CGAL/cgal/releases/download/"
if version <= Version("5.0.3"):
url += "releases/CGAL-{0}/CGAL-{0}.tar.xz"
else:
url += "v{0}/CGAL-{0}.tar.xz"
return url.format(version)
def setup_build_environment(self, env):
spec = self.spec
env.set("BOOST_INCLUDEDIR", spec["boost"].headers.directories[0])
env.set("BOOST_LIBRARYDIR", spec["boost"].libs.directories[0])
if spec.satisfies("+eigen"):
env.set("EIGEN3_INC_DIR", spec["eigen"].headers.directories[0])
def cmake_args(self):
# Installation instructions:
# https://doc.cgal.org/latest/Manual/installation.html
spec = self.spec
variant_bool = lambda feature: str(feature in spec)
cmake_args = []
cmake_args.append("-DBUILD_SHARED_LIBS:BOOL=%s" % variant_bool("+shared"))
cmake_args.append("-DWITH_CGAL_Core:BOOL=%s" % variant_bool("+core"))
cmake_args.append("-DWITH_CGAL_ImageIO:BOOL=%s" % variant_bool("+imageio"))
cmake_args.append("-DWITH_CGAL_Qt5:BOOL=%s" % variant_bool("+demos"))
if spec.satisfies("@6:"):
cmake_args.append("-DCXX_STANDARD=17")
if spec.satisfies("@4.9:"):
cmake_args.append("-DCGAL_HEADER_ONLY:BOOL=%s" % variant_bool("+header_only"))
if spec.satisfies("~gmp"):
cmake_args.append("-DCGAL_DISABLE_GMP:BOOL=1")
return cmake_args