diff options
Diffstat (limited to 'graphics/asymptote/cmake-scripts')
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) |