fix overflow in a_linalg_plu
[liba.git] / CMakeLists.txt
blob3b034e2df1abab5db299649be54da1fe408c78b6
1 set(CMAKE_POLICY_DEFAULT_CMP0048 NEW)
2 set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
3 cmake_minimum_required(VERSION 2.8.12...4.0)
4 include(cmake/CMakeModulePath.cmake)
5 include(cmake/Languages.cmake)
6 project(liba ${LANGUAGES})
7 include(cmake/Project.cmake)
8 include(cmake/core/file.cmake)
9 include(cmake/core/string.cmake)
10 include(cmake/CMakeByteOrder.cmake)
11 include(cmake/CMakeBuildType.cmake)
12 include(cmake/EnabledLanguages.cmake)
13 include(cmake/TargetSupportsSharedLibs.cmake)
14 include(cmake/TargetSupportsExecutables.cmake)
15 include(cmake/TargetSupportsSymbolicLink.cmake)
17 option(LIBA_STATIC "Enable/Disable finding and linking static libraries" 0)
19 if(LIBA_STATIC)
20   include(cmake/CMakeFindLibraryStatic.cmake)
21 endif()
23 option(LIBA_WARNINGS "Enable/Disable warnings" 0)
25 if(LIBA_WARNINGS)
26   include(cmake/TargetWarnings.cmake)
27 endif()
29 option(LIBA_ANALYZER "Enable/Disable analyzer" 0)
31 if(LIBA_ANALYZER)
32   include(cmake/TargetAnalyzer.cmake)
33 endif()
35 option(LIBA_SANITIZE "Enable/Disable sanitize" 0)
37 if(LIBA_SANITIZE)
38   include(cmake/TargetSanitize.cmake)
39 endif()
41 if(LIBA_STATIC)
42   include(cmake/TargetStatic.cmake)
43 endif()
45 option(LIBA_CCACHE "Enable/Disable ccache" 0)
47 if(LIBA_CCACHE)
48   include(cmake/UseCCache.cmake)
49 endif()
51 if(UNIX)
52   set(LIBA_MATH "m" CACHE FILEPATH "system math library")
53 else()
54   set(LIBA_MATH "" CACHE FILEPATH "system math library")
55 endif()
57 set(LIBA_INSTALL "" CACHE STRING "Specify installation behavior")
58 set(LIBA_FLOAT 8 CACHE STRING "floating-point number bytes")
59 set_property(CACHE LIBA_FLOAT PROPERTY STRINGS 4 8 16)
60 include(CheckLibraryExists)
62 function(check_math VARIABLE FUNCTION)
63   get_filename_component(LOCATION "${LIBA_MATH}" DIRECTORY)
64   list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBA_MATH})
66   if(LIBA_FLOAT GREATER 8)
67     set(FUNCTION ${FUNCTION}l)
68   elseif(LIBA_FLOAT EQUAL 4)
69     set(FUNCTION ${FUNCTION}f)
70   endif()
72   check_library_exists("${LIBA_MATH}"
73     ${FUNCTION} "${LOCATION}" ${VARIABLE}
74   )
75 endfunction()
77 check_math(A_HAVE_ASINH asinh)
78 check_math(A_HAVE_ACOSH acosh)
79 check_math(A_HAVE_ATANH atanh)
80 check_math(A_HAVE_EXPM1 expm1)
81 check_math(A_HAVE_LOG1P log1p)
82 check_math(A_HAVE_ATAN2 atan2)
83 check_math(A_HAVE_HYPOT hypot)
84 check_math(A_HAVE_CSQRT csqrt)
85 check_math(A_HAVE_CPOW cpow)
86 check_math(A_HAVE_CEXP cexp)
87 check_math(A_HAVE_CLOG clog)
88 check_math(A_HAVE_CSIN csin)
89 check_math(A_HAVE_CCOS ccos)
90 check_math(A_HAVE_CTAN ctan)
91 check_math(A_HAVE_CSINH csinh)
92 check_math(A_HAVE_CCOSH ccosh)
93 check_math(A_HAVE_CTANH ctanh)
94 check_math(A_HAVE_CASIN casin)
95 check_math(A_HAVE_CACOS cacos)
96 check_math(A_HAVE_CATAN catan)
97 check_math(A_HAVE_CASINH casinh)
98 check_math(A_HAVE_CACOSH cacosh)
99 check_math(A_HAVE_CATANH catanh)
101 option(LIBA_DOXYGEN "Enable/Disable doxygen" 0)
103 if(LIBA_DOXYGEN)
104   find_package(Doxygen OPTIONAL_COMPONENTS dot mscgen dia)
105 endif()
107 option(LIBA_CPPCHECK "Enable/Disable cppcheck" 0)
109 if(LIBA_CPPCHECK)
110   find_package(Cppcheck)
111 endif()
113 option(LIBA_CLANG_TIDY "Enable/Disable clang-tidy" 0)
115 if(LIBA_CLANG_TIDY)
116   find_package(ClangTidy)
117 endif()
119 option(LIBA_IWYU "Enable/Disable include-what-you-use" 0)
121 if(LIBA_IWYU)
122   find_package(IWYU)
123 endif()
125 option(LIBA_IPO "Enable/Disable interprocedural optimization" 0)
127 # https://cmake.org/cmake/help/latest/module/CheckIPOSupported.html
128 if(NOT CMAKE_VERSION VERSION_LESS 3.9 AND LIBA_IPO)
129   cmake_policy(SET CMP0069 NEW)
130   include(CheckIPOSupported)
131   check_ipo_supported(RESULT LIBA_IPO)
132 endif()
134 if(DEFINED ENV{ANDROID_ROOT} AND EXISTS $ENV{ANDROID_ROOT})
135   option(LIBA_PIE "Enable/Disable position independent code" 1)
136 else()
137   option(LIBA_PIE "Enable/Disable position independent code" 0)
138 endif()
140 # https://cmake.org/cmake/help/latest/module/CheckPIESupported.html
141 if(NOT CMAKE_VERSION VERSION_LESS 3.14)
142   cmake_policy(SET CMP0083 NEW)
143   include(CheckPIESupported)
144   check_pie_supported()
145 endif()
147 function(set_library_options)
148   if(LIBA_IWYU AND IWYU_FOUND)
149     add_include_what_you_use(TARGETS ${ARGN})
150   endif()
152   if(LIBA_CLANG_TIDY AND CLANG_TIDY_FOUND)
153     add_clang_tidy(TARGETS ${ARGN} OPTIONS --fix)
154   endif()
156   if(LIBA_CPPCHECK AND CPPCHECK_FOUND)
157     add_cppcheck(TARGETS ${ARGN} OPTIONS --enable=warning,performance)
158   endif()
160   set_target_properties(${ARGN} PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${LIBA_IPO}
161     C_VISIBILITY_PRESET hidden CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN 1
162   )
164   if(CMAKE_C_COMPILER_ID MATCHES "TinyCC" AND CMAKE_STATIC_LIBRARY_SUFFIX STREQUAL .lib)
165     set_property(TARGET ${ARGN} PROPERTY IMPORT_SUFFIX .def)
166   endif()
168   if(LIBA_WARNINGS)
169     target_compile_warnings(${ARGN})
170   endif()
172   if(LIBA_ANALYZER)
173     target_compile_analyzer(${ARGN})
174   endif()
175 endfunction()
177 function(add_library_properties target scope source)
178   target_compile_definitions(${target} ${scope} $<TARGET_PROPERTY:${source},${ARGV3}COMPILE_DEFINITIONS>)
179   target_include_directories(${target} ${scope} $<TARGET_PROPERTY:${source},${ARGV3}INCLUDE_DIRECTORIES>)
181   if(${scope} MATCHES "PUBLIC|PRIVATE")
182     set_property(TARGET ${target} APPEND PROPERTY LINK_LIBRARIES $<TARGET_PROPERTY:${source},${ARGV3}LINK_LIBRARIES>)
183   endif()
185   if(${scope} MATCHES "PUBLIC|INTERFACE")
186     set_property(TARGET ${target} APPEND PROPERTY INTERFACE_LINK_LIBRARIES $<TARGET_PROPERTY:${source},${ARGV3}LINK_LIBRARIES>)
187   endif()
188 endfunction()
190 option(LIBA_MIMALLOC "Enable/Disable override using mimalloc" 0)
192 if(LIBA_MIMALLOC)
193   find_package(mimalloc)
194 endif()
196 if(mimalloc_FOUND)
197   if(TARGET mimalloc-static)
198     set(MIMALLOC_LIBRARY mimalloc-static)
199   else()
200     set(MIMALLOC_LIBRARY mimalloc)
201   endif()
202 endif()
204 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/.git)
205   find_package(Git)
207   if(GIT_FOUND)
208     function(git_command output)
209       execute_process(ERROR_QUIET
210         COMMAND ${GIT_EXECUTABLE} ${ARGN}
211         OUTPUT_STRIP_TRAILING_WHITESPACE
212         OUTPUT_VARIABLE ${output}
213       )
214       set(${output} ${${output}} PARENT_SCOPE)
215     endfunction()
217     git_command(GIT_COMMIT_LONG log -1 --pretty=format:%H)
218     git_command(GIT_COMMIT_DATE log -1 --pretty=format:%cd --date=format:%Y%m%d)
219   endif()
221   if(GIT_COMMIT_DATE)
222     set(${PROJECT_NAME}_VERSION_TWEAK ${GIT_COMMIT_DATE})
223     set(PROJECT_VERSION_TWEAK ${GIT_COMMIT_DATE})
224     set(A_VERSION_TWEAK ${GIT_COMMIT_DATE})
225   endif()
226 endif()
228 if(NOT EXISTS "${A_HAVE_H}")
229   set(A_HAVE_H ${CMAKE_CURRENT_BINARY_DIR}/a.cmake.h)
230   configure_file(${CMAKE_CURRENT_LIST_DIR}/include/a.cmake.h.in ${A_HAVE_H})
231 endif()
233 if(IS_ABSOLUTE "${LIBA_MATH}")
234   get_filename_component(math ${LIBA_MATH} NAME_WE)
235   string(REGEX REPLACE "^${CMAKE_STATIC_LIBRARY_PREFIX}(.+)" "\\1" math "${math}")
236   set(LIBA_MATH $<BUILD_INTERFACE:${LIBA_MATH}> $<INSTALL_INTERFACE:${math}>)
237 endif()
239 if(TARGET_SUPPORTS_SYMBOLIC_LINK)
240   option(LIBA_SYMLINK "Enable/Disable symbolic link" 1)
241 endif()
243 function(set_library_compile target)
244   if(EXISTS "${A_HAVE_H}")
245     file(RELATIVE_PATH a_have_h ${PROJECT_SOURCE_DIR}/include/a ${A_HAVE_H})
246     target_compile_definitions(${target} PUBLIC $<BUILD_INTERFACE:A_HAVE_H="${a_have_h}">)
247   endif()
249   if((LIBA_SYMLINK OR WIN32) AND TARGET_SUPPORTS_SYMBOLIC_LINK)
250     set_target_properties(${target} PROPERTIES SOVERSION
251       ${PROJECT_VERSION_MAJOR} VERSION ${PROJECT_VERSION}
252     )
253   endif()
255   set_target_properties(${target} PROPERTIES OUTPUT_NAME a
256     POSITION_INDEPENDENT_CODE 1 DEFINE_SYMBOL A_EXPORTS
257   )
258   target_compile_definitions(${target} PRIVATE A_EXPORTS)
259   target_include_directories(${target} BEFORE PUBLIC
260     $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
261     $<INSTALL_INTERFACE:include>
262   )
263   get_property(TYPE TARGET ${target} PROPERTY TYPE)
265   if(${TYPE} MATCHES "(STATIC|SHARED|MODULE)_LIBRARY")
266     target_link_libraries(${target} PUBLIC ${LIBA_MATH})
267   endif()
269   set_library_options(${target})
270 endfunction()
272 if(LIBA_CXX)
273   file_scaner(SOURCES RECURSE include src EXT c h cc hh cpp hpp)
274 else()
275   file_scaner(SOURCES RECURSE include src EXT c h)
276 endif()
278 add_library(a OBJECT ${SOURCES})
279 set_library_compile(a)
281 if(LIBA_MIMALLOC AND mimalloc_FOUND)
282   set_property(SOURCE ${CMAKE_CURRENT_LIST_DIR}/src/a.c
283     APPEND PROPERTY COMPILE_DEFINITIONS A_HAVE_MIMALLOC_H
284   )
286   if(CMAKE_VERSION VERSION_LESS 3.12)
287     add_library_properties(a PUBLIC ${MIMALLOC_LIBRARY} INTERFACE_)
288   else()
289     target_link_libraries(a PUBLIC ${MIMALLOC_LIBRARY})
290   endif()
291 endif()
293 include(GNUInstallDirs)
294 set(INSTALL_TARGETS "")
296 if("${LIBA_INSTALL}" MATCHES "^$|static")
297   list(APPEND INSTALL_TARGETS alib)
298 endif()
300 add_library(alib STATIC $<TARGET_OBJECTS:a>)
301 set_library_compile(alib)
303 if(LIBA_MIMALLOC AND mimalloc_FOUND)
304   target_link_libraries(alib PUBLIC ${MIMALLOC_LIBRARY})
305 endif()
307 if(TARGET_SUPPORTS_SHARED_LIBS)
308   if("${LIBA_INSTALL}" MATCHES "^$|shared")
309     list(APPEND INSTALL_TARGETS liba)
310   endif()
312   add_library(liba SHARED $<TARGET_OBJECTS:a>)
313   set_library_compile(liba)
315   if(LIBA_MIMALLOC AND mimalloc_FOUND)
316     target_link_libraries(liba PUBLIC ${MIMALLOC_LIBRARY})
317   endif()
319   if(CMAKE_STATIC_LIBRARY_SUFFIX STREQUAL .lib)
320     set_property(TARGET liba PROPERTY OUTPUT_NAME liba)
321   endif()
323   target_compile_definitions(liba INTERFACE A_IMPORTS)
325   if(LIBA_STATIC)
326     target_link_static(liba)
327   endif()
328 endif()
330 if(LIBA_SANITIZE)
331   add_library(asan OBJECT ${SOURCES})
332   set_library_compile(asan)
333   target_compile_sanitize(asan)
335   if(LIBA_MIMALLOC AND mimalloc_FOUND)
336     if(CMAKE_VERSION VERSION_LESS 3.12)
337       add_library_properties(asan PUBLIC ${MIMALLOC_LIBRARY} INTERFACE_)
338     else()
339       target_link_libraries(asan PUBLIC ${MIMALLOC_LIBRARY})
340     endif()
341   endif()
342 endif()
344 if(INSTALL_TARGETS)
345   include(cmake/InstallTargets.cmake)
346   install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/include/a DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
348   if(EXISTS "${A_HAVE_H}")
349     install(FILES ${A_HAVE_H} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/a)
350     install_hook(${CMAKE_INSTALL_INCLUDEDIR}/a/a.h A_HAVE_H ${A_HAVE_H})
351   endif()
352 endif()
354 option(LIBA_PKGCONFIG "Enable/Disable pkgconfig" 0)
356 if(LIBA_PKGCONFIG)
357   include(cmake/InstallPkgConfig.cmake)
358   install_pkgconfig(${PROJECT_NAME} alib)
359 endif()
361 option(LIBA_LIBTOOL "Enable/Disable libtool" 0)
363 if(LIBA_LIBTOOL AND INSTALL_TARGETS)
364   include(cmake/InstallLibtool.cmake)
365   install_libtool(${INSTALL_TARGETS})
366 endif()
368 set(LIBA_VCPKG "" CACHE PATH "vcpkg installation root")
370 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/vcpkg AND LIBA_VCPKG AND GIT_COMMIT_LONG)
371   if(NOT EXISTS ${LIBA_VCPKG})
372     set(LIBA_VCPKG ${CMAKE_CURRENT_BINARY_DIR}/vcpkg)
373     install(DIRECTORY ${LIBA_VCPKG} DESTINATION ${CMAKE_INSTALL_DATADIR})
374   endif()
376   configure_file(
377     ${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/portfile.cmake
378     ${LIBA_VCPKG}/ports/${PROJECT_NAME}/portfile.cmake
379     @ONLY
380   )
381   configure_file(
382     ${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/vcpkg.json
383     ${LIBA_VCPKG}/ports/${PROJECT_NAME}/vcpkg.json
384     @ONLY
385   )
386 endif()
388 if(PROJECT_IS_TOP_LEVEL)
389   add_custom_target(afmt)
390   add_custom_target(adoc)
391   include(CTest)
392 endif()
394 if(NOT CMAKE_FIND_LIBRARY_PREFIXES)
395   set(CMAKE_FIND_LIBRARY_PREFIXES ";lib")
396 endif()
398 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/java/CMakeLists.txt)
399   option(LIBA_JAVA "Enable/Disable java" 0)
401   if(LIBA_JAVA)
402     find_package(Java)
403     find_package(JNI)
404   endif()
406   if(LIBA_JAVA AND Java_JAVAC_EXECUTABLE)
407     add_subdirectory(java)
408   endif()
409 endif()
411 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/javascript/CMakeLists.txt)
412   if(EMSCRIPTEN)
413     option(LIBA_JAVASCRIPT "Enable/Disable javascript" 1)
414   else()
415     option(LIBA_JAVASCRIPT "Enable/Disable javascript" 0)
416   endif()
418   if(LIBA_JAVASCRIPT)
419     if(NOT EMSCRIPTEN)
420       find_package(Emscripten)
421     endif()
423     if(EMSCRIPTEN OR EMSCRIPTEN_FOUND)
424       add_subdirectory(javascript)
425     endif()
426   endif()
427 endif()
429 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/lua/CMakeLists.txt)
430   option(LIBA_LUA "Enable/Disable lua" 0)
431   option(LIBA_LUAJIT "Enable/Disable luajit" 0)
432   option(LIBA_WITH_LUA "Enable/Disable build with lua" 0)
434   if(LIBA_LUA OR LIBA_LUAJIT OR LIBA_WITH_LUA)
435     set(LUA_MATH_LIBRARY ${LIBA_MATH} CACHE STRING "lua math library")
436   endif()
438   if(NOT LIBA_WITH_LUA AND LIBA_LUA)
439     find_package(Lua OPTIONAL_COMPONENTS lua)
440     set(LUA_LIBRARIES lualib)
441   endif()
443   if((LIBA_LUA AND NOT LUA_FOUND AND NOT LIBA_WITH_LUA) OR LIBA_LUAJIT)
444     find_package(LuaJIT OPTIONAL_COMPONENTS luajit)
445     set(LUA_EXECUTABLE ${LUAJIT_EXECUTABLE})
446     set(LUA_LIBRARIES luajit)
447   endif()
449   if(LIBA_LUA AND LUA_FOUND)
450     add_subdirectory(lua)
451   elseif(LIBA_LUAJIT AND LUAJIT_FOUND)
452     add_subdirectory(lua)
453   elseif(LIBA_WITH_LUA)
454     add_subdirectory(lua)
455   endif()
456 endif()
458 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/python/CMakeLists.txt)
459   option(LIBA_PYTHON "Enable/Disable python" 0)
461   if(LIBA_PYTHON)
462     find_package(Python COMPONENTS Development OPTIONAL_COMPONENTS Interpreter)
463     find_package(Cython)
464   endif()
466   if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/python/src/liba.c OR CYTHON_FOUND)
467     if(Python_FOUND)
468       add_subdirectory(python)
469     endif()
470   endif()
471 endif()
473 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/quickjs/CMakeLists.txt)
474   option(LIBA_QUICKJS "Enable/Disable quickjs" 0)
475   option(LIBA_WITH_QUICKJS "Enable/Disable build with quickjs" 0)
477   if(LIBA_QUICKJS OR LIBA_WITH_QUICKJS)
478     set(QUICKJS_MATH_LIBRARY ${LIBA_MATH} CACHE STRING "quickjs math library")
479   endif()
481   if(NOT LIBA_WITH_QUICKJS AND LIBA_QUICKJS)
482     find_package(QuickJS)
483   endif()
485   if(LIBA_QUICKJS AND QUICKJS_FOUND)
486     add_subdirectory(quickjs)
487   elseif(LIBA_WITH_QUICKJS)
488     add_subdirectory(quickjs)
489   endif()
490 endif()
492 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/test/CMakeLists.txt)
493   if(PROJECT_IS_TOP_LEVEL AND BUILD_TESTING)
494     add_subdirectory(test)
495   endif()
496 endif()
498 set(CPACK_SOURCE_IGNORE_FILES ${CMAKE_CURRENT_LIST_DIR}/.git)
500 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/.git AND GIT_FOUND)
501   execute_process(ERROR_QUIET
502     COMMAND ${GIT_EXECUTABLE} status -z --ignored=matching
503     OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE ignore
504   )
505   string(REPLACE "." "\\\\." ignore "${ignore}")
506   string(REPLACE "*" ".*" ignore "${ignore}")
507   string(REPLACE "?? " "!! " ignore "${ignore}")
508   string(REGEX MATCHALL "!! [^!]+" ignore "${ignore}")
509   string(REPLACE "!! " "${CMAKE_CURRENT_LIST_DIR}/" ignore "${ignore}")
510   list(APPEND CPACK_SOURCE_IGNORE_FILES ${ignore})
511 endif()
513 set(CPACK_RESOURCE_FILE_README ${CMAKE_CURRENT_LIST_DIR}/README.md)
514 set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/LICENSE.txt)
515 include(CPack)
517 if(PROJECT_IS_TOP_LEVEL AND BUILD_TESTING)
518   find_package(ClangFormat)
519 endif()
521 if(CLANG_FORMAT_FOUND)
522   file_scaner(SOURCES EXT c h cc hh cpp hpp RECURSE include src test
523     java/src javascript/src lua/src quickjs/src
524   )
525   add_clang_format(afmt.c VERBOSE ${SOURCES})
526   add_dependencies(afmt afmt.c)
527 endif()
529 if(PROJECT_IS_TOP_LEVEL AND BUILD_TESTING)
530   find_package(Black)
531 endif()
533 if(BLACK_FOUND)
534   add_black(afmt.py ${CMAKE_CURRENT_LIST_DIR})
535   add_dependencies(afmt afmt.py)
536 endif()
538 if(NOT CMAKE_VERSION VERSION_LESS 3.9 AND DOXYGEN_FOUND)
539   # Project related configuration options
540   set(DOXYGEN_CREATE_SUBDIRS YES)
541   set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C YES)
543   # Build related configuration options
544   set(DOXYGEN_EXTRACT_STATIC YES)
546   # Configuration options related to warning and progress messages
547   set(DOXYGEN_WARN_IF_UNDOCUMENTED NO)
548   set(DOXYGEN_WARN_NO_PARAMDOC YES)
550   # Configuration options related to the input files
551   set(DOXYGEN_RECURSIVE YES)
553   # Configuration options related to source browsing
554   # Configuration options related to the alphabetical class index
555   # Configuration options related to the HTML output
556   set(DOXYGEN_GENERATE_HTML YES)
557   set(DOXYGEN_USE_MATHJAX YES)
558   set(DOXYGEN_MATHJAX_VERSION MathJax_3)
560   # Configuration options related to the LaTeX output
561   # Configuration options related to the RTF output
562   # Configuration options related to the man page output
563   # Configuration options related to the XML output
564   set(DOXYGEN_GENERATE_XML YES)
566   # Configuration options related to the DOCBOOK output
567   # Configuration options for the AutoGen Definitions output
568   # Configuration options related to Sqlite3 output
569   # Configuration options related to the Perl module output
570   # Configuration options related to the preprocessor
571   set(DOXYGEN_MACRO_EXPANSION YES)
572   set(DOXYGEN_PREDEFINED
573     "__STDC_VERSION__=201112L"
574     "__cplusplus=201103L"
575     "A_INLINE:=inline"
576     "A_NONULL():="
577     "A_FORMAT():="
578     "A_EXTERN:="
579     "A_INTERN:="
580     "A_PUBLIC:="
581     "A_HIDDEN:="
582   )
584   file(STRINGS "${A_HAVE_H}" macros REGEX "#define[ ]+A_HAVE_.+")
586   foreach(macro ${macros})
587     string(REGEX REPLACE "#define[ ]+(.*)[ ]+(.+)" "\\1=\\2" macro "${macro}")
588     list(APPEND DOXYGEN_PREDEFINED ${macro})
589   endforeach()
591   # Configuration options related to external references
592   # Configuration options related to the dot tool
593   if(Doxygen_dot_FOUND)
594     set(DOXYGEN_HAVE_DOT YES)
595     set(DOXYGEN_INTERACTIVE_SVG YES)
596     set(DOXYGEN_DOT_IMAGE_FORMAT svg)
597     set(DOXYGEN_DOT_MULTI_TARGETS YES)
598   endif()
600   # https://www.doxygen.nl/manual/config.html
601   doxygen_add_docs(adoc.c WORKING_DIRECTORY
602     ${CMAKE_CURRENT_LIST_DIR}/include/a
603     ${CMAKE_CURRENT_LIST_DIR}/include/a
604     ${CMAKE_CURRENT_LIST_DIR}/README.md
605   )
606   add_dependencies(adoc adoc.c)
607 endif()