mirror of https://github.com/CGAL/cgal
Merge remote-tracking branch 'cgal/6.0.x-branch'
This commit is contained in:
commit
36d98614df
|
|
@ -0,0 +1,55 @@
|
||||||
|
# Use an official Fedora as a parent image for the build stage
|
||||||
|
FROM fedora:latest AS sources_deps
|
||||||
|
|
||||||
|
# Set environment variables to non-interactive
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN dnf update -y && dnf install -y \
|
||||||
|
wget \
|
||||||
|
make \
|
||||||
|
gcc \
|
||||||
|
gcc-c++ \
|
||||||
|
patch \
|
||||||
|
cmake \
|
||||||
|
bison \
|
||||||
|
flex \
|
||||||
|
unzip \
|
||||||
|
python3 \
|
||||||
|
&& dnf clean all
|
||||||
|
|
||||||
|
# Copy the patch file to the build context
|
||||||
|
COPY cgal-NO_ADDITIONAL_DETAILS.patch .
|
||||||
|
|
||||||
|
FROM sources_deps AS build
|
||||||
|
|
||||||
|
# Build and install Doxygen from sources
|
||||||
|
ARG DOXYGEN_VERSION=1.9.6
|
||||||
|
ARG MAKEFLAGS=-j$(nproc)
|
||||||
|
RUN if [ -n "$DEBUG"];then set -x && make --version && ls -lZ /tmp && id; fi \
|
||||||
|
&& DOXYGEN_VERSION_UNDERSCORE=$(echo ${DOXYGEN_VERSION} | sed 's/\./_/g') \
|
||||||
|
&& wget https://github.com/doxygen/doxygen/archive/refs/tags/Release_${DOXYGEN_VERSION_UNDERSCORE}.zip \
|
||||||
|
&& unzip Release_${DOXYGEN_VERSION_UNDERSCORE}.zip \
|
||||||
|
&& cd doxygen-Release_${DOXYGEN_VERSION_UNDERSCORE} \
|
||||||
|
&& patch -p1 < ../cgal-NO_ADDITIONAL_DETAILS.patch \
|
||||||
|
&& mkdir build \
|
||||||
|
&& cd build \
|
||||||
|
&& cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release .. \
|
||||||
|
&& cmake --build . \
|
||||||
|
&& cmake --install . \
|
||||||
|
&& mkdir -p /usr/local/share/doc/doxygen && cp ../LICENSE /usr/local/share/doc/doxygen/LICENSE.TXT \
|
||||||
|
&& cd ../.. \
|
||||||
|
&& rm -rf doxygen-Release_${DOXYGEN_VERSION_UNDERSCORE} Release_${DOXYGEN_VERSION_UNDERSCORE}.zip
|
||||||
|
|
||||||
|
# Use a smaller base image for the final stage
|
||||||
|
FROM fedora:latest
|
||||||
|
|
||||||
|
# Install necessary runtime dependencies
|
||||||
|
RUN set -x \
|
||||||
|
&& dnf update -y && dnf install -y graphviz 'perl(Getopt::Std)' tex-bibtex cmake python3-lxml python3-pyquery \
|
||||||
|
&& dnf clean all
|
||||||
|
|
||||||
|
# Copy Doxygen from the build stage
|
||||||
|
COPY --from=build /usr/local/bin/doxygen /usr/local/bin
|
||||||
|
COPY --from=build /usr/local/share/doc/doxygen/LICENSE.TXT /usr/local/share/doc/doxygen/LICENSE.TXT
|
||||||
|
RUN doxygen --version
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
SHELL := /bin/bash
|
||||||
|
DOXYGEN_VERSIONS := 1.12.0 1.11.0 1.10.0 1.9.8 1.9.7 1.9.6
|
||||||
|
|
||||||
|
.PHONY: all build-% push-% build push
|
||||||
|
|
||||||
|
all: build
|
||||||
|
@echo "Use `$(MAKE) push` to push the images to the registry."
|
||||||
|
|
||||||
|
build-%:
|
||||||
|
@echo "MAKEFLAGS: $(MAKEFLAGS)"
|
||||||
|
@echo "Building Doxygen version $*..."
|
||||||
|
if [ "$$(getenforce || true)" == "Enforcing" ]; then Z=:z; else Z=; fi; \
|
||||||
|
F="$(MAKEFLAGS)"; F=$${F##*fifo:}; F=$${F%% *}; \
|
||||||
|
if [ -p "$$F" ]; then echo "The GNU make FIFO file exists:"; ls -l $$F; VOLUME_ARGS="-v $$F:$$F$$Z"; echo -- $$VOLUME_ARGS; fi; \
|
||||||
|
podman build --build-arg DOXYGEN_VERSION=$* --build-arg "MAKEFLAGS=$(MAKEFLAGS)" $$VOLUME_ARGS -t cgal/doxygen:$* .
|
||||||
|
|
||||||
|
push-%: build-%
|
||||||
|
@echo "Pushing cgal/doxygen:$*..."
|
||||||
|
podman push cgal/doxygen:$*
|
||||||
|
|
||||||
|
build: $(foreach version,$(DOXYGEN_VERSIONS),build-$(version))
|
||||||
|
|
||||||
|
push: $(foreach version,$(DOXYGEN_VERSIONS),push-$(version))
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
diff --git a/src/config.xml b/src/config.xml
|
||||||
|
index 13910958a6..31f1354e44 100644
|
||||||
|
--- a/src/config.xml
|
||||||
|
+++ b/src/config.xml
|
||||||
|
@@ -893,6 +893,18 @@ Go to the <a href="commands.html">next</a> section or return to the
|
||||||
|
\note This will also disable the warnings about undocumented members
|
||||||
|
that are normally produced when \ref cfg_warnings "WARNINGS" is
|
||||||
|
set to \c YES.
|
||||||
|
+]]>
|
||||||
|
+ </docs>
|
||||||
|
+ </option>
|
||||||
|
+ </group>
|
||||||
|
+ <group name='Build' docs='Build related configuration options'>
|
||||||
|
+ <option type='bool' id='NO_ADDITIONAL_DETAILS' defval='0'>
|
||||||
|
+ <docs>
|
||||||
|
+<![CDATA[
|
||||||
|
+ When the \c EXTRACT_ALL tag is set to \c YES and a member or class
|
||||||
|
+ as no documentation, no detailed section will be produced if
|
||||||
|
+ the \c NO_ADDITIONAL_DETAILS tag is set to \c YES.
|
||||||
|
+ This tag has no effect if the \c EXTRACT_ALL tag is set to \c NO.
|
||||||
|
]]>
|
||||||
|
</docs>
|
||||||
|
</option>
|
||||||
|
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
|
||||||
|
index 08d9bf24c5..ab04e994c5 100644
|
||||||
|
--- a/src/memberdef.cpp
|
||||||
|
+++ b/src/memberdef.cpp
|
||||||
|
@@ -2501,6 +2501,7 @@ bool MemberDefImpl::hasDetailedDescription() const
|
||||||
|
if (!m_hasDetailedDescriptionCached)
|
||||||
|
{
|
||||||
|
bool extractAll = Config_getBool(EXTRACT_ALL);
|
||||||
|
+ bool xAllNoDetailedSec = Config_getBool(NO_ADDITIONAL_DETAILS);
|
||||||
|
bool alwaysDetailedSec = Config_getBool(ALWAYS_DETAILED_SEC);
|
||||||
|
bool repeatBrief = Config_getBool(REPEAT_BRIEF);
|
||||||
|
bool briefMemberDesc = Config_getBool(BRIEF_MEMBER_DESC);
|
||||||
|
@@ -2512,7 +2513,7 @@ bool MemberDefImpl::hasDetailedDescription() const
|
||||||
|
// the member has detailed documentation because the user added some comments
|
||||||
|
bool docFilter =
|
||||||
|
// extract all is enabled
|
||||||
|
- extractAll ||
|
||||||
|
+ (extractAll && !xAllNoDetailedSec) ||
|
||||||
|
// has detailed docs
|
||||||
|
!documentation().isEmpty() ||
|
||||||
|
// has inbody docs
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"name": "CGAL Doxygen Dev Container, version 1.12.0, with CGAL patch",
|
||||||
|
"image": "docker.io/cgal/doxygen:1.12.0",
|
||||||
|
"features": {
|
||||||
|
"ghcr.io/devcontainers/features/git:1.3.2": {}
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": [
|
||||||
|
"ms-vscode.cmake-tools",
|
||||||
|
"bbenoist.Doxygen",
|
||||||
|
"ms-vscode.cpptools"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
[distrobox-doxygen-1.12.0]
|
||||||
|
image=cgal/doxygen:1.12.0
|
||||||
|
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
|
||||||
|
exported_bins_path=$HOME/.local/bin-doxygen-1.12.0
|
||||||
|
|
||||||
|
[distrobox-doxygen-1.11.0]
|
||||||
|
image=cgal/doxygen:1.11.0
|
||||||
|
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
|
||||||
|
exported_bins_path=$HOME/.local/bin-doxygen-1.11.0
|
||||||
|
|
||||||
|
[distrobox-doxygen-1.10.0]
|
||||||
|
image=cgal/doxygen:1.10.0
|
||||||
|
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
|
||||||
|
exported_bins_path=$HOME/.local/bin-doxygen-1.10.0
|
||||||
|
|
||||||
|
[distrobox-doxygen-1.9.8]
|
||||||
|
image=cgal/doxygen:1.9.8
|
||||||
|
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
|
||||||
|
exported_bins_path=$HOME/.local/bin-doxygen-1.9.8
|
||||||
|
|
||||||
|
[distrobox-doxygen-1.9.7]
|
||||||
|
image=cgal/doxygen:1.9.7
|
||||||
|
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
|
||||||
|
exported_bins_path=$HOME/.local/bin-doxygen-1.9.7
|
||||||
|
|
||||||
|
[distrobox-doxygen-1.9.6]
|
||||||
|
image=cgal/doxygen:1.9.6
|
||||||
|
exported_bins="/usr/local/bin/doxygen /usr/bin/perl /usr/bin/cmake /usr/bin/python3"
|
||||||
|
exported_bins_path=$HOME/.local/bin-doxygen-1.9.6
|
||||||
|
|
@ -178,6 +178,7 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm,
|
||||||
}
|
}
|
||||||
|
|
||||||
// detect if there are some non-manifold umbrellas and fix missing halfedge target pointers
|
// detect if there are some non-manifold umbrellas and fix missing halfedge target pointers
|
||||||
|
std::map<sm_vertex_descriptor, std::vector<tm_halfedge_descriptor>> nm_umbrella_map;
|
||||||
typedef typename std::vector<tm_edge_descriptor>::iterator edge_iterator;
|
typedef typename std::vector<tm_edge_descriptor>::iterator edge_iterator;
|
||||||
for (edge_iterator it=new_edges.begin(); it!=new_edges.end(); ++it)
|
for (edge_iterator it=new_edges.begin(); it!=new_edges.end(); ++it)
|
||||||
{
|
{
|
||||||
|
|
@ -199,10 +200,19 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm,
|
||||||
// we recover tm_v using the halfedge associated to the target vertex of
|
// we recover tm_v using the halfedge associated to the target vertex of
|
||||||
// the halfedge in sm corresponding to nh_t. This is working because we
|
// the halfedge in sm corresponding to nh_t. This is working because we
|
||||||
// set the vertex halfedge pointer to the "same" halfedges.
|
// set the vertex halfedge pointer to the "same" halfedges.
|
||||||
tm_vertex_descriptor tm_v =
|
|
||||||
target( get(hs_to_ht, halfedge(target(get(ht_to_hs, nh_t), sm), sm)), tm);
|
sm_vertex_descriptor vs = target(get(ht_to_hs, nh_t), sm);
|
||||||
for(tm_halfedge_descriptor ht : halfedges_around_target(nh_t, tm))
|
sm_halfedge_descriptor hs = halfedge(vs, sm);
|
||||||
set_target(ht, tm_v, tm);
|
if (hs == boost::graph_traits<SourceMesh>::null_halfedge())
|
||||||
|
{ // special case for Face_filtered_graph with a non-manifold input with not all umbrellas selected
|
||||||
|
nm_umbrella_map[vs].push_back(nh_t);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tm_vertex_descriptor tm_v = target( get(hs_to_ht, hs), tm);
|
||||||
|
for(tm_halfedge_descriptor ht : halfedges_around_target(nh_t, tm))
|
||||||
|
set_target(ht, tm_v, tm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nh_t = opposite(nh_t, tm);
|
nh_t = opposite(nh_t, tm);
|
||||||
}
|
}
|
||||||
|
|
@ -210,6 +220,18 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const auto& vs_and_hts : nm_umbrella_map)
|
||||||
|
{
|
||||||
|
sm_vertex_descriptor v_sm = vs_and_hts.first;
|
||||||
|
tm_vertex_descriptor v_tm = add_vertex(tm);
|
||||||
|
*v2v++=std::make_pair(v_sm, v_tm);
|
||||||
|
set_halfedge(v_tm, vs_and_hts.second.front(), tm);
|
||||||
|
put(tm_vpm, v_tm, conv(get(sm_vpm, v_sm)));
|
||||||
|
|
||||||
|
for (tm_halfedge_descriptor h_tm : vs_and_hts.second)
|
||||||
|
set_target(h_tm, v_tm, tm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end of namespace internal
|
} // end of namespace internal
|
||||||
|
|
|
||||||
|
|
@ -579,6 +579,102 @@ void test_Polyhedron_tetrahedron()
|
||||||
test_mesh<Polyhedron, FCMap, Poly_Adapter>(poly_adapter);
|
test_mesh<Polyhedron, FCMap, Poly_Adapter>(poly_adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void non_manifoldness_test1()
|
||||||
|
{
|
||||||
|
// works out-of-the-box because Face_filtered_graph handles already non-manifold cycles
|
||||||
|
SM mesh;
|
||||||
|
SM::Vertex_index v0=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v1=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v2=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v3=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v4=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v5=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v6=add_vertex(mesh);
|
||||||
|
|
||||||
|
SM::Face_index f0=mesh.add_face(v0,v1,v2);
|
||||||
|
SM::Face_index f1=mesh.add_face(v0,v3,v4);
|
||||||
|
SM::Face_index f2=mesh.add_face(v0,v5,v6);
|
||||||
|
SM::Halfedge_index h = halfedge(f0,mesh);
|
||||||
|
while(target(h, mesh)!=v0)
|
||||||
|
h=next(h,mesh);
|
||||||
|
set_halfedge(v0, h, mesh);
|
||||||
|
|
||||||
|
std::vector<SM::Face_index> selection = {f1, f2};
|
||||||
|
CGAL::Face_filtered_graph<SM> ffg(mesh, selection);
|
||||||
|
|
||||||
|
SM out;
|
||||||
|
CGAL::copy_face_graph(ffg, out);
|
||||||
|
|
||||||
|
assert(vertices(out).size()==5);
|
||||||
|
assert(faces(out).size()==2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void non_manifoldness_test2()
|
||||||
|
{
|
||||||
|
SM mesh;
|
||||||
|
SM::Vertex_index v0=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v0b=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v0t=add_vertex(mesh);
|
||||||
|
|
||||||
|
SM::Vertex_index v1=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v2=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v3=add_vertex(mesh);
|
||||||
|
|
||||||
|
SM::Vertex_index v4=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v5=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v6=add_vertex(mesh);
|
||||||
|
|
||||||
|
SM::Vertex_index v7=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v8=add_vertex(mesh);
|
||||||
|
SM::Vertex_index v9=add_vertex(mesh);
|
||||||
|
|
||||||
|
SM::Face_index f00=mesh.add_face(v1,v2,v0);
|
||||||
|
SM::Face_index f01=mesh.add_face(v2,v3,v0);
|
||||||
|
SM::Face_index f02=mesh.add_face(v3,v1,v0);
|
||||||
|
|
||||||
|
SM::Face_index f10=mesh.add_face(v4,v5,v0b);
|
||||||
|
SM::Face_index f11=mesh.add_face(v5,v6,v0b);
|
||||||
|
SM::Face_index f12=mesh.add_face(v6,v4,v0b);
|
||||||
|
|
||||||
|
SM::Face_index f20=mesh.add_face(v7,v8,v0t);
|
||||||
|
SM::Face_index f21=mesh.add_face(v8,v9,v0t);
|
||||||
|
SM::Face_index f22=mesh.add_face(v9,v7,v0t);
|
||||||
|
|
||||||
|
assert(f00!=SM::Face_index());
|
||||||
|
assert(f01!=SM::Face_index());
|
||||||
|
assert(f02!=SM::Face_index());
|
||||||
|
assert(f10!=SM::Face_index());
|
||||||
|
assert(f11!=SM::Face_index());
|
||||||
|
assert(f12!=SM::Face_index());
|
||||||
|
assert(f20!=SM::Face_index());
|
||||||
|
assert(f21!=SM::Face_index());
|
||||||
|
assert(f22!=SM::Face_index());
|
||||||
|
|
||||||
|
#define UPDATE_V(fX, vX) \
|
||||||
|
{ SM::Halfedge_index h = halfedge(fX,mesh);\
|
||||||
|
while(target(h, mesh)!=vX) h=next(h,mesh);\
|
||||||
|
set_target(h, v0, mesh); }
|
||||||
|
|
||||||
|
UPDATE_V(f10, v0b)
|
||||||
|
UPDATE_V(f11, v0b)
|
||||||
|
UPDATE_V(f12, v0b)
|
||||||
|
UPDATE_V(f20, v0t)
|
||||||
|
UPDATE_V(f21, v0t)
|
||||||
|
UPDATE_V(f22, v0t)
|
||||||
|
|
||||||
|
remove_vertex(v0b, mesh);
|
||||||
|
remove_vertex(v0t, mesh);
|
||||||
|
|
||||||
|
std::vector<SM::Face_index> selection = {f10, f11, f12, f20, f21, f22};
|
||||||
|
CGAL::Face_filtered_graph<SM> ffg(mesh, selection);
|
||||||
|
|
||||||
|
SM out;
|
||||||
|
CGAL::copy_face_graph(ffg, out);
|
||||||
|
|
||||||
|
assert(vertices(out).size()==7);
|
||||||
|
assert(faces(out).size()==6);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
test_graph_range(poly_data());
|
test_graph_range(poly_data());
|
||||||
|
|
@ -590,6 +686,8 @@ int main(int, char**)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
test_invalid_selections();
|
test_invalid_selections();
|
||||||
|
non_manifoldness_test1();
|
||||||
|
non_manifoldness_test2();
|
||||||
|
|
||||||
test_SM_tetrahedron();
|
test_SM_tetrahedron();
|
||||||
test_Polyhedron_tetrahedron();
|
test_Polyhedron_tetrahedron();
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@ else()
|
||||||
set(CGAL_ROOT "${CMAKE_SOURCE_DIR}")
|
set(CGAL_ROOT "${CMAKE_SOURCE_DIR}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.18..3.29) # for list(SORT ... COMPARE NATURAL)
|
||||||
|
|
||||||
find_package(Doxygen REQUIRED)
|
find_package(Doxygen REQUIRED)
|
||||||
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
find_package(Python3 REQUIRED COMPONENTS Interpreter)
|
||||||
|
|
||||||
|
|
@ -32,7 +34,7 @@ if (NOT Python3_EXECUTABLE)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
message(STATUS ${Python3_EXECUTABLE})
|
message(VERBOSE "Using Python version ${Python3_VERSION}: ${Python3_EXECUTABLE}")
|
||||||
|
|
||||||
if(NOT DOXYGEN_FOUND)
|
if(NOT DOXYGEN_FOUND)
|
||||||
message(WARNING "Cannot build the documentation without Doxygen!")
|
message(WARNING "Cannot build the documentation without Doxygen!")
|
||||||
|
|
@ -275,7 +277,7 @@ set(CGAL_DOC_DXY_DIR "${CMAKE_BINARY_DIR}/doc_dxy")
|
||||||
file(MAKE_DIRECTORY "${CGAL_DOC_DXY_DIR}")
|
file(MAKE_DIRECTORY "${CGAL_DOC_DXY_DIR}")
|
||||||
|
|
||||||
#Setting the resource directory depending on the version of doxygen
|
#Setting the resource directory depending on the version of doxygen
|
||||||
set(CGAL_DOC_RESOURCE_DIR_DEFAULT "${CMAKE_CURRENT_LIST_DIR}/resources/1.10.0")
|
set(CGAL_DOC_RESOURCE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/resources")
|
||||||
|
|
||||||
# first look if resources for the specific doxygen version is available, fallback
|
# first look if resources for the specific doxygen version is available, fallback
|
||||||
# on the default otherwise
|
# on the default otherwise
|
||||||
|
|
@ -283,12 +285,46 @@ set(CGAL_DOC_RESOURCE_DIR_DEFAULT "${CMAKE_CURRENT_LIST_DIR}/resources/1.10.0")
|
||||||
#select only the version number (not the commit hash)
|
#select only the version number (not the commit hash)
|
||||||
string(REPLACE " " ";" DOXYGEN_VERSION ${DOXYGEN_VERSION})
|
string(REPLACE " " ";" DOXYGEN_VERSION ${DOXYGEN_VERSION})
|
||||||
list(GET DOXYGEN_VERSION 0 DOXYGEN_VERSION)
|
list(GET DOXYGEN_VERSION 0 DOXYGEN_VERSION)
|
||||||
|
message(VERBOSE "Doxygen version ${DOXYGEN_VERSION}: ${DOXYGEN_EXECUTABLE}")
|
||||||
|
|
||||||
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/resources/${DOXYGEN_VERSION}")
|
# The Doxygen version is search in that sorted list (to find the index for which the version is less or equal)
|
||||||
set(CGAL_DOC_RESOURCE_DIR
|
set(CGAL_DOXYGEN_RESOURCES_VERSIONS 1.8.13 1.9.6 1.10.0)
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/resources/${DOXYGEN_VERSION}")
|
list(SORT CGAL_DOXYGEN_RESOURCES_VERSIONS COMPARE NATURAL)
|
||||||
|
|
||||||
|
# The GLOB is here to check that the list in CGAL_DOXYGEN_RESOURCES_VERSIONS is correct.
|
||||||
|
# CGAL_DOXYGEN_RESOURCES_DIRS is also used below.
|
||||||
|
file(GLOB CGAL_DOXYGEN_RESOURCES_DIRS
|
||||||
|
RELATIVE "${CGAL_DOC_RESOURCE_PREFIX_DIR}"
|
||||||
|
"${CGAL_DOC_RESOURCE_PREFIX_DIR}/*")
|
||||||
|
list(SORT CGAL_DOXYGEN_RESOURCES_DIRS COMPARE NATURAL)
|
||||||
|
|
||||||
|
if(NOT CGAL_DOXYGEN_RESOURCES_DIRS STREQUAL CGAL_DOXYGEN_RESOURCES_VERSIONS)
|
||||||
|
message(FATAL "The directories in ${CGAL_DOC_RESOURCE_PREFIX_DIR} do not match the
|
||||||
|
expected versions: [${CGAL_DOXYGEN_RESOURCES_VERSIONS}] vs [${CGAL_DOXYGEN_RESOURCES_DIRS}]")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
function(CGAL_insert_in_sorted_list list_name value)
|
||||||
|
set(list ${${list_name}})
|
||||||
|
if(NOT value IN_LIST list)
|
||||||
|
list(APPEND list "${value}")
|
||||||
|
list(SORT list COMPARE NATURAL)
|
||||||
|
endif()
|
||||||
|
set(${list_name} ${list} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
if(DOXYGEN_VERSION IN_LIST CGAL_DOXYGEN_RESOURCES_VERSIONS)
|
||||||
|
list(FIND CGAL_DOXYGEN_RESOURCES_VERSIONS "${DOXYGEN_VERSION}" DOXYGEN_VERSION_INDEX)
|
||||||
else()
|
else()
|
||||||
set(CGAL_DOC_RESOURCE_DIR "${CGAL_DOC_RESOURCE_DIR_DEFAULT}")
|
CGAL_insert_in_sorted_list(CGAL_DOXYGEN_RESOURCES_VERSIONS ${DOXYGEN_VERSION})
|
||||||
|
list(FIND CGAL_DOXYGEN_RESOURCES_VERSIONS ${DOXYGEN_VERSION} DOXYGEN_VERSION_INDEX)
|
||||||
|
math(EXPR DOXYGEN_VERSION_INDEX "${DOXYGEN_VERSION_INDEX} - 1")
|
||||||
|
endif()
|
||||||
|
list(GET CGAL_DOXYGEN_RESOURCES_DIRS "${DOXYGEN_VERSION_INDEX}" CGAL_DOC_RESOURCE_DIR)
|
||||||
|
set(CGAL_DOC_RESOURCE_DIR "${CGAL_DOC_RESOURCE_PREFIX_DIR}/${CGAL_DOC_RESOURCE_DIR}")
|
||||||
|
if(NOT EXISTS "${CGAL_DOC_RESOURCE_DIR}")
|
||||||
|
message(FATAL_ERROR "Doxygen resources for version ${DOXYGEN_VERSION} not found")
|
||||||
|
else()
|
||||||
|
message(VERBOSE "Using Doxygen resources from ${CGAL_DOC_RESOURCE_DIR}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CGAL_DOC_BIBLIO_DIR "${CMAKE_CURRENT_LIST_DIR}/biblio")
|
set(CGAL_DOC_BIBLIO_DIR "${CMAKE_CURRENT_LIST_DIR}/biblio")
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,6 @@ These options should suffice to create a `CMakeLists.txt` script
|
||||||
for most directories containing programs. However, in some special
|
for most directories containing programs. However, in some special
|
||||||
cases, it might still be required to create the script manually, for
|
cases, it might still be required to create the script manually, for
|
||||||
instance, if some source files/executables need a different linking than
|
instance, if some source files/executables need a different linking than
|
||||||
other source files. The Section \subpage devman_create_and_use_a_cmakelist provides more details.
|
other source files. The Section \ref devman_create_and_use_a_cmakelist provides more details.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -23,4 +23,5 @@ The developer manual is primarily aimed at \cgal developers, but may also be int
|
||||||
- \subpage devman_info
|
- \subpage devman_info
|
||||||
- \subpage devman_create_cgal_CMakeLists
|
- \subpage devman_create_cgal_CMakeLists
|
||||||
- \subpage deprecated
|
- \subpage deprecated
|
||||||
|
- \subpage Doxygen_for_CGAL
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ FILTER_PATTERNS = *.txt=${CMAKE_BINARY_DIR}/pkglist_filter
|
||||||
|
|
||||||
HTML_EXTRA_FILES += ${CGAL_DOC_RESOURCE_DIR}/hacks.js \
|
HTML_EXTRA_FILES += ${CGAL_DOC_RESOURCE_DIR}/hacks.js \
|
||||||
${CGAL_DOC_RESOURCE_DIR}/menu_version.js \
|
${CGAL_DOC_RESOURCE_DIR}/menu_version.js \
|
||||||
|
${CGAL_DOC_RESOURCE_DIR}/cgal_stylesheet.css \
|
||||||
${CMAKE_BINARY_DIR}/how_to_cite_cgal.bib \
|
${CMAKE_BINARY_DIR}/how_to_cite_cgal.bib \
|
||||||
${CMAKE_BINARY_DIR}/how_to_cite.html \
|
${CMAKE_BINARY_DIR}/how_to_cite.html \
|
||||||
${CGAL_PACKAGE_DOC_DIR}/fig/g-196x196-doc.png
|
${CGAL_PACKAGE_DOC_DIR}/fig/g-196x196-doc.png
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
# Doxygen for CGAL #
|
\page Doxygen_for_CGAL Doxygen for CGAL
|
||||||
|
|
||||||
This is the documentation of doxygen hacks that are applied to make
|
This is the documentation of doxygen hacks that are applied to make
|
||||||
the output of Doxygen more suitable to CGAL. It explains the general
|
the output of Doxygen more suitable to CGAL. It explains the general
|
||||||
|
|
@ -14,17 +14,17 @@ hacks that create what you see.
|
||||||
### Package Overview ###
|
### Package Overview ###
|
||||||
|
|
||||||
The package overview is build by having a special command that is
|
The package overview is build by having a special command that is
|
||||||
filtered by the python script pkglist_filter.py.
|
filtered by the python script `pkglist_filter.py`.
|
||||||
|
|
||||||
A command has to be of the form \package_listing{PKG_NAME}, where
|
A command has to be of the form `\package_listing{PKG_NAME}`, where
|
||||||
PKG_NAME cannot contain a closing }.
|
`PKG_NAME` cannot contain a closing `}`.
|
||||||
|
|
||||||
The command is replaced by the text between the two delimiters
|
The command is replaced by the text between the two delimiters
|
||||||
PkgDescBegin and PkgDescEnd in the file ../PKG_NAME/doc/PKG_NAME/PackageDescription.txt
|
`cgalPkgDescriptionBegin` and `cgalPkgDescriptionEnd` in the file `../PKG_NAME/doc/PKG_NAME/PackageDescription.txt`
|
||||||
|
|
||||||
If PKG_NAME is of the form A/B the selected file is
|
If `PKG_NAME` is of the form `A/B` the selected file is
|
||||||
../A/doc/B/PackageDescription.txt. This is to support packages like
|
`../A/doc/B/PackageDescription.txt`. This is to support packages like
|
||||||
TDS_2, which don't reside in their own packages in the SCM.
|
`TDS_2`, which don't reside in their own packages in the SCM.
|
||||||
|
|
||||||
### Footnotes ###
|
### Footnotes ###
|
||||||
|
|
||||||
|
|
@ -50,13 +50,13 @@ LaTex.
|
||||||
This hack fiddles with the internal structures and functions of the
|
This hack fiddles with the internal structures and functions of the
|
||||||
treeview to remove the unnecessary intermediate top-level module part.
|
treeview to remove the unnecessary intermediate top-level module part.
|
||||||
|
|
||||||
It assigns the first element of the module array (found in module.js)
|
It assigns the first element of the module array (found in `module.js`)
|
||||||
to the Reference Manual entry. This makes the tree view link go to
|
to the Reference Manual entry. This makes the tree view link go to
|
||||||
that group directly instead of the intermediate link. It also removes
|
that group directly instead of the intermediate link. It also removes
|
||||||
one level of nesting.
|
one level of nesting.
|
||||||
|
|
||||||
Unfortunately this changes the overall tree structure. To adjust for
|
Unfortunately this changes the overall tree structure. To adjust for
|
||||||
that we hijack the gotoNode function of navtree.js and *augment* it
|
that we hijack the `gotoNode` function of `navtree.js` and *augment* it
|
||||||
with an additional check for the specific tree level we borked and
|
with an additional check for the specific tree level we borked and
|
||||||
redirect it.
|
redirect it.
|
||||||
|
|
||||||
|
|
@ -486,24 +486,6 @@ HTML_HEADER = ${CGAL_DOC_HEADER_PACKAGE}
|
||||||
|
|
||||||
HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html
|
HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html
|
||||||
|
|
||||||
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
|
|
||||||
# cascading style sheets that are included after the standard style sheets
|
|
||||||
# created by doxygen. Using this option one can overrule certain style aspects.
|
|
||||||
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
|
||||||
# standard style sheet and is therefore more robust against future updates.
|
|
||||||
# Doxygen will copy the style sheet files to the output directory.
|
|
||||||
# Note: The order of the extra style sheet files is of importance (e.g. the last
|
|
||||||
# style sheet in the list overrules the setting of the previous ones in the
|
|
||||||
# list).
|
|
||||||
# Note: Since the styling of scrollbars can currently not be overruled in
|
|
||||||
# Webkit/Chromium, the styling will be left out of the default doxygen.css if
|
|
||||||
# one or more extra stylesheets have been specified. So if scrollbar
|
|
||||||
# customization is desired it has to be added explicitly. For an example see the
|
|
||||||
# documentation.
|
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
|
||||||
|
|
||||||
HTML_EXTRA_STYLESHEET = ${CGAL_DOC_RESOURCE_DIR}/cgal_stylesheet.css
|
|
||||||
|
|
||||||
# Doxygen stores a couple of settings persistently in the browser (via e.g.
|
# Doxygen stores a couple of settings persistently in the browser (via e.g.
|
||||||
# cookies). By default these settings apply to all HTML pages generated by
|
# cookies). By default these settings apply to all HTML pages generated by
|
||||||
# doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store
|
# doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ $search
|
||||||
$mathjax
|
$mathjax
|
||||||
$darkmode
|
$darkmode
|
||||||
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
||||||
$extrastylesheet
|
$extrastylesheet
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@
|
||||||
<script type="text/javascript" src="../Manual/search/search.js"></script>
|
<script type="text/javascript" src="../Manual/search/search.js"></script>
|
||||||
<!-- Manually done below. -->
|
<!-- Manually done below. -->
|
||||||
<link href="$relpath^../Manual/$stylesheet" rel="stylesheet" type="text/css" />
|
<link href="$relpath^../Manual/$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
||||||
$mathjax
|
$mathjax
|
||||||
$darkmode
|
$darkmode
|
||||||
<script src="$relpath^topics.js" type="text/javascript"></script>
|
<script src="$relpath^topics.js" type="text/javascript"></script>
|
||||||
|
|
|
||||||
|
|
@ -477,24 +477,6 @@ HTML_HEADER = ${CGAL_DOC_HEADER_PACKAGE}
|
||||||
|
|
||||||
HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html
|
HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html
|
||||||
|
|
||||||
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
|
|
||||||
# cascading style sheets that are included after the standard style sheets
|
|
||||||
# created by doxygen. Using this option one can overrule certain style aspects.
|
|
||||||
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
|
||||||
# standard style sheet and is therefore more robust against future updates.
|
|
||||||
# Doxygen will copy the style sheet files to the output directory.
|
|
||||||
# Note: The order of the extra style sheet files is of importance (e.g. the last
|
|
||||||
# style sheet in the list overrules the setting of the previous ones in the
|
|
||||||
# list).
|
|
||||||
# Note: Since the styling of scrollbars can currently not be overruled in
|
|
||||||
# Webkit/Chromium, the styling will be left out of the default doxygen.css if
|
|
||||||
# one or more extra stylesheets have been specified. So if scrollbar
|
|
||||||
# customization is desired it has to be added explicitly. For an example see the
|
|
||||||
# documentation.
|
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
|
||||||
|
|
||||||
HTML_EXTRA_STYLESHEET = ${CGAL_DOC_RESOURCE_DIR}/cgal_stylesheet.css
|
|
||||||
|
|
||||||
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
|
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
|
||||||
# page will contain the date and time when the page was generated. Setting this
|
# page will contain the date and time when the page was generated. Setting this
|
||||||
# to YES can help to show when doxygen was last run and thus if the
|
# to YES can help to show when doxygen was last run and thus if the
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ $treeview
|
||||||
$search
|
$search
|
||||||
$mathjax
|
$mathjax
|
||||||
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
<!-- This should probably be an extrastylesheet instead of hardcoded. -->
|
|
||||||
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
||||||
$extrastylesheet
|
$extrastylesheet
|
||||||
</head>
|
</head>
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,6 @@
|
||||||
<script type="text/javascript" src="../Manual/search/search.js"></script>
|
<script type="text/javascript" src="../Manual/search/search.js"></script>
|
||||||
<!-- Manually done below. -->
|
<!-- Manually done below. -->
|
||||||
<link href="$relpath^../Manual/$stylesheet" rel="stylesheet" type="text/css" />
|
<link href="$relpath^../Manual/$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
<!-- This should probably be an extrastylesheet instead of hardcoded. -->
|
|
||||||
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
||||||
<script type="text/x-mathjax-config">
|
<script type="text/x-mathjax-config">
|
||||||
MathJax.Hub.Config({
|
MathJax.Hub.Config({
|
||||||
|
|
|
||||||
|
|
@ -486,24 +486,6 @@ HTML_HEADER = ${CGAL_DOC_HEADER_PACKAGE}
|
||||||
|
|
||||||
HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html
|
HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html
|
||||||
|
|
||||||
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
|
|
||||||
# cascading style sheets that are included after the standard style sheets
|
|
||||||
# created by doxygen. Using this option one can overrule certain style aspects.
|
|
||||||
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
|
||||||
# standard style sheet and is therefore more robust against future updates.
|
|
||||||
# Doxygen will copy the style sheet files to the output directory.
|
|
||||||
# Note: The order of the extra style sheet files is of importance (e.g. the last
|
|
||||||
# style sheet in the list overrules the setting of the previous ones in the
|
|
||||||
# list).
|
|
||||||
# Note: Since the styling of scrollbars can currently not be overruled in
|
|
||||||
# Webkit/Chromium, the styling will be left out of the default doxygen.css if
|
|
||||||
# one or more extra stylesheets have been specified. So if scrollbar
|
|
||||||
# customization is desired it has to be added explicitly. For an example see the
|
|
||||||
# documentation.
|
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
|
||||||
|
|
||||||
HTML_EXTRA_STYLESHEET = ${CGAL_DOC_RESOURCE_DIR}/cgal_stylesheet.css
|
|
||||||
|
|
||||||
# If you want full control over the layout of the generated HTML pages it might
|
# If you want full control over the layout of the generated HTML pages it might
|
||||||
# be necessary to disable the index and replace it with your own. The
|
# be necessary to disable the index and replace it with your own. The
|
||||||
# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
|
# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@ $search
|
||||||
$mathjax
|
$mathjax
|
||||||
$darkmode
|
$darkmode
|
||||||
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
<!-- This should probably be an extrastylesheet instead of hardcoded. -->
|
|
||||||
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
||||||
$extrastylesheet
|
$extrastylesheet
|
||||||
</head>
|
</head>
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,6 @@
|
||||||
<script type="text/javascript" src="../Manual/search/search.js"></script>
|
<script type="text/javascript" src="../Manual/search/search.js"></script>
|
||||||
<!-- Manually done below. -->
|
<!-- Manually done below. -->
|
||||||
<link href="$relpath^../Manual/$stylesheet" rel="stylesheet" type="text/css" />
|
<link href="$relpath^../Manual/$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
<!-- This should probably be an extrastylesheet instead of hardcoded. -->
|
|
||||||
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
<link href="$relpath$../Manual/cgal_stylesheet.css" rel="stylesheet" type="text/css" />
|
||||||
$mathjax
|
$mathjax
|
||||||
$darkmode
|
$darkmode
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import codecs
|
import codecs
|
||||||
import re
|
import re
|
||||||
|
|
@ -28,16 +28,10 @@ def main(argv):
|
||||||
for l in pkgdesc:
|
for l in pkgdesc:
|
||||||
do_print = do_print or re.match(".*cgalPkgDescriptionBegin.*", l)
|
do_print = do_print or re.match(".*cgalPkgDescriptionBegin.*", l)
|
||||||
if(do_print):
|
if(do_print):
|
||||||
if hasattr(sys.stdout, 'buffer'):
|
sys.stdout.buffer.write(l.encode('utf-8'))
|
||||||
sys.stdout.buffer.write(l.encode('utf-8')) #python3
|
|
||||||
else:
|
|
||||||
sys.stdout.write(l.encode('utf-8')) #python2
|
|
||||||
do_print = do_print and (not re.match(".*cgalPkgDescriptionEnd.*", l))
|
do_print = do_print and (not re.match(".*cgalPkgDescriptionEnd.*", l))
|
||||||
else:
|
else:
|
||||||
if hasattr(sys.stdout, 'buffer'):
|
sys.stdout.buffer.write(line.encode('utf-8'))
|
||||||
sys.stdout.buffer.write(line.encode('utf-8')) #python3
|
|
||||||
else:
|
|
||||||
sys.stdout.write(line.encode('utf-8')) #python2
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main(sys.argv)
|
main(sys.argv)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue