summaryrefslogtreecommitdiff
path: root/graphics/asymptote/cmake-scripts
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/cmake-scripts')
-rw-r--r--graphics/asymptote/cmake-scripts/asy-base-files.cmake78
-rw-r--r--graphics/asymptote/cmake-scripts/asy-files.cmake33
-rw-r--r--graphics/asymptote/cmake-scripts/asy-macro.cmake50
-rw-r--r--graphics/asymptote/cmake-scripts/backport-libs.cmake11
-rw-r--r--graphics/asymptote/cmake-scripts/basic-parameters.cmake6
-rw-r--r--graphics/asymptote/cmake-scripts/buildfiles-to-src.cmake4
-rw-r--r--graphics/asymptote/cmake-scripts/common.cmake6
-rw-r--r--graphics/asymptote/cmake-scripts/compiler-config.cmake15
-rw-r--r--graphics/asymptote/cmake-scripts/docgen.cmake305
-rw-r--r--graphics/asymptote/cmake-scripts/external-libs.cmake316
-rw-r--r--graphics/asymptote/cmake-scripts/generated-files.cmake224
-rw-r--r--graphics/asymptote/cmake-scripts/gnu-install-macros.cmake16
-rw-r--r--graphics/asymptote/cmake-scripts/options.cmake271
-rw-r--r--graphics/asymptote/cmake-scripts/tests-asy.cmake96
-rw-r--r--graphics/asymptote/cmake-scripts/thirdparty-impl.cmake6
-rw-r--r--graphics/asymptote/cmake-scripts/vcpkg-features.cmake39
-rw-r--r--graphics/asymptote/cmake-scripts/win32-pre-nsis-installer.cmake174
-rw-r--r--graphics/asymptote/cmake-scripts/win32-specific.cmake100
18 files changed, 1750 insertions, 0 deletions
diff --git a/graphics/asymptote/cmake-scripts/asy-base-files.cmake b/graphics/asymptote/cmake-scripts/asy-base-files.cmake
new file mode 100644
index 0000000000..0622c21cb4
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/asy-base-files.cmake
@@ -0,0 +1,78 @@
+set(ASY_STATIC_BASE_FILES
+ animate animation annotate babel bezulate binarytree bsp CAD colormap
+ contour3 contour drawtree embed external feynman flowchart fontsize
+ geometry graph3 graph graph_settings graph_splinetype grid3 interpolate
+ labelpath3 labelpath lmfit map mapArray markers math metapost obj ode palette patterns
+ plain_arcs plain_arrows plain plain_bounds plain_boxes plain_constants plain_debugger
+ plain_filldraw plain_Label plain_margins plain_markers plain_paths plain_pens
+ plain_picture plain_prethree plain_scaling plain_shipout plain_strings pstoedit rational rationalSimplex
+ roundedpath simplex size10 size11 slide slopefield smoothcontour3 solids stats syzygy simplex2
+ texcolors three_arrows three three_light three_margins three_surface three_tube tree
+ trembling tube v3d x11colors
+)
+
+set(ASY_STATIC_SHADER_FILES
+ blend compress count fragment screen sum1 sum2 sum2fast
+ sum3 vertex zero
+)
+
+set(OTHER_STATIC_BASE_FILES nopapersize.ps)
+
+# base dir
+set(ASY_SOURCE_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/base)
+set(ASY_BUILD_BASE_DIR ${CMAKE_CURRENT_BINARY_DIR}/base)
+
+file(MAKE_DIRECTORY ${ASY_BUILD_BASE_DIR})
+
+# version.asy
+configure_file(${ASY_RESOURCE_DIR}/versionTemplate.asy.in ${ASY_BUILD_BASE_DIR}/version.asy)
+list(APPEND ASY_OUTPUT_BASE_FILES ${ASY_BUILD_BASE_DIR}/version.asy)
+
+# copy base files to build dir
+macro (copy_base_file_with_custom_output_name base_file_name output_file_name)
+ add_custom_command(
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${ASY_SOURCE_BASE_DIR}/${base_file_name}
+ ${ASY_BUILD_BASE_DIR}/${output_file_name}
+ OUTPUT ${ASY_BUILD_BASE_DIR}/${output_file_name}
+ MAIN_DEPENDENCY ${ASY_SOURCE_BASE_DIR}/${base_file_name}
+ )
+
+ list(APPEND ASY_OUTPUT_BASE_FILES ${ASY_BUILD_BASE_DIR}/${output_file_name})
+endmacro()
+
+macro (copy_base_file base_file_name)
+ copy_base_file_with_custom_output_name(${base_file_name} ${base_file_name})
+endmacro()
+
+foreach(ASY_STATIC_BASE_FILE ${ASY_STATIC_BASE_FILES})
+ copy_base_file(${ASY_STATIC_BASE_FILE}.asy)
+endforeach ()
+
+foreach(OTHER_STATIC_BASE_FILE ${OTHER_STATIC_BASE_FILES})
+ copy_base_file(${OTHER_STATIC_BASE_FILE})
+endforeach ()
+
+file(MAKE_DIRECTORY ${ASY_BUILD_BASE_DIR}/shaders)
+foreach(ASY_STATIC_SHADER_FILE ${ASY_STATIC_SHADER_FILES})
+ copy_base_file(shaders/${ASY_STATIC_SHADER_FILE}.glsl)
+endforeach ()
+
+# generated csv files
+foreach(csv_enum_file ${ASY_CSV_ENUM_FILES})
+ add_custom_command(
+ OUTPUT ${ASY_BUILD_BASE_DIR}/${csv_enum_file}.asy
+ COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/generate_enums.py
+ --language asy
+ --name ${csv_enum_file}
+ --input ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv
+ --output ${ASY_BUILD_BASE_DIR}/${csv_enum_file}.asy
+ MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv
+ )
+
+ list(APPEND ASY_OUTPUT_BASE_FILES ${ASY_BUILD_BASE_DIR}/${csv_enum_file}.asy)
+endforeach ()
+
+# asygl
+file(MAKE_DIRECTORY ${ASY_BUILD_BASE_DIR}/webgl)
+copy_base_file_with_custom_output_name(webgl/asygl-${ASY_GL_VERSION}.js webgl/asygl.js)
diff --git a/graphics/asymptote/cmake-scripts/asy-files.cmake b/graphics/asymptote/cmake-scripts/asy-files.cmake
new file mode 100644
index 0000000000..57e47fe38b
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/asy-files.cmake
@@ -0,0 +1,33 @@
+set(ASYMPTOTE_INCLUDES ${ASY_INCLUDE_DIR})
+set(CAMP_BUILD_FILES
+ camperror path drawpath drawlabel picture psfile texfile util settings
+ guide flatguide knot drawfill path3 drawpath3 drawsurface
+ beziercurve bezierpatch pen pipestream
+)
+
+set(RUNTIME_BUILD_FILES
+ runtime runbacktrace runpicture runlabel runhistory runarray
+ runfile runsystem runpair runtriple runpath runpath3d runstring
+ runmath
+)
+
+set(SYMBOL_STATIC_BUILD_FILES types builtin gsl)
+set(SYMBOL_BUILD_FILES ${RUNTIME_BUILD_FILES} ${SYMBOL_STATIC_BUILD_FILES})
+
+set(GENERATED_SOURCE_BUILD_FILES
+ ${SYMBOL_BUILD_FILES} camp.tab lex.yy
+)
+
+set(CORE_BUILD_FILES
+ ${CAMP_BUILD_FILES} ${SYMBOL_STATIC_BUILD_FILES}
+ env genv stm dec errormsg
+ callable name symbol entry exp newexp stack exithandlers
+ access virtualfieldaccess absyn record interact fileio
+ fftw++asy parallel simpson coder coenv impdatum locate asyparser program application
+ varinit fundec refaccess envcompleter asyprocess constructor array memory
+ Delaunay predicates glrender tr shaders jsfile v3dfile
+ EXRFiles GLTextures lspserv symbolmaps win32helpers win32pipestream
+ win32xdr xstream
+)
+
+set(ASY_CSV_ENUM_FILES v3dtypes v3dheadertypes)
diff --git a/graphics/asymptote/cmake-scripts/asy-macro.cmake b/graphics/asymptote/cmake-scripts/asy-macro.cmake
new file mode 100644
index 0000000000..e21af7d406
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/asy-macro.cmake
@@ -0,0 +1,50 @@
+if (NOT ASY_VERSION_OVERRIDE)
+if (ASY_ADDR_VERSION_SUFFIX_FILE STREQUAL "NOTFOUND")
+ if (CMAKE_BUILD_TYPE IN_LIST cmake_debug_build_types)
+ set(ASY_VERSION_SUFFIX "+debug")
+ endif()
+endif()
+
+set(ASY_VERSION "${ASY_VERSION_BASE}${ASY_VERSION_SUFFIX}")
+else()
+ message(STATUS "Override version specified")
+ set(ASY_VERSION ${ASY_VERSION_OVERRIDE})
+endif()
+
+message(STATUS "Asymptote version: ${ASY_VERSION}")
+
+
+list(APPEND ASY_MACROS
+ PACKAGE_NAME="${ASY_PACKAGE_NAME}"
+ PACKAGE_VERSION="${ASY_VERSION}"
+ PACKAGE_BUGREPORT="${ASY_BUGREPORT}"
+ PACKAGE_STRING="${ASY_PACKAGE_NAME} ${ASY_VERSION}"
+)
+
+# Since we require C++11 and up, some macros are automatically included
+list(APPEND ASY_MACROS
+ HAVE_UNORDERED_MAP
+ HAVE_STRFTIME
+ _USE_MATH_DEFINES
+)
+
+if (DEBUG_GC_ENABLE)
+ list(APPEND ASY_MACROS GC_DEBUG)
+endif()
+
+if (DEBUG_GC_BACKTRACE_ENABLE)
+ list(APPEND ASY_MACROS GC_BACKTRACE)
+endif()
+
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ list(APPEND ASY_MACROS LINUX_SYSTEM)
+endif()
+
+if (CMAKE_BUILD_TYPE IN_LIST cmake_debug_build_types)
+ list(APPEND ASY_MACROS DEBUG)
+endif()
+
+if (CTAN_BUILD)
+ list(APPEND ASY_MACROS CTAN_BUILD)
+endif()
diff --git a/graphics/asymptote/cmake-scripts/backport-libs.cmake b/graphics/asymptote/cmake-scripts/backport-libs.cmake
new file mode 100644
index 0000000000..416f9cc3a0
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/backport-libs.cmake
@@ -0,0 +1,11 @@
+add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backports/optional)
+
+list(APPEND ASY_STATIC_LIBARIES OptionalBackport)
+
+if (ENABLE_OPENGL)
+ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backports/glew)
+ # using glew within the repo
+ list(APPEND ASY_STATIC_LIBARIES GLEW)
+
+ list(APPEND ASYMPTOTE_INCLUDES $<TARGET_PROPERTY:GLEW,INCLUDE_DIRECTORIES>)
+endif()
diff --git a/graphics/asymptote/cmake-scripts/basic-parameters.cmake b/graphics/asymptote/cmake-scripts/basic-parameters.cmake
new file mode 100644
index 0000000000..d2d50842bd
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/basic-parameters.cmake
@@ -0,0 +1,6 @@
+set(ASY_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ASY_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ASY_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ASY_SRC_TEMPLATES_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ASY_SCRIPTS_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(ASY_DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/doc)
diff --git a/graphics/asymptote/cmake-scripts/buildfiles-to-src.cmake b/graphics/asymptote/cmake-scripts/buildfiles-to-src.cmake
new file mode 100644
index 0000000000..de9d412292
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/buildfiles-to-src.cmake
@@ -0,0 +1,4 @@
+macro(build_files_to_src in_var out_var)
+ list(TRANSFORM ${in_var} PREPEND ${ASY_SRC_DIR}/ OUTPUT_VARIABLE ${out_var})
+ list(TRANSFORM ${out_var} APPEND .cc)
+endmacro()
diff --git a/graphics/asymptote/cmake-scripts/common.cmake b/graphics/asymptote/cmake-scripts/common.cmake
new file mode 100644
index 0000000000..8316f7182d
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/common.cmake
@@ -0,0 +1,6 @@
+macro(TODO_NOTIMPL message)
+ message(FATAL_ERROR "TODO: ${message}")
+endmacro()
+
+set(cmake_release_build_types Release RelWithDebInfo MinSizeRel)
+set(cmake_debug_build_types Debug)
diff --git a/graphics/asymptote/cmake-scripts/compiler-config.cmake b/graphics/asymptote/cmake-scripts/compiler-config.cmake
new file mode 100644
index 0000000000..852f0a50b5
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/compiler-config.cmake
@@ -0,0 +1,15 @@
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
+
+if (OPTIMIZE_LINK_TIME)
+ include(CheckIPOSupported)
+
+ check_ipo_supported(RESULT ipo_supported_result LANGUAGES C CXX)
+
+ if (ipo_supported_result)
+ set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
+ message(STATUS "Using link-time optimization")
+ else()
+ message(FATAL_ERROR "Compiler does not support link-time optimization")
+ endif()
+endif()
diff --git a/graphics/asymptote/cmake-scripts/docgen.cmake b/graphics/asymptote/cmake-scripts/docgen.cmake
new file mode 100644
index 0000000000..87c2c0199a
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/docgen.cmake
@@ -0,0 +1,305 @@
+if (NOT ENABLE_DOCGEN)
+ message(FATAL_ERROR "Documentation generation is disabled")
+endif()
+
+set(ASY_TEX_BUILD_ROOT ${CMAKE_CURRENT_BINARY_DIR}/docbuild)
+file(MAKE_DIRECTORY ${ASY_TEX_BUILD_ROOT})
+configure_file(${ASY_RESOURCE_DIR}/version.texi.in ${ASY_TEX_BUILD_ROOT}/version.texi)
+
+set(LATEX_ARTIFRACT_EXTENSIONS aux hd idx ins log out toc)
+
+set(PDFLATEX_BASE_ARGUMENTS ${PDFLATEX_COMPILER}
+ -output-directory=${ASY_TEX_BUILD_ROOT}
+)
+
+find_package(LATEX COMPONENTS PDFLATEX REQUIRED)
+list(
+ TRANSFORM LATEX_ARTIFRACT_EXTENSIONS
+ PREPEND ${ASY_TEX_BUILD_ROOT}/asy-latex.
+ OUTPUT_VARIABLE ASY_LATEX_DTX_ARTIFACTS
+)
+
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/asy-latex.pdf ${ASY_TEX_BUILD_ROOT}/asymptote.sty
+ DEPENDS ${ASY_DOC_DIR}/asy-latex.dtx
+ COMMAND ${PDFLATEX_BASE_ARGUMENTS} ${ASY_DOC_DIR}/asy-latex.dtx
+ WORKING_DIRECTORY ${ASY_DOC_DIR}
+ BYPRODUCTS ${ASY_LATEX_DTX_ARTIFACTS}
+)
+
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/latexusage.pdf
+ DEPENDS
+ ${ASY_DOC_DIR}/latexusage.tex
+ ${ASY_TEX_BUILD_ROOT}/asymptote.sty
+ asy ${ASY_OUTPUT_BASE_FILES}
+ COMMAND ${PY3_INTERPRETER} ${ASY_DOC_DIR}/build-latexusage-pdf.py
+ --build-dir=${ASY_TEX_BUILD_ROOT}
+ --latexusage-source-dir=${ASY_DOC_DIR}
+ --pdflatex-executable=${PDFLATEX_COMPILER}
+ --asy-executable=$<TARGET_FILE:asy>
+ --asy-base-dir=${ASY_BUILD_BASE_DIR}
+ WORKING_DIRECTORY ${ASY_DOC_DIR}
+ BYPRODUCTS ${ASY_TEX_BUILD_ROOT}/latexusage.log
+)
+
+set(CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS ${CMAKE_COMMAND} -E copy -t ${ASY_TEX_BUILD_ROOT})
+set(CMAKE_RM_BASE_ARGUMENTS ${CMAKE_COMMAND} -E rm)
+set(ASY_BASE_ARGUMENTS asy -dir ${ASY_BUILD_BASE_DIR} -config '' -render=0 -noprc -noV)
+
+macro(add_additional_pdf_outputs filename_base num_times_to_call_pdflatex compiler)
+ # ARGN can be used to specify additional dependencies
+ foreach (DUMMY_VAR RANGE 1 ${num_times_to_call_pdflatex})
+ list(APPEND COMMAND_ARGS COMMAND ${compiler} ${ASY_DOC_DIR}/${filename_base}.tex)
+ endforeach()
+
+ set(PDFLATEX_OUTPUT_PREFIX ${ASY_TEX_BUILD_ROOT}/${filename_base})
+
+ # there are unfortunately still some issues with out-of-source builds
+ # with pdflatex, hence we have to copy the files to the build root first
+ add_custom_command(
+ OUTPUT ${PDFLATEX_OUTPUT_PREFIX}.tex
+ DEPENDS ${ASY_DOC_DIR}/${filename_base}.tex
+ COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${filename_base}.tex
+ )
+
+ add_custom_command(
+ OUTPUT ${PDFLATEX_OUTPUT_PREFIX}.pdf
+ DEPENDS ${PDFLATEX_OUTPUT_PREFIX}.tex
+ ${ARGN}
+ ${COMMAND_ARGS}
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f ${PDFLATEX_OUTPUT_PREFIX}.dvi
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ BYPRODUCTS
+ ${PDFLATEX_OUTPUT_PREFIX}.aux
+ ${PDFLATEX_OUTPUT_PREFIX}.log
+ ${PDFLATEX_OUTPUT_PREFIX}.toc
+ )
+endmacro()
+
+# asy -> pdf file generation
+
+set(ASY_DOC_PDF_FILES "")
+
+macro(add_asy_pdf_dependency_basic asyfile)
+ set(ASY_DOC_FILE_OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.pdf)
+ # asymptote has some problems (currently as writing this) with asy files involving tex
+ # and output directory not matching, so a workaround is to copy to the doc build root
+ add_custom_command(
+ OUTPUT ${ASY_DOC_FILE_OUTPUT}
+ DEPENDS ${ASY_DOC_DIR}/${asyfile}.asy asy ${ASY_OUTPUT_BASE_FILES}
+ # copy <docroot>/file.asy -> <buildroot>/file.asy
+ COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${asyfile}.asy
+ COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${asyfile}.asy
+ # cleanup <buildroot>/file.asy
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS}
+ ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy
+ # cleanup tex artifacts, if exist
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f
+ ${ASY_TEX_BUILD_ROOT}/${asyfile}_.tex
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ )
+ list(APPEND ASY_DOC_PDF_FILES ${ASY_DOC_FILE_OUTPUT})
+endmacro()
+
+# CAD1 is here because it is needed for CAD.pdf.
+add_asy_pdf_dependency_basic(CAD1)
+
+# additional asymptote file outputs
+add_additional_pdf_outputs(asyRefCard 1 ${PDFTEX_EXEC})
+add_additional_pdf_outputs(TeXShopAndAsymptote 2 ${PDFLATEX_COMPILER})
+add_additional_pdf_outputs(
+ CAD
+ 3
+ ${PDFLATEX_COMPILER}
+ DEPENDS ${ASY_TEX_BUILD_ROOT}/CAD1.pdf
+)
+
+set(
+ BASE_ASYMPTOTE_DOC_AND_TEX_FILES
+ ${ASY_TEX_BUILD_ROOT}/asymptote.sty
+ ${ASY_TEX_BUILD_ROOT}/asy-latex.pdf
+ ${ASY_TEX_BUILD_ROOT}/CAD.pdf
+ ${ASY_TEX_BUILD_ROOT}/TeXShopAndAsymptote.pdf
+ ${ASY_TEX_BUILD_ROOT}/asyRefCard.pdf
+)
+
+add_custom_target(docgen DEPENDS ${BASE_ASYMPTOTE_DOC_AND_TEX_FILES})
+
+
+# the following files are only used with docgen, hence they are not added if
+# ENABLE_ASYMPTOTE_PDF_DOCGEN is not used
+if (ENABLE_ASYMPTOTE_PDF_DOCGEN)
+# asy files
+set(ASY_DOC_FILE_PREFIXES
+ axis3 basealign bezier bigdiagonal binarytreetest Bode brokenaxis
+ colons colors cube cylinderskeleton datagraph diagonal dots
+ eetomumu elliptic errorbars exp fillcontour flow flowchartdemo
+ GaussianSurface generalaxis generalaxis3 graphmarkers graphwithderiv grid3xyz
+ hatch helix HermiteSpline histogram Hobbycontrol Hobbydir icon image imagecontour
+ irregularcontour join join3 knots labelsquare legend lineargraph lineargraph0
+ linetype log2graph loggraph loggrid logimage logticks makepen markers1 markers2 mexicanhat
+ monthaxis multicontour onecontour parametricgraph penfunctionimage penimage planes quartercircle
+ saddle scaledgraph shadedtiling slopefield1 square subpictures superpath tile
+ triangulate unitcircle3 vectorfield
+)
+
+# independent asymptote files that can be generated with any other files
+foreach(ASY_DOC_FILE_PREFIX ${ASY_DOC_FILE_PREFIXES})
+ add_asy_pdf_dependency_basic(${ASY_DOC_FILE_PREFIX})
+endforeach()
+
+macro(add_asy_file_with_extension asy_file extra_ext)
+ set(ASY_DOC_FILE_OUTPUT ${ASY_TEX_BUILD_ROOT}/${asy_file}.pdf)
+ set(ASY_AUX_FILE_NAME ${asy_file}.${extra_ext})
+ # asymptote has some problems (currently as writing this) with asy files involving tex
+ # and output directory not matching, so a workaround is to copy to the doc build root
+ add_custom_command(
+ OUTPUT ${ASY_DOC_FILE_OUTPUT}
+ DEPENDS
+ ${ASY_DOC_DIR}/${asy_file}.asy
+ ${ASY_DOC_DIR}/${ASY_AUX_FILE_NAME}
+ asy ${ASY_OUTPUT_BASE_FILES}
+ COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS}
+ ${ASY_DOC_DIR}/${asy_file}.asy
+ ${ASY_DOC_DIR}/${ASY_AUX_FILE_NAME}
+ COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${ASY_DOC_FILE_PREFIX}.asy
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS}
+ ${ASY_TEX_BUILD_ROOT}/${asy_file}.asy
+ ${ASY_TEX_BUILD_ROOT}/${ASY_AUX_FILE_NAME}
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f
+ ${ASY_TEX_BUILD_ROOT}/${asy_file}_.tex
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ )
+ list(APPEND ASY_DOC_PDF_FILES ${ASY_DOC_FILE_OUTPUT})
+endmacro()
+
+# asy + csv Files
+foreach(ASY_DOC_FILE_PREFIX diatom secondaryaxis westnile)
+ add_asy_file_with_extension(${ASY_DOC_FILE_PREFIX} csv)
+endforeach()
+
+# asy + dat files
+foreach(ASY_DOC_FILE_PREFIX filegraph leastsquares)
+ add_asy_file_with_extension(${ASY_DOC_FILE_PREFIX} dat)
+endforeach()
+
+
+# handle CDlabel and logo separately
+macro(copy_doc_asy_file_to_docbuild_root asyfile)
+ add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy
+ COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS}
+ ${ASY_DOC_DIR}/${asyfile}.asy
+ DEPENDS ${ASY_DOC_DIR}/${asyfile}.asy
+ )
+endmacro()
+
+function(add_asy_file_with_asy_dependency asyfile) # <asydep1> [asydep2] ...
+ list(
+ TRANSFORM ARGN
+ PREPEND ${ASY_TEX_BUILD_ROOT}/
+ OUTPUT_VARIABLE ASY_REQUIRED_DEPS
+ )
+ list(
+ TRANSFORM ASY_REQUIRED_DEPS
+ APPEND .asy
+ )
+
+ add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.pdf
+ DEPENDS ${ASY_DOC_DIR}/${asyfile}.asy asy ${ASY_OUTPUT_BASE_FILES} ${ASY_REQUIRED_DEPS}
+ # copy <docroot>/file.asy -> <buildroot>/file.asy
+ COMMAND ${CMAKE_COPY_ASY_FILE_TO_DOCBUILD_BASE_ARGS} ${ASY_DOC_DIR}/${asyfile}.asy
+ COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${asyfile}.asy
+ # cleanup <buildroot>/file.asy
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS} ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy
+ # cleanup tex artifacts, if exist
+ COMMAND ${CMAKE_RM_BASE_ARGUMENTS} -f ${ASY_TEX_BUILD_ROOT}/${asyfile}_.tex
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ )
+endfunction()
+
+macro(add_asy_file_from_docbuild_root asyfile)
+ # does not copy from doc root to docbuild root; have to do manually
+ add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/${asyfile}.pdf
+ COMMAND ${ASY_BASE_ARGUMENTS} -fpdf ${asyfile}.asy
+ DEPENDS ${ASY_TEX_BUILD_ROOT}/${asyfile}.asy
+ BYPRODUCTS ${ASY_TEX_BUILD_ROOT}/${asyfile}_.tex ${ASY_TEX_BUILD_ROOT}/${asyfile}_.eps
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ )
+endmacro()
+
+# CDlabel + logo
+copy_doc_asy_file_to_docbuild_root(logo)
+add_asy_file_from_docbuild_root(logo)
+add_asy_file_with_asy_dependency(CDlabel logo)
+
+# bezier2 & beziercurve
+copy_doc_asy_file_to_docbuild_root(beziercurve)
+add_asy_file_from_docbuild_root(beziercurve)
+add_asy_file_with_asy_dependency(bezier2 beziercurve)
+
+list(APPEND ASY_DOC_PDF_FILES
+ ${ASY_TEX_BUILD_ROOT}/logo.pdf
+ ${ASY_TEX_BUILD_ROOT}/CDlabel.pdf
+ ${ASY_TEX_BUILD_ROOT}/beziercurve.pdf
+ ${ASY_TEX_BUILD_ROOT}/bezier2.pdf
+)
+
+# options file
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/options
+ DEPENDS asy ${ASY_DOC_DIR}/gen-asy-options-file.py
+ COMMAND ${PY3_INTERPRETER} ${ASY_DOC_DIR}/gen-asy-options-file.py
+ --asy-executable=$<TARGET_FILE:asy>
+ --output-file=${ASY_TEX_BUILD_ROOT}/options
+)
+
+# asymptote.pdf
+
+set(TEXI_ARTIFACT_EXTENSIONS log tmp cp toc cps aux)
+list(
+ TRANSFORM TEXI_ARTIFACT_EXTENSIONS
+ PREPEND ${ASY_TEX_BUILD_ROOT}/asymptote.
+ OUTPUT_VARIABLE ASYMPTOTE_PDF_EXTRA_ARTIFACTS
+ )
+
+if (WIN32)
+if (WIN32_TEXINDEX STREQUAL WSL)
+ set(TEXINDEX_WRAPPER ${CMAKE_CURRENT_SOURCE_DIR}/windows/texindex-wsl.cmd)
+else()
+ set(TEXINDEX_WRAPPER ${WIN32_TEXINDEX})
+endif()
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/asymptote.pdf
+ DEPENDS
+ ${ASY_TEX_BUILD_ROOT}/options
+ ${ASY_TEX_BUILD_ROOT}/latexusage.pdf
+ ${ASY_DOC_DIR}/asymptote.texi
+ ${ASY_DOC_PDF_FILES}
+ COMMAND ${PY3_INTERPRETER}
+ ${ASY_DOC_DIR}/build-asymptote-pdf-win.py
+ --texify-loc=${TEXIFY}
+ --texindex-loc=${TEXINDEX_WRAPPER}
+ --texi-file=${ASY_DOC_DIR}/asymptote.texi
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ BYPRODUCTS ${ASYMPTOTE_PDF_EXTRA_ARTIFACTS}
+)
+else()
+add_custom_command(
+ OUTPUT ${ASY_TEX_BUILD_ROOT}/asymptote.pdf
+ DEPENDS
+ ${ASY_TEX_BUILD_ROOT}/options
+ ${ASY_TEX_BUILD_ROOT}/latexusage.pdf
+ ${ASY_DOC_DIR}/asymptote.texi
+ ${ASY_DOC_PDF_FILES}
+ COMMAND ${TEXI2DVI} --pdf ${ASY_DOC_DIR}/asymptote.texi
+ WORKING_DIRECTORY ${ASY_TEX_BUILD_ROOT}
+ BYPRODUCTS ${ASYMPTOTE_PDF_EXTRA_ARTIFACTS}
+)
+endif()
+add_custom_target(asymptote_pdf_file DEPENDS ${ASY_TEX_BUILD_ROOT}/asymptote.pdf)
+add_dependencies(docgen asymptote_pdf_file)
+endif() # ENABLE_ASYMPTOTE_PDF_DOCGEN
diff --git a/graphics/asymptote/cmake-scripts/external-libs.cmake b/graphics/asymptote/cmake-scripts/external-libs.cmake
new file mode 100644
index 0000000000..2afe6ab168
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/external-libs.cmake
@@ -0,0 +1,316 @@
+include(FindPkgConfig)
+include(FetchContent)
+
+FetchContent_Declare(
+ lspcpp
+ GIT_REPOSITORY https://github.com/vectorgraphics/LspCpp
+ GIT_TAG master
+)
+
+if (ENABLE_LSP)
+
+ message(STATUS "LSP Enabled.")
+ # disable New Boost version warning
+ set(Boost_NO_WARN_NEW_VERSIONS 1)
+ set(USE_SYSTEM_RAPIDJSON 1)
+ set(LSPCPP_USE_CPP17 1)
+ set(LSPCPP_SUPPORT_BOEHM_GC 1)
+ # For transitive URI dependency
+ set(Uri_BUILD_DOCS 0)
+ set(Uri_BUILD_TESTS 0)
+ FetchContent_MakeAvailable(lspcpp)
+ list(APPEND ASY_STATIC_LIBARIES lspcpp)
+ list(APPEND ASY_MACROS HAVE_LSP=1)
+else()
+ FetchContent_Populate(lspcpp)
+ # only include lsp libraries
+ message(STATUS "LSP Disabled. Will not have language server protocol support.")
+ list(APPEND ASYMPTOTE_INCLUDES ${lspcpp_SOURCE_DIR}/include)
+endif()
+
+# zlib
+find_package(ZLIB REQUIRED)
+list(APPEND ASY_STATIC_LIBARIES ZLIB::ZLIB)
+
+# flex + bison
+if (UNIX)
+ include(FindFLEX)
+ include(FindBISON)
+
+ if (NOT FLEX_FOUND)
+ message(FATAL_ERROR "FLEX is required for building")
+ endif()
+
+ if (NOT BISON_FOUND)
+ message(FATAL_ERROR "Bison is required for building")
+ endif()
+elseif(WIN32)
+ if ((NOT WIN32_FLEX_BINARY) OR (NOT WIN32_BISON_BINARY))
+ # downlod winflexbison
+ message(STATUS "Flex or bison not given; downloading winflexbison.")
+
+
+ FetchContent_Declare(
+ winflexbison
+ URL https://github.com/lexxmark/winflexbison/releases/download/v2.5.25/win_flex_bison-2.5.25.zip
+ URL_HASH SHA256=8D324B62BE33604B2C45AD1DD34AB93D722534448F55A16CA7292DE32B6AC135
+ )
+ FetchContent_MakeAvailable(winflexbison)
+ message(STATUS "Downloaded winflexbison")
+
+ if (NOT WIN32_FLEX_BINARY)
+ set(FLEX_EXECUTABLE ${winflexbison_SOURCE_DIR}/win_flex.exe)
+ endif()
+
+ if (NOT WIN32_BISON_BINARY)
+ set(BISON_EXECUTABLE ${winflexbison_SOURCE_DIR}/win_bison.exe)
+ endif()
+ else()
+ set(FLEX_EXECUTABLE ${WIN32_FLEX_BINARY})
+ set(BISON_EXECUTABLE ${WIN32_BISON_BINARY})
+ endif()
+endif()
+
+# getopt (win32 only)
+
+if (WIN32)
+ find_package(unofficial-getopt-win32 REQUIRED)
+ list(APPEND ASY_STATIC_LIBARIES unofficial::getopt-win32::getopt)
+endif()
+
+# glm; mandatory for all builds
+find_package(glm CONFIG)
+if (glm_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES glm::glm)
+ list(APPEND ASY_MACROS HAVE_LIBGLM)
+else()
+ message(FATAL_ERROR "glm not found; will not use glm")
+endif()
+
+# -------- not required, but highly recommend if your system can build it ---------
+# these options are (mostly) on by default
+
+# boehm gc
+
+if (ENABLE_GC)
+ find_package(BDWgc CONFIG)
+ if (BDWgc_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES BDWgc::gc BDWgc::gccpp)
+ if (WIN32)
+ list(APPEND ASY_STATIC_LIBARIES BDWgc::gctba)
+ endif()
+ list(APPEND ASY_MACROS USEGC)
+ else()
+ message(FATAL_ERROR "BDWgc not found")
+ endif()
+else()
+ message(STATUS "Disabling gc support")
+endif()
+
+
+if (ENABLE_READLINE)
+# curses
+ if (UNIX)
+ # we know ncurses work on unix systems, however
+ # not always supported on windows (esp. msvc)
+ set(CURSES_NEED_NCURSES TRUE)
+
+ find_package(Curses)
+ if (Curses_FOUND)
+ list(APPEND ASYMPTOTE_INCLUDES ${CURSES_INCLUDE_DIRS})
+ list(APPEND ASY_COMPILE_OPTS ${CURSES_CFLAGS})
+ list(APPEND ASY_STATIC_LIBRARIES ${CURSES_LIBRARIES})
+
+ list(APPEND ASY_MACROS HAVE_NCURSES_CURSES_H HAVE_LIBCURSES)
+ else()
+ message(FATAL_ERROR "curses not found; will compile without curses")
+ endif()
+
+ pkg_check_modules(readline IMPORTED_TARGET readline)
+
+ if (readline_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES PkgConfig::readline)
+ list(APPEND ASY_MACROS HAVE_LIBREADLINE)
+ else ()
+ message(FATAL_ERROR "readline not found; will compile without libreadline")
+ endif()
+ elseif(WIN32)
+ find_package(unofficial-pdcurses CONFIG)
+ if (unofficial-pdcurses_FOUND)
+ list(APPEND ASY_STATIC_LIBRARIES unofficial::pdcurses::pdcurses)
+ list(APPEND ASY_MACROS HAVE_CURSES_H HAVE_LIBCURSES)
+ else()
+ message(FATAL_ERROR "curses not found; will compile without curses")
+ endif()
+
+ find_package(unofficial-readline-win32 CONFIG)
+ if (unofficial-readline-win32_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES unofficial::readline-win32::readline)
+ list(APPEND ASY_MACROS HAVE_LIBREADLINE)
+ else ()
+ message(FATAL_ERROR "readline not found; will compile without libreadline")
+ endif()
+ else()
+ message(FATAL_ERROR "Only supported on Unix or Win32 systems")
+ endif()
+else()
+ message(STATUS "libreadline disabled; will not use libreadline")
+endif()
+
+# libcurl
+if (ENABLE_CURL)
+ find_package(CURL)
+ if (CURL_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES CURL::libcurl)
+ list(APPEND ASY_MACROS HAVE_LIBCURL)
+ else()
+ message(FATAL_ERROR "curl not found")
+ endif()
+else()
+ message(STATUS "Disabling curl support")
+endif()
+
+# pthreads
+if (ENABLE_THREADING)
+ if (UNIX)
+ set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
+ set(THREADS_PREFER_PTHREAD_FLAG TRUE)
+ include(FindThreads)
+
+ if(CMAKE_USE_PTHREADS_INIT)
+ list(APPEND ASY_STATIC_LIBARIES Threads::Threads)
+ list(APPEND ASY_MACROS HAVE_PTHREAD=1)
+ else()
+ message(FATAL_ERROR "No thread library specified")
+ endif()
+ elseif(WIN32)
+ find_package(PThreads4W)
+
+ if(PThreads4W_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES PThreads4W::PThreads4W)
+ list(APPEND ASY_MACROS HAVE_PTHREAD=1)
+ else()
+ message(FATAL_ERROR "No thread library specified")
+ endif()
+ else()
+ message(FATAL_ERROR "Only supported on Unix or Win32 systems")
+ endif()
+else()
+ message(STATUS "Disabling threading support")
+endif()
+
+# gsl
+if (ENABLE_GSL)
+ find_package(GSL)
+ if (GSL_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES GSL::gsl)
+ list(APPEND ASY_MACROS HAVE_LIBGSL)
+ else()
+ message(FATAL_ERROR "GSL not found")
+ endif()
+else()
+ message(STATUS "Disabling gsl support")
+endif()
+
+
+# eigen
+if (ENABLE_EIGEN3)
+find_package(Eigen3 CONFIG)
+ if (Eigen3_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES Eigen3::Eigen)
+ list(APPEND ASY_MACROS HAVE_EIGEN_DENSE)
+ else()
+ message(FATAL_ERROR "eigen3 not found")
+ endif()
+else()
+ message(STATUS "Disabling eigen3 support")
+endif()
+
+# OpenGL stuff
+if (ENABLE_OPENGL)
+ # fatal error here, since OpenGL is optional
+ find_package(OpenGL REQUIRED)
+ if (OPENGL_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES OpenGL::GL)
+ else()
+ message(WARNING "gl libraries not found")
+ endif()
+
+ if (OPENGL_GLU_FOUND)
+ list(APPEND ASY_MACROS HAVE_GL)
+ else()
+ message(FATAL_ERROR "GL components incomplete; will not use OpenGL")
+ endif()
+
+ find_package(FreeGLUT CONFIG)
+ if (FreeGLUT_FOUND)
+ list(APPEND ASY_STATIC_LIBARIES
+ $<IF:$<TARGET_EXISTS:FreeGLUT::freeglut>,FreeGLUT::freeglut,FreeGLUT::freeglut_static>)
+ list(APPEND ASY_MACROS FREEGLUT HAVE_LIBGLUT)
+ else()
+ message(FATAL_ERROR "freeglut not found; will not use freeglut")
+ endif()
+
+ if (ENABLE_GL_COMPUTE_SHADERS)
+ list(APPEND ASY_MACROS HAVE_COMPUTE_SHADER)
+ else()
+ message(WARNING "Compute shader disabled")
+ endif()
+
+ if (ENABLE_GL_SSBO)
+ list(APPEND ASY_MACROS HAVE_SSBO)
+ else()
+ message(WARNING "SSBO disabled")
+ endif()
+else()
+ message(STATUS "Disabling opengl support")
+endif()
+
+
+if (ENABLE_RPC_FEATURES)
+ if(UNIX)
+ pkg_check_modules(TIRPC REQUIRED IMPORTED_TARGET libtirpc)
+ list(APPEND ASY_STATIC_LIBARIES PkgConfig::TIRPC)
+ endif()
+
+ if (WIN32)
+ # win32 does not have native open_memstream support
+ set(OLD_BUILD_TESTING ${BUILD_TESTING})
+ set(BUILD_TESTING false)
+ FetchContent_Declare(
+ fmem
+ GIT_REPOSITORY https://github.com/Kreijstal/fmem.git
+ GIT_TAG 6274a441380a8fcfd4e1a6e47b3d1f0b28b3c48a
+ )
+ FetchContent_MakeAvailable(fmem)
+ set(BUILD_TESTING ${OLD_BUILD_TESTING})
+
+ list(APPEND ASY_STATIC_LIBARIES fmem)
+ list(APPEND ASYMPTOTE_INCLUDES $<TARGET_PROPERTY:fmem,INCLUDE_DIRECTORIES>)
+ endif()
+ list(APPEND ASY_MACROS HAVE_LIBTIRPC)
+
+
+else()
+ message(STATUS "Disabling rpc and xdr/v3d support")
+endif()
+
+# fftw3
+
+if (ENABLE_FFTW3)
+ set(FFTW3_USABLE TRUE)
+ find_package(FFTW3 CONFIG)
+ if (NOT FFTW3_FOUND)
+ message(WARNING "libfftw3 not found; will not use fftw3")
+ set(FFTW3_USABLE FALSE)
+ endif()
+
+ if (FFTW3_USABLE)
+ list(APPEND ASY_STATIC_LIBARIES FFTW3::fftw3)
+ list(APPEND ASY_MACROS HAVE_LIBFFTW3 FFTWPP_SINGLE_THREAD)
+ else()
+ message(FATAL_ERROR "environment lacks needed fftw3 features")
+ endif()
+else()
+ message(STATUS "Disabling fftw3 support")
+endif()
diff --git a/graphics/asymptote/cmake-scripts/generated-files.cmake b/graphics/asymptote/cmake-scripts/generated-files.cmake
new file mode 100644
index 0000000000..bfecb670e5
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/generated-files.cmake
@@ -0,0 +1,224 @@
+# generated include directories
+set(GENERATED_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/include")
+file(MAKE_DIRECTORY ${GENERATED_INCLUDE_DIR})
+
+# directory for auxilliary files
+set(GENERATED_AUX_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/auxiliary")
+file(MAKE_DIRECTORY ${GENERATED_AUX_DIR})
+
+# generated sources
+set(GENERATED_SRC_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/src")
+file(MAKE_DIRECTORY ${GENERATED_SRC_DIR})
+
+
+# opsymbols.h
+add_custom_command(
+ OUTPUT ${GENERATED_INCLUDE_DIR}/opsymbols.h
+ COMMAND ${PERL_INTERPRETER}
+ ${ASY_SCRIPTS_DIR}/opsymbols.pl
+ --campfile ${ASY_RESOURCE_DIR}/camp.l
+ --output ${GENERATED_INCLUDE_DIR}/opsymbols.h
+ MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/camp.l
+ DEPENDS ${ASY_SCRIPTS_DIR}/opsymbols.pl
+)
+
+list(APPEND ASYMPTOTE_INCLUDES ${GENERATED_INCLUDE_DIR})
+list(APPEND ASYMPTOTE_GENERATED_HEADERS ${GENERATED_INCLUDE_DIR}/opsymbols.h)
+list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${GENERATED_INCLUDE_DIR}/opsymbols.h)
+
+# run-* files
+function(_int_add_runtime_file runtime_file)
+ set(RUNTIME_FILE_IN_BASE ${ASY_SRC_TEMPLATES_DIR}/${runtime_file})
+ set(RUNTIME_FILES_OUT ${GENERATED_SRC_DIR}/${runtime_file}.cc ${GENERATED_INCLUDE_DIR}/${runtime_file}.h)
+ set(RUNTIME_SCRIPT ${ASY_SCRIPTS_DIR}/runtime.pl)
+ set(OPSYM_FILE ${GENERATED_INCLUDE_DIR}/opsymbols.h)
+ set(RUNTIME_BASE_FILE ${ASY_SRC_TEMPLATES_DIR}/runtimebase.in)
+ add_custom_command(
+ OUTPUT ${RUNTIME_FILES_OUT}
+ COMMAND ${PERL_INTERPRETER} ${RUNTIME_SCRIPT}
+ --opsym-file ${OPSYM_FILE}
+ --runtime-base-file ${RUNTIME_BASE_FILE}
+ --src-template-dir ${ASY_SRC_TEMPLATES_DIR}
+ --prefix ${runtime_file}
+ --header-out-dir ${GENERATED_INCLUDE_DIR}
+ --src-out-dir ${GENERATED_SRC_DIR}
+ MAIN_DEPENDENCY ${RUNTIME_FILE_IN_BASE}.in
+ DEPENDS ${RUNTIME_SCRIPT} ${OPSYM_FILE} ${RUNTIME_BASE_FILE} ${RUNTIME_FILE_DEP}
+ )
+endfunction()
+
+macro(add_runtime_file runtime_file)
+ _int_add_runtime_file(${runtime_file})
+ list(APPEND ASY_GENERATED_BUILD_SOURCES
+ ${GENERATED_SRC_DIR}/${runtime_file}.cc
+ )
+ set(_ASY_GENERATED_HEADER_NAME ${GENERATED_INCLUDE_DIR}/${runtime_file}.h)
+ list(APPEND ASYMPTOTE_GENERATED_HEADERS ${_ASY_GENERATED_HEADER_NAME})
+ list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${_ASY_GENERATED_HEADER_NAME})
+endmacro()
+
+foreach(RUNTIME_FILE ${RUNTIME_BUILD_FILES})
+ add_runtime_file(${RUNTIME_FILE})
+endforeach()
+
+# keywords.h
+set(KEYWORDS_HEADER_OUT ${GENERATED_INCLUDE_DIR}/keywords.h)
+add_custom_command(
+ OUTPUT ${KEYWORDS_HEADER_OUT}
+ COMMAND ${PERL_INTERPRETER} ${ASY_SCRIPTS_DIR}/keywords.pl
+ --camplfile ${ASY_RESOURCE_DIR}/camp.l
+ --output ${GENERATED_INCLUDE_DIR}/keywords.h
+ --process-file ${ASY_SRC_DIR}/asyprocess.cc
+ MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/camp.l
+ DEPENDS ${ASY_SCRIPTS_DIR}/keywords.pl ${ASY_SRC_DIR}/asyprocess.cc
+)
+
+list(APPEND ASYMPTOTE_GENERATED_HEADERS ${KEYWORDS_HEADER_OUT})
+list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${KEYWORDS_HEADER_OUT})
+
+set(camp_lex_output ${GENERATED_SRC_DIR}/lex.yy.cc)
+set(camp_l_file ${ASY_RESOURCE_DIR}/camp.l)
+
+if (WIN32)
+ list(APPEND FLEX_ARGS --wincompat)
+endif()
+
+# flex + bison
+
+# flex
+add_custom_command(
+ OUTPUT ${camp_lex_output}
+ COMMAND ${FLEX_EXECUTABLE} ${FLEX_ARGS} -o ${camp_lex_output} ${camp_l_file}
+ MAIN_DEPENDENCY ${camp_l_file}
+)
+
+list(APPEND ASY_GENERATED_BUILD_SOURCES ${camp_lex_output})
+
+# bison
+set(bison_output ${GENERATED_SRC_DIR}/camp.tab.cc)
+set(bison_header ${GENERATED_INCLUDE_DIR}/camp.tab.h)
+set(bison_input ${ASY_RESOURCE_DIR}/camp.y)
+add_custom_command(
+ OUTPUT ${bison_output} ${bison_header}
+ COMMAND ${BISON_EXECUTABLE} -t --header=${bison_header} -o ${bison_output} ${bison_input}
+ MAIN_DEPENDENCY ${bison_input}
+)
+
+list(APPEND ASY_GENERATED_BUILD_SOURCES ${bison_output})
+list(APPEND ASYMPTOTE_GENERATED_HEADERS ${bison_header})
+list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${bison_header})
+
+# generate enums from csv
+foreach(csv_enum_file ${ASY_CSV_ENUM_FILES})
+ set(generated_header_file ${GENERATED_INCLUDE_DIR}/${csv_enum_file}.h)
+
+ add_custom_command(
+ OUTPUT ${generated_header_file}
+ COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/generate_enums.py
+ --language cpp
+ --name ${csv_enum_file}
+ --input ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv
+ --output ${generated_header_file}
+ --xopt namespace=camp
+ MAIN_DEPENDENCY ${ASY_RESOURCE_DIR}/${csv_enum_file}.csv
+ DEPENDS ${ASY_SCRIPTS_DIR}/generate_enums.py
+ )
+
+ list(APPEND ASYMPTOTE_GENERATED_HEADERS ${generated_header_file})
+ list(APPEND ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS ${generated_header_file})
+endforeach ()
+
+# raw.i files
+# generating preprocessed files
+set(FINDSYM_FILE ${ASY_SCRIPTS_DIR}/findsym.pl)
+# combine all files into allsymbols.h
+function(symfile_preprocess src_dir symfile symfile_raw_output_varname header_output_varname)
+ set(symfile_raw_output_var ${symfile_raw_output_varname})
+ set(processed_output_file ${GENERATED_AUX_DIR}/${symfile}.raw.i)
+ set(${symfile_raw_output_var} ${processed_output_file} PARENT_SCOPE)
+
+ set(cxx_preprocessor ${CMAKE_CXX_COMPILER})
+
+ if (MSVC)
+ if (GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
+ set(cxx_preprocessor ${GCCCOMPAT_CXX_COMPILER_FOR_MSVC})
+ else()
+ set(msvc_flag --msvc)
+ endif()
+ endif()
+
+ set(asy_includes_list "$<TARGET_PROPERTY:asy,INCLUDE_DIRECTORIES>")
+ set(asy_macros_list "$<TARGET_PROPERTY:asy,COMPILE_DEFINITIONS>")
+ set(asy_cxx_std "$<TARGET_PROPERTY:asy,CXX_STANDARD>")
+
+ if (UNIX)
+ # for unix systems, need verbatim flag because
+ # the arguments contains semicolon, though somehow
+ # verbatim option causes problems for windows
+ set(ADDITIONAL_ADD_CUSTOM_CMD_ARGS VERBATIM)
+ endif()
+
+ add_custom_command(
+ OUTPUT ${processed_output_file}
+ COMMAND ${PY3_INTERPRETER} ${ASY_SCRIPTS_DIR}/gen_preprocessed_depfile.py
+ --cxx-compiler=${cxx_preprocessor}
+ "$<$<BOOL:${asy_includes_list}>:--include-dirs=${asy_includes_list}>"
+ "$<$<BOOL:${asy_cxx_std}>:--cxx-standard=${asy_cxx_std}>"
+ "$<$<BOOL:${asy_macros_list}>:--macro-defs=${asy_macros_list}>"
+ --out-dep-file=${GENERATED_AUX_DIR}/${symfile}.d
+ --out-i-file=${processed_output_file}
+ --in-src-file=${src_dir}/${symfile}.cc
+ ${msvc_flag}
+ DEPFILE ${GENERATED_AUX_DIR}/${symfile}.d
+ BYPRODUCTS ${GENERATED_AUX_DIR}/${symfile}.d
+ DEPENDS ${src_dir}/${symfile}.cc
+ ${ASY_SCRIPTS_DIR}/gen_preprocessed_depfile.py
+ ${ASYMPTOTE_SYM_PROCESS_NEEDED_HEADERS}
+ ${ADDITIONAL_ADD_CUSTOM_CMD_ARGS}
+ )
+ # *.symbols.h file
+ set(symfile_raw_output_var ${header_output_varname})
+ set(sym_header_file ${GENERATED_INCLUDE_DIR}/${symfile}.symbols.h)
+ set(${symfile_raw_output_var} ${sym_header_file} PARENT_SCOPE)
+ add_custom_command(
+ OUTPUT ${sym_header_file}
+ COMMAND ${PERL_INTERPRETER} ${FINDSYM_FILE}
+ ${sym_header_file}
+ ${processed_output_file}
+ MAIN_DEPENDENCY ${processed_output_file}
+ )
+endfunction()
+
+# preprocess each individual symbol files
+foreach(SYM_FILE ${SYMBOL_STATIC_BUILD_FILES})
+ symfile_preprocess(${ASY_SRC_DIR} ${SYM_FILE} SYMFILE_OUT HEADER_OUT)
+ list(APPEND SYMFILE_OUT_LIST ${SYMFILE_OUT})
+ list(APPEND ASYMPTOTE_GENERATED_HEADERS ${HEADER_OUT})
+endforeach()
+
+foreach(SYM_FILE ${RUNTIME_BUILD_FILES})
+ symfile_preprocess(${GENERATED_SRC_DIR} ${SYM_FILE} SYMFILE_OUT HEADER_OUT)
+ list(APPEND SYMFILE_OUT_LIST ${SYMFILE_OUT})
+ list(APPEND ASYMPTOTE_GENERATED_HEADERS ${HEADER_OUT})
+endforeach ()
+
+# allsymbols.h
+add_custom_command(
+ OUTPUT ${GENERATED_INCLUDE_DIR}/allsymbols.h
+ COMMAND ${PERL_INTERPRETER} ${FINDSYM_FILE}
+ ${GENERATED_INCLUDE_DIR}/allsymbols.h
+ ${SYMFILE_OUT_LIST}
+ DEPENDS ${FINDSYM_FILE} ${SYMFILE_OUT_LIST}
+)
+
+list(APPEND ASYMPTOTE_GENERATED_HEADERS ${GENERATED_INCLUDE_DIR}/allsymbols.h)
+
+# macro files
+message(STATUS "Generating revision.cc file")
+set(revision_cc_file ${GENERATED_SRC_DIR}/revision.cc)
+configure_file(${ASY_RESOURCE_DIR}/template_rev.cc.in ${revision_cc_file})
+list(APPEND ASY_GENERATED_BUILD_SOURCES ${revision_cc_file})
+
+add_custom_target(asy_gen_headers
+ DEPENDS ${ASYMPTOTE_GENERATED_HEADERS}
+)
diff --git a/graphics/asymptote/cmake-scripts/gnu-install-macros.cmake b/graphics/asymptote/cmake-scripts/gnu-install-macros.cmake
new file mode 100644
index 0000000000..a3c6e3c721
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/gnu-install-macros.cmake
@@ -0,0 +1,16 @@
+# Only run on unix-like systems, windows does not use gnu docpath/syspath locations
+
+if (UNIX)
+ include(GNUInstallDirs)
+
+if (CTAN_BUILD)
+ set(ASYMPTOTE_SYSDIR_VALUE "")
+else()
+ set(ASYMPTOTE_SYSDIR_VALUE ${DATADIR}/asymptote)
+endif()
+
+ list(APPEND ASY_MACROS
+ ASYMPTOTE_SYSDIR="${DATADIR}/asymptote"
+ ASYMPTOTE_DOCDIR="${DATADIR}/doc/asymptote"
+ )
+endif()
diff --git a/graphics/asymptote/cmake-scripts/options.cmake b/graphics/asymptote/cmake-scripts/options.cmake
new file mode 100644
index 0000000000..51838bfa2e
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/options.cmake
@@ -0,0 +1,271 @@
+include(CMakeDependentOption)
+
+# version override
+
+set(
+ ASY_VERSION_OVERRIDE "" CACHE STRING
+ "Overriding asymptote version. If left blank, version is determined from configure.ac."
+)
+
+# Perl
+
+set(PERL_INTERPRETER "" CACHE STRING "Perl interpreter. If left empty, will try to determine interpreter automatically")
+
+if(NOT PERL_INTERPRETER)
+ message(STATUS "No Perl interpreter specified, attempting to find perl")
+ find_program(
+ PERL_INTERPRETER_FOUND
+ perl
+ REQUIRED
+ )
+ message(STATUS "Found perl at ${PERL_INTERPRETER_FOUND}")
+ set(PERL_INTERPRETER ${PERL_INTERPRETER_FOUND} CACHE STRING "" FORCE)
+endif()
+
+execute_process(COMMAND ${PERL_INTERPRETER} -e "print \"$]\"" OUTPUT_VARIABLE PERL_VERSION)
+message(STATUS "Perl version: ${PERL_VERSION}")
+
+# Python
+
+set(PY3_INTERPRETER "" CACHE STRING "Python 3 interpreter. If left empty, will try to determine Python automatically")
+
+function(verify_py3_interpreter_is_py3 validator_result_var py_interpreter)
+ execute_process(
+ COMMAND ${py_interpreter} -c "import sys; print(int(sys.version[0])>=3,end='')"
+ OUTPUT_VARIABLE PY3_INTERPRETER_VERSION_RESULT)
+ if (NOT PY3_INTERPRETER_VERSION_RESULT STREQUAL "True")
+ set(${validator_result_var} FALSE PARENT_SCOPE)
+ endif()
+endfunction()
+
+if(NOT PY3_INTERPRETER)
+ message(STATUS "No Python3 interpreter specified, attempting to find python")
+ find_program(
+ PY3_INTERPRETER_FOUND
+ NAMES python3 python
+ VALIDATOR verify_py3_interpreter_is_py3
+ REQUIRED
+ )
+ message(STATUS "Found python3 at ${PY3_INTERPRETER_FOUND}")
+ set(PY3_INTERPRETER ${PY3_INTERPRETER_FOUND} CACHE STRING "" FORCE)
+else()
+ set(PY_INTERPRETER_IS_PY3 TRUE)
+ set(VARIABLE_RESULT_VAR PY_INTERPRETER_IS_PY3)
+ verify_py3_interpreter_is_py3(VARIABLE_RESULT_VAR ${PY3_INTERPRETER})
+
+ if (NOT PY_INTERPRETER_IS_PY3)
+ message(FATAL_ERROR "Specified python interpreter cannot be used as python3 interpreter!")
+ endif()
+endif()
+
+execute_process(COMMAND ${PY3_INTERPRETER} --version OUTPUT_VARIABLE PY3_VERSION)
+message(STATUS "Version: ${PY3_VERSION}")
+
+# windows flex + bison
+set(
+ WIN32_FLEX_BINARY "" CACHE STRING
+ "Flex binary for windows. If not specified, downloads from winflexibson. This option is inert on UNIX systems"
+)
+set(
+ WIN32_BISON_BINARY "" CACHE STRING
+ "Bison binary for windows. If not specified, downloads from winflexbison. This option is inert on UNIX systems"
+)
+
+# feature libraries
+
+option(ENABLE_GC "enable boehm gc support" true)
+option(ENABLE_CURL "enable curl support" true)
+option(ENABLE_READLINE "libreadline" true)
+option(ENABLE_THREADING "enable threading support" true)
+option(ENABLE_GSL "Enable GSL support" true)
+option(ENABLE_EIGEN3 "Enable eigen3 support" true)
+option(ENABLE_FFTW3 "Enable fftw3 support" true)
+option(ENABLE_OPENGL "Whether to enable opengl or not." true)
+cmake_dependent_option(ENABLE_GL_COMPUTE_SHADERS
+ "Whether to enable compute shaders for OpenGL. Requires OpenGL >= 4.3 and GL_ARB_compute_shader"
+ true "ENABLE_OPENGL" false)
+cmake_dependent_option(ENABLE_GL_SSBO
+ "Whether to enable compute SSBO. Requires OpenGL >= 4.3 and GL_ARB_shader_storage_buffer_object"
+ true "ENABLE_OPENGL" false)
+
+option(
+ ENABLE_RPC_FEATURES
+ "Whether to enable XDR/RPC features. Also enables V3D. If compiling on UNIX systems, requires libtirpc to be installed."
+ true)
+
+# Additional options
+
+option(DEBUG_GC_ENABLE "Enable debug mode for gc" false)
+option(DEBUG_GC_BACKTRACE_ENABLE "Enable backtrace for gc" false)
+option(CTAN_BUILD "Build for CTAN." false)
+
+# additional optimization options
+
+if (CMAKE_BUILD_TYPE IN_LIST cmake_release_build_types)
+ set(default_lto true)
+else()
+ set(default_lto false)
+endif()
+
+option(OPTIMIZE_LINK_TIME "Enable link-time optimization. Enabled by default in release build types" ${default_lto})
+
+# testing
+option(ENABLE_ASY_CXXTEST "Enable C++-side testing. This option is inert for final asy libraries and binaries" true)
+option(
+ DOWNLOAD_GTEST_FROM_SRC "Download google test from googletest's github repo. Otherwise use system libraries."
+ true)
+
+# msvc-specific
+# The only reason this option is here is because msvc compiler (cl.exe) does not partial preprocessing
+# (e.g. ignore missing headers and treat them as generated files or depfile generation with missing headers)
+# We use MSVC compiler for all C++ compilation/linking
+set(GCCCOMPAT_CXX_COMPILER_FOR_MSVC
+ "" CACHE STRING
+ "gcc-compatible C++ compiler for preprocessing with MSVC toolchain. This option is inert if not using MSVC.
+This option is only used for preprocessing, it is not used for compilation."
+)
+
+# CUDA + asy cuda reflect
+include(CheckLanguage)
+check_language(CUDA)
+
+if (CMAKE_CUDA_COMPILER)
+ set(CAN_COMPILE_CUDA_REFLECT true)
+endif()
+
+cmake_dependent_option(
+ ENABLE_CUDA_ASY_REFLECT
+ "Enable target for reflect excutable for generating IBL lighting data.
+Requires CUDA installed and a CUDA-compatible NVIDIA Graphics card"
+ true "CAN_COMPILE_CUDA_REFLECT" false
+)
+
+# Language server protocol
+option(
+ ENABLE_LSP
+ "Enable Language Server Protocol support."
+ true
+)
+
+# documentation
+set(WIN32_TEXINDEX "WSL" CACHE STRING
+ "Location to texindex for windows, or WSL to use internal WSL wrapper.
+Inert for non-windows systems.")
+
+function(determine_asymptote_pdf_gen_possible_win32)
+ # windows doesn't have an up-to-date
+ # texi2dvi release in multiple years, so
+ # we are using MikTeX's texify
+ find_program(TEXIFY texify)
+ if (NOT TEXIFY)
+ message(STATUS "texify not found; will not enable docgen by default")
+ set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false PARENT_SCOPE)
+ return()
+ endif()
+
+ if (NOT WIN32_TEXINDEX)
+ message(STATUS "texindex for windows not given; will not enable docgen by default")
+ set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false PARENT_SCOPE)
+ return()
+ endif()
+
+ # another issue is that
+ if (WIN32_TEXINDEX STREQUAL WSL)
+ execute_process(
+ COMMAND wsl sh -c "which texindex >/dev/null 2>/dev/null && echo OK"
+ OUTPUT_VARIABLE TEXINDEX_RESULT
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ if (NOT TEXINDEX_RESULT STREQUAL "OK")
+ message(STATUS "Cannot execute texindex on wsl; will not enable docgen by default")
+ set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false PARENT_SCOPE)
+ return()
+ endif()
+ endif()
+ set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE true PARENT_SCOPE)
+endfunction()
+
+set(ENABLE_BASE_DOCGEN_POSSIBLE false)
+set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE false)
+
+# finding latex and other programs needed
+# pdflatex
+find_package(LATEX COMPONENTS PDFLATEX)
+
+# pdftex
+set(PDFTEX_EXEC "" CACHE STRING "pdftex. If left empty, will try to determine interpreter automatically")
+if (NOT PDFTEX)
+ message(STATUS "No pdftex specified, attempting to find pdftex")
+ find_program(
+ PDFTEX_EXEC_FOUND
+ pdftex
+ )
+ if (PDFTEX_EXEC_FOUND)
+ message(STATUS "Found pdftex at ${PDFTEX_EXEC_FOUND}")
+ set(PDFTEX_EXEC ${PDFTEX_EXEC_FOUND} CACHE STRING "" FORCE)
+ endif()
+endif()
+
+if (LATEX_PDFLATEX_FOUND AND PDFTEX_EXEC)
+ set(ENABLE_BASE_DOCGEN_POSSIBLE true)
+
+ if (WIN32)
+ determine_asymptote_pdf_gen_possible_win32()
+ elseif(UNIX)
+ find_program(TEXI2DVI texi2dvi)
+ if (TEXI2DVI)
+ set(ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE true)
+ endif()
+ endif()
+endif()
+
+set(
+ EXTERNAL_DOCUMENTATION_DIR "" CACHE STRING
+ "If specified, installation will use files from this directory as documentation.
+In particular,
+
+- if ENABLE_DOCGEN and ENABLE_ASYMPTOTE_PDF_DOCGEN is enabled and the system has the capability to build
+all documentation files, this option is inert.
+- if ENABLE_DOCGEN is enabled but ENABLE_ASYMPTOTE_PDF_DOCGEN is disabled or if the system cannot produce asymptote.pdf,
+only asymptote.pdf will be copied from this directory.
+- if ENABLE_DOCGEN is disabled, every documentation file will be copied from this directory.
+"
+)
+
+cmake_dependent_option(
+ ENABLE_DOCGEN
+ "Enable basic document generation. Requires pdflatex"
+ true
+ "ENABLE_BASE_DOCGEN_POSSIBLE"
+ false
+)
+
+cmake_dependent_option(
+ ENABLE_ASYMPTOTE_PDF_DOCGEN
+ "Enable asymptote.pdf document generation. Requires texinfo, and additionally WSL + texindex on windows."
+ true
+ "ENABLE_ASYMPTOTE_PDF_DOCGEN_POSSIBLE;ENABLE_DOCGEN"
+ false
+)
+
+if (NOT EXTERNAL_DOCUMENTATION_DIR)
+ if (NOT ENABLE_DOCGEN)
+ message(STATUS "Build is not generating documentation.
+If you are planning on generating installation files, please make sure you have access to
+documentation files in a directory and specify this directory in EXTERNAL_DOCUMENTATION_DIR cache variable.
+")
+ elseif(NOT ENABLE_ASYMPTOTE_PDF_DOCGEN)
+ message(STATUS "Build is not generating asymptote.pdf.
+If you are planning on generating installation files, please make sure you have access to asymptote.pdf
+in a directory and specify this directory in EXTERNAL_DOCUMENTATION_DIR cache variable.
+")
+ endif()
+endif()
+
+# windows-specific installation
+option(
+ ALLOW_PARTIAL_INSTALLATION
+ "Allow installation to go through, even if not every component is buildable.
+ CMake will produce a warning instead of a fatal error."
+ false
+)
diff --git a/graphics/asymptote/cmake-scripts/tests-asy.cmake b/graphics/asymptote/cmake-scripts/tests-asy.cmake
new file mode 100644
index 0000000000..86f330e909
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/tests-asy.cmake
@@ -0,0 +1,96 @@
+# ---- asy tests ------
+
+set(ASY_ASYLANG_TEST_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/tests)
+set(ASY_ASYLANG_TEST_SCRATCH_DIR ${ASY_ASYLANG_TEST_ROOT}/out/)
+
+function(add_individual_asy_tests)
+ set(fn_opts)
+ set(fn_oneval_args DIR FILE ADDR_ASY_ARGS)
+ set(fn_multival_args)
+ cmake_parse_arguments(
+ ASY_TEST "${fn_opts}" "${fn_oneval_args}" "${fn_multival_args}" ${ARGN}
+ )
+
+ set(TEST_PATH ${ASY_ASYLANG_TEST_ROOT}/${ASY_TEST_DIR}/${ASY_TEST_FILE}.asy)
+ add_test(
+ NAME "asy.${ASY_TEST_DIR}.${ASY_TEST_FILE}"
+ COMMAND asy
+ -dir ${ASY_BUILD_BASE_DIR} ${TEST_PATH}
+ -o out
+ -globalwrite
+ ${ASY_TEST_ADDR_ASY_ARGS}
+ WORKING_DIRECTORY ${ASY_ASYLANG_TEST_ROOT}
+ )
+endfunction()
+
+macro(add_asy_tests)
+ set(macro_opts)
+ set(macro_oneval_args TEST_DIR ADDR_ASY_ARGS)
+ set(macro_multival_args TESTS TEST_ARTIFACTS)
+ cmake_parse_arguments(
+ ASY_TESTING "${macro_opts}" "${macro_oneval_args}" "${macro_multival_args}" ${ARGN}
+ )
+ foreach(testfile ${ASY_TESTING_TESTS})
+ add_individual_asy_tests(
+ DIR ${ASY_TESTING_TEST_DIR}
+ FILE ${testfile}
+ ADDR_ASY_ARGS ${ASY_TESTING_ADDR_ASY_ARGS}
+ )
+ endforeach()
+
+ foreach(artifact ${ASY_TESTING_TEST_ARTIFACTS})
+ set_property(
+ TARGET asy
+ APPEND
+ PROPERTY ADDITIONAL_CLEAN_FILES ${ASY_ASYLANG_TEST_SCRATCH_DIR}/${artifact}
+ )
+ endforeach()
+endmacro()
+
+# ------ tests ----------
+
+add_asy_tests(
+ TEST_DIR arith
+ TESTS integer pair random real roots transform triple
+)
+add_asy_tests(
+ TEST_DIR array
+ TESTS array delete determinant fields slice solve sort transpose
+)
+add_asy_tests(
+ TEST_DIR frames
+ TESTS loop stat stat2
+)
+
+if (ENABLE_GC)
+ add_asy_tests(
+ TEST_DIR gc
+ TESTS array funcall guide label path shipout string struct transform
+ TEST_ARTIFACTS .eps
+ )
+endif()
+
+if (ENABLE_GSL)
+ add_asy_tests(
+ TEST_DIR gsl
+ TESTS random
+ )
+endif()
+
+add_asy_tests(TEST_DIR imp TESTS unravel)
+add_asy_tests(TEST_DIR io TESTS csv)
+add_asy_tests(TEST_DIR output TESTS circle line TEST_ARTIFACTS circle.eps line.eps)
+add_asy_tests(TEST_DIR pic TESTS trans)
+add_asy_tests(
+ TEST_DIR string
+ TESTS erase find insert length rfind substr
+)
+add_asy_tests(
+ TEST_DIR types
+ TESTS cast constructor ecast guide init keyword order resolve shadow spec var
+)
+
+add_asy_tests(
+ TEST_DIR template
+ TESTS initTest functionTest mapArrayTest multiImport singletype sortedsetTest splaytreeTest structTest
+)
diff --git a/graphics/asymptote/cmake-scripts/thirdparty-impl.cmake b/graphics/asymptote/cmake-scripts/thirdparty-impl.cmake
new file mode 100644
index 0000000000..1dbcf5d76f
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/thirdparty-impl.cmake
@@ -0,0 +1,6 @@
+# tinyexr
+
+add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty_impl/tinyexr_impl/)
+list(APPEND ASY_STATIC_LIBARIES tinyexr-impl)
+
+list(APPEND ASYMPTOTE_INCLUDES $<TARGET_PROPERTY:tinyexr-impl,INCLUDE_DIRECTORIES>)
diff --git a/graphics/asymptote/cmake-scripts/vcpkg-features.cmake b/graphics/asymptote/cmake-scripts/vcpkg-features.cmake
new file mode 100644
index 0000000000..8e63803137
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/vcpkg-features.cmake
@@ -0,0 +1,39 @@
+if (ENABLE_GC)
+ list(APPEND VCPKG_MANIFEST_FEATURES gc)
+endif()
+
+if (ENABLE_READLINE)
+ list(APPEND VCPKG_MANIFEST_FEATURES readline)
+endif()
+
+if (ENABLE_CURL)
+ list(APPEND VCPKG_MANIFEST_FEATURES curl)
+endif()
+
+if (ENABLE_GSL)
+ list(APPEND VCPKG_MANIFEST_FEATURES gsl)
+endif()
+
+if (ENABLE_EIGEN3)
+ list(APPEND VCPKG_MANIFEST_FEATURES eigen3)
+endif()
+
+if (ENABLE_FFTW3)
+ list(APPEND VCPKG_MANIFEST_FEATURES fftw3)
+endif()
+
+if (ENABLE_OPENGL)
+ list(APPEND VCPKG_MANIFEST_FEATURES opengl)
+endif()
+
+if (ENABLE_THREADING)
+ list(APPEND VCPKG_MANIFEST_FEATURES threading)
+endif()
+
+if (ENABLE_ASY_CXXTEST)
+ list(APPEND VCPKG_MANIFEST_FEATURES build-cxx-testing)
+endif()
+
+if (ENABLE_LSP)
+ list(APPEND VCPKG_MANIFEST_FEATURES lsp)
+endif()
diff --git a/graphics/asymptote/cmake-scripts/win32-pre-nsis-installer.cmake b/graphics/asymptote/cmake-scripts/win32-pre-nsis-installer.cmake
new file mode 100644
index 0000000000..df0875a93b
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/win32-pre-nsis-installer.cmake
@@ -0,0 +1,174 @@
+if (NOT WIN32)
+ message(FATAL_ERROR "Pre-NSIS installation is intended for windows only!")
+endif()
+
+if (NOT ASY_WIN_RESOURCE_DIR)
+ message(FATAL_ERROR "ASY_WIN_RESOURCE_DIR is not defined.
+Please ensure win32-specific.cmake is included before this file!")
+endif()
+
+if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set_property(CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_CURRENT_SOURCE_DIR}/cmake-install-win32")
+endif()
+
+# helper target for files needed
+add_custom_target(asy-pre-nsis-targets DEPENDS asy asy-basefiles)
+
+# check done, start configuration
+set(ASYMPTOTE_NSI_CONFIGURATION_DIR ${CMAKE_CURRENT_BINARY_DIR}/nsifiles)
+file(MAKE_DIRECTORY ${ASYMPTOTE_NSI_CONFIGURATION_DIR})
+
+configure_file(
+ ${ASY_WIN_RESOURCE_DIR}/AsymptoteInstallInfo.nsi.in
+ ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/AsymptoteInstallInfo.nsi
+)
+
+set(ASY_INSTALL_DIRECTORY build-${ASY_VERSION})
+
+set(BUILD_ASY_INSTALLER_SCRIPT ${ASY_WIN_RESOURCE_DIR}/build-asymptote-installer.py)
+configure_file(
+ ${ASY_WIN_RESOURCE_DIR}/build-asy-installer.ps1.in
+ ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/build-asy-installer.ps1
+)
+
+set(ASY_PRE_NSIS_COMPONENT_NAME asy-pre-nsis)
+set(ASY_NSIS_INSTALL_ARGUMENT
+ COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME}
+ DESTINATION ${ASY_INSTALL_DIRECTORY}
+)
+
+set(ASY_NSIS_TARGET_EXAMPLES_INSTALL_ARGUMENT
+ COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME}
+ DESTINATION ${ASY_INSTALL_DIRECTORY}/examples
+)
+
+
+set(ASY_NSIS_INSTALL_RESOURCES_ARGUMENT
+ COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME}
+ DESTINATION .
+)
+
+# <build-root>/asy.exe -> <install-root>/asy.exe
+install(TARGETS asy
+ RUNTIME_DEPENDENCIES
+ PRE_EXCLUDE_REGEXES "api-ms-" "ext-ms-"
+ POST_EXCLUDE_REGEXES ".*system32/.*\\.dll"
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+)
+
+# <build-root>/base/*, <build-root>/examples -> <install-root>/
+install(
+ DIRECTORY ${ASY_BUILD_BASE_DIR}/ ${CMAKE_CURRENT_SOURCE_DIR}/examples
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+)
+
+# extra doc files
+install(
+ FILES
+ ${ASY_DOC_DIR}/latexusage.tex
+ ${ASY_DOC_DIR}/externalprc.tex
+ ${ASY_NSIS_TARGET_EXAMPLES_INSTALL_ARGUMENT}
+)
+
+install(
+ DIRECTORY ${ASY_DOC_DIR}/
+ ${ASY_NSIS_TARGET_EXAMPLES_INSTALL_ARGUMENT}
+ FILES_MATCHING
+ PATTERN "*.asy"
+ PATTERN "*.csv"
+ PATTERN "*.dat"
+)
+
+# resources files for installer + nsi files
+
+install(
+ FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE
+ ${ASY_WIN_RESOURCE_DIR}/asy.ico
+ ${ASY_WIN_RESOURCE_DIR}/asymptote.nsi
+ ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/AsymptoteInstallInfo.nsi
+ ${ASYMPTOTE_NSI_CONFIGURATION_DIR}/build-asy-installer.ps1
+ ${ASY_NSIS_INSTALL_RESOURCES_ARGUMENT}
+)
+
+install(
+ DIRECTORY ${ASY_WIN_RESOURCE_DIR}/
+ ${ASY_NSIS_INSTALL_RESOURCES_ARGUMENT}
+ FILES_MATCHING PATTERN "*.nsh"
+)
+
+# if a component is not buildable
+macro(action_if_component_not_buildable message)
+ message(WARNING "Please ensure this issue is resolved before installing. Message: ${message}")
+ if (ALLOW_PARTIAL_INSTALLATION)
+ install(CODE "message(WARNING \"${message}\")" COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME})
+ else()
+ install(CODE "message(FATAL_ERROR \"${message}\")" COMPONENT ${ASY_PRE_NSIS_COMPONENT_NAME})
+ endif()
+endmacro()
+
+# unfortuantely, we have to first call the "docgen" target manually
+# this can also be called from asy-pre-nsis-targets, which includes asy-with-basefiles alongside docgen.
+# this is a limitation of cmake currently (https://discourse.cmake.org/t/install-file-with-custom-target/2984/2)
+
+if (ASY_TEX_BUILD_ROOT)
+ add_dependencies(asy-pre-nsis-targets docgen)
+endif()
+
+macro(install_from_external_documentation_dir docfile_name)
+ set(DOCFILE_LOCATION ${EXTERNAL_DOCUMENTATION_DIR}/${docfile_name})
+ message(STATUS "Using external documentation file at ${DOCFILE_LOCATION}")
+
+ if (NOT EXISTS ${DOCFILE_LOCATION})
+ message(WARNING "${DOCFILE_LOCATION} not found.
+Please ensure this file exists before running \"cmake --install\"."
+ )
+ endif()
+
+ install(FILES ${DOCFILE_LOCATION} ${ASY_NSIS_INSTALL_ARGUMENT})
+endmacro()
+
+
+if (ASY_TEX_BUILD_ROOT) # basic docgen possible
+ install(
+ FILES ${BASE_ASYMPTOTE_DOC_AND_TEX_FILES}
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+ )
+elseif(EXTERNAL_DOCUMENTATION_DIR)
+ set(
+ ASY_DOC_FILES_TO_COPY
+ asymptote.sty
+ asy-latex.pdf
+ CAD.pdf
+ TeXShopAndAsymptote.pdf
+ asyRefCard.pdf
+ )
+ foreach(ASY_DOC_FILE ${ASY_DOC_FILES_TO_COPY})
+ install_from_external_documentation_dir(${ASY_DOC_FILE})
+ endforeach()
+else()
+ action_if_component_not_buildable("base asymptote documentation cannot be found and is not buildable")
+endif()
+
+
+# asymptote.pdf
+if(ENABLE_ASYMPTOTE_PDF_DOCGEN)
+ message(STATUS "Using asymptote.pdf from ${ASY_TEX_BUILD_ROOT}/asymptote.pdf")
+ install(
+ FILES ${ASY_TEX_BUILD_ROOT}/asymptote.pdf
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+ )
+elseif (EXTERNAL_DOCUMENTATION_DIR)
+ install_from_external_documentation_dir(asymptote.pdf)
+else()
+ action_if_component_not_buildable("asymptote.pdf cannot be found and is not buildable")
+endif()
+
+# README files
+install(
+ FILES
+ ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE
+ ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.LESSER
+ ${CMAKE_CURRENT_SOURCE_DIR}/README
+ ${ASY_WIN_RESOURCE_DIR}/asy.ico
+ ${ASY_NSIS_INSTALL_ARGUMENT}
+)
diff --git a/graphics/asymptote/cmake-scripts/win32-specific.cmake b/graphics/asymptote/cmake-scripts/win32-specific.cmake
new file mode 100644
index 0000000000..01334c07b1
--- /dev/null
+++ b/graphics/asymptote/cmake-scripts/win32-specific.cmake
@@ -0,0 +1,100 @@
+if (NOT WIN32)
+ message(FATAL_ERROR "This file is only for use with windows.")
+endif()
+
+# msvc compile options
+if (MSVC)
+ list(APPEND ASY_COMPILE_OPTS
+ /Zc:__cplusplus /Zc:__STDC__
+ /Zc:externC /Zc:preprocessor
+ /Zc:hiddenFriend)
+endif()
+
+# alot of asymptote sources use __MSDOS__ macro for checking windows
+list(APPEND ASY_MACROS WIN32_LEAN_AND_MEAN NOMINMAX __MSDOS__=1)
+
+
+# set ASYMPTOTE_SYSDIR to empty string
+if (CTAN_BUILD)
+ list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="")
+else()
+ # because of how ASYMPTOTE_SYSDIR is calculated on windows,
+ # this value is replaced by the what is in the registry when we launch
+ # asymptote, given if ASYMPTOTE_SYSDIR is not empty
+ # (empty indicates a CTAN build which uses kpsewhich for determining path)
+
+ # hence, we can leave this value to anything non-empty.
+ list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="NUL")
+endif()
+
+
+set(BUILD_SHARED_LIBS OFF)
+
+# gcc/clang++ compatible validators
+
+function(validate_gcc_compat_cxx validator_result_var gcccompat_compiler)
+ execute_process(
+ COMMAND ${gcccompat_compiler} "--version"
+ OUTPUT_VARIABLE COMPILER_RESULT)
+
+ if (NOT COMPILER_RESULT MATCHES
+ "(clang version )|(g\\+\\+\\.exe \\(MinGW\\))|(g\\+\\+ \\(GCC\\))")
+ set(${validator_result_var} FALSE PARENT_SCOPE)
+ endif()
+endfunction()
+
+
+macro(find_compatible_gcc_compilers)
+ find_program(
+ GCCCOMPAT_CXX_COMPILER_FOUND
+ NAMES clang++ g++
+ VALIDATOR validate_gcc_compat_cxx
+ )
+
+ if (GCCCOMPAT_CXX_COMPILER_FOUND)
+ message(STATUS "Found clang++/g++ at ${GCCCOMPAT_CXX_COMPILER_FOUND}")
+ set(GCCCOMPAT_CXX_COMPILER_FOR_MSVC ${GCCCOMPAT_CXX_COMPILER_FOUND})
+ endif()
+endmacro()
+
+# attempting to find gcc-compatible C++ compiler
+
+if (MSVC)
+ if (NOT GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
+ message(STATUS "GCCCOMPAT_CXX_COMPILER_FOR_MSVC not given, will attempt to find g++.exe or clang++.exe")
+ find_compatible_gcc_compilers()
+ endif()
+
+ if (GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
+ message(STATUS "Using GCC-compatible C++ compiler at \
+${GCCCOMPAT_CXX_COMPILER_FOR_MSVC} for preprocessing.")
+ endif()
+
+ if (NOT GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
+ message(WARNING "\
+GCC-compatible C++ compiler not specified, target dependency resolution for generated files may \
+not work properly. If you are looking for a GCC-compatible C++ compiler on windows for preprocessing, \
+we recommend the LLVM toolchain. You can find LLVM at \
+\
+https://releases.llvm.org/download.html \
+\
+or through msys2. After that, re-run cmake with either \
+-DGCCCOMPAT_CXX_COMPILER_FOR_MSVC=<path to clang++.exe> \
+or if running msvc/* presets, with GCCCOMPAT_CXX_COMPILER_FOR_MSVC \
+environment variable set to the path \
+to clang++.exe.")
+ endif()
+endif()
+
+
+# additional win32 api libraries
+list(APPEND ASY_STATIC_LIBARIES Shlwapi Shell32 Ws2_32)
+
+# RC file
+set(ASY_WIN_RESOURCE_DIR ${ASY_RESOURCE_DIR}/windows)
+list(APPEND ASY_WIN_RC_FILE ${ASY_WIN_RESOURCE_DIR}/asy.rc)
+
+# Minimum Windows version - for now, pinning on windows 10,
+# since that is currently the minimum supported version by Microsoft
+# See https://learn.microsoft.com/en-us/windows/win32/winprog/using-the-windows-headers
+list(APPEND ASY_MACROS _WIN32_WINNT=_WIN32_WINNT_WIN10)