# Find Doxygen
find_package(Doxygen)

if (DOXYGEN_FOUND)
    # Read the file with the version.
    file(READ ${PROJECT_SOURCE_DIR}/mentos/inc/version.h version_file)
    # Extract the OS version.
    string(REGEX MATCH "OS_MAJOR_VERSION ([0-9]*)" _ ${version_file})
    set(OS_MAJOR_VERSION ${CMAKE_MATCH_1})
    string(REGEX MATCH "OS_MINOR_VERSION ([0-9]*)" _ ${version_file})
    set(OS_MINOR_VERSION ${CMAKE_MATCH_1})
    string(REGEX MATCH "OS_MICRO_VERSION ([0-9]*)" _ ${version_file})
    set(OS_MICRO_VERSION ${CMAKE_MATCH_1})
    # Setup the Doxygen documentation.
    set(DOXYGEN_PROJECT_NAME "MentOS")
    set(DOXYGEN_PROJECT_NUMBER "${OS_MAJOR_VERSION}.${OS_MINOR_VERSION}.${OS_MICRO_VERSION}")
    set(DOXYGEN_PROJECT_BRIEF "The Mentoring Operating System")
    set(DOXYGEN_USE_MDFILE_AS_MAINPAGE ${PROJECT_SOURCE_DIR}/README.md)
    set(DOXYGEN_IMAGE_PATH ${PROJECT_SOURCE_DIR}/doc/resources)
    set(DOXYGEN_SHOW_INCLUDE_FILES NO)
    set(DOXYGEN_GENERATE_TREEVIEW NO)
    set(DOXYGEN_WARN_NO_PARAMDOC YES)

    set(DOXYGEN_ENABLE_PREPROCESSING YES)
    set(DOXYGEN_EXTRACT_STATIC YES)
    set(DOXYGEN_MACRO_EXPANSION YES)
    set(DOXYGEN_EXPAND_ONLY_PREDEF YES)
    set(DOXYGEN_PREDEFINED "__attribute__((x))= _syscall0= _syscall0(x)= _syscall1(x)= _syscall2(x)= _syscall3(x)=")

    set(DOXYGEN_WARN_FORMAT "$file($line): $text")
    set(DOXYGEN_HTML_STYLESHEET ${PROJECT_SOURCE_DIR}/doc/doxygen.css)
    doxygen_add_docs(
        ${PROJECT_NAME}_documentation
        ${PROJECT_SOURCE_DIR}/README.md
        ${PROJECT_SOURCE_DIR}/LICENSE.md
        ${PROJECT_SOURCE_DIR}/doc/signal.md
        ${PROJECT_SOURCE_DIR}/doc/syscall.md
        
        ${PROJECT_SOURCE_DIR}/mentos/inc/boot.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/descriptor_tables/gdt.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/descriptor_tables/idt.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/descriptor_tables/isr.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/descriptor_tables/tss.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/devices/fpu.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/devices/pci.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/drivers/ata/ata.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/drivers/ata/ata_types.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/drivers/fdc.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/drivers/keyboard/keyboard.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/drivers/keyboard/keymap.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/drivers/mouse.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/drivers/ps2.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/drivers/rtc.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/elf/elf.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/fs/ext2.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/fs/ioctl.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/fs/procfs.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/fs/vfs.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/fs/vfs_types.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/hardware/cpuid.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/hardware/pic8259.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/hardware/timer.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/io/proc_modules.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/io/vga/vga.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/io/vga/vga_font.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/io/vga/vga_mode.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/io/vga/vga_palette.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/io/video.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/kernel.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/compiler.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/hashmap.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/irqflags.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/list.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/list_head.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/mutex.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/ndtree.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/rbtree.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/spinlock.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/stack_helper.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/klib/stdatomic.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/link_access.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/mem/buddysystem.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/mem/gfp.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/mem/kheap.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/mem/paging.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/mem/slab.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/mem/vmem_map.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/mem/zone_allocator.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/multiboot.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/process/prio.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/process/process.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/process/scheduler.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/process/wait.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/proc_access.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/sys/errno.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/sys/ipc.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/sys/module.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/sys/reboot.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/sys/types.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/sys/utsname.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/system/panic.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/system/printk.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/system/signal.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/system/syscall.h
        ${PROJECT_SOURCE_DIR}/mentos/inc/version.h

        ${PROJECT_SOURCE_DIR}/mentos/src/boot.c
        ${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/exception.c
        ${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/gdt.c
        ${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/idt.c
        ${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/interrupt.c
        ${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/tss.c
        ${PROJECT_SOURCE_DIR}/mentos/src/devices/fpu.c
        ${PROJECT_SOURCE_DIR}/mentos/src/devices/pci.c
        ${PROJECT_SOURCE_DIR}/mentos/src/drivers/ata.c
        ${PROJECT_SOURCE_DIR}/mentos/src/drivers/fdc.c
        ${PROJECT_SOURCE_DIR}/mentos/src/drivers/keyboard/keyboard.c
        ${PROJECT_SOURCE_DIR}/mentos/src/drivers/keyboard/keymap.c
        ${PROJECT_SOURCE_DIR}/mentos/src/drivers/mouse.c
        ${PROJECT_SOURCE_DIR}/mentos/src/drivers/ps2.c
        ${PROJECT_SOURCE_DIR}/mentos/src/drivers/rtc.c
        ${PROJECT_SOURCE_DIR}/mentos/src/elf/elf.c
        ${PROJECT_SOURCE_DIR}/mentos/src/fs/ext2.c
        ${PROJECT_SOURCE_DIR}/mentos/src/fs/ioctl.c
        ${PROJECT_SOURCE_DIR}/mentos/src/fs/namei.c
        ${PROJECT_SOURCE_DIR}/mentos/src/fs/open.c
        ${PROJECT_SOURCE_DIR}/mentos/src/fs/procfs.c
        ${PROJECT_SOURCE_DIR}/mentos/src/fs/readdir.c
        ${PROJECT_SOURCE_DIR}/mentos/src/fs/read_write.c
        ${PROJECT_SOURCE_DIR}/mentos/src/fs/stat.c
        ${PROJECT_SOURCE_DIR}/mentos/src/fs/vfs.c
        ${PROJECT_SOURCE_DIR}/mentos/src/hardware/cpuid.c
        ${PROJECT_SOURCE_DIR}/mentos/src/hardware/pic8259.c
        ${PROJECT_SOURCE_DIR}/mentos/src/hardware/timer.c
        ${PROJECT_SOURCE_DIR}/mentos/src/io/debug.c
        ${PROJECT_SOURCE_DIR}/mentos/src/io/mm_io.c
        ${PROJECT_SOURCE_DIR}/mentos/src/io/proc_running.c
        ${PROJECT_SOURCE_DIR}/mentos/src/io/proc_system.c
        ${PROJECT_SOURCE_DIR}/mentos/src/io/proc_video.c
        ${PROJECT_SOURCE_DIR}/mentos/src/io/stdio.c
        ${PROJECT_SOURCE_DIR}/mentos/src/io/vga/vga.c
        ${PROJECT_SOURCE_DIR}/mentos/src/io/video.c
        ${PROJECT_SOURCE_DIR}/mentos/src/ipc/msg.c
        ${PROJECT_SOURCE_DIR}/mentos/src/ipc/sem.c
        ${PROJECT_SOURCE_DIR}/mentos/src/ipc/shm.c
        ${PROJECT_SOURCE_DIR}/mentos/src/kernel/sys.c
        ${PROJECT_SOURCE_DIR}/mentos/src/kernel.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/assert.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/ctype.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/fcvt.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/hashmap.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/libgen.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/list.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/math.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/mutex.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/ndtree.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/rbtree.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/spinlock.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/strerror.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/string.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/time.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/vscanf.c
        ${PROJECT_SOURCE_DIR}/mentos/src/klib/vsprintf.c
        ${PROJECT_SOURCE_DIR}/mentos/src/mem/buddysystem.c
        ${PROJECT_SOURCE_DIR}/mentos/src/mem/kheap.c
        ${PROJECT_SOURCE_DIR}/mentos/src/mem/paging.c
        ${PROJECT_SOURCE_DIR}/mentos/src/mem/slab.c
        ${PROJECT_SOURCE_DIR}/mentos/src/mem/vmem_map.c
        ${PROJECT_SOURCE_DIR}/mentos/src/mem/zone_allocator.c
        ${PROJECT_SOURCE_DIR}/mentos/src/multiboot.c
        ${PROJECT_SOURCE_DIR}/mentos/src/process/process.c
        ${PROJECT_SOURCE_DIR}/mentos/src/process/scheduler.c
        ${PROJECT_SOURCE_DIR}/mentos/src/process/scheduler_algorithm.c
        ${PROJECT_SOURCE_DIR}/mentos/src/process/wait.c
        ${PROJECT_SOURCE_DIR}/mentos/src/sys/module.c
        ${PROJECT_SOURCE_DIR}/mentos/src/sys/utsname.c
        ${PROJECT_SOURCE_DIR}/mentos/src/system/errno.c
        ${PROJECT_SOURCE_DIR}/mentos/src/system/panic.c
        ${PROJECT_SOURCE_DIR}/mentos/src/system/printk.c
        ${PROJECT_SOURCE_DIR}/mentos/src/system/signal.c
        ${PROJECT_SOURCE_DIR}/mentos/src/system/syscall.c

        ${PROJECT_SOURCE_DIR}/mentos/src/boot.S
        ${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/exception.S
        ${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/gdt.S
        ${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/idt.S
        ${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/interrupt.S
        ${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/tss.S
        ${PROJECT_SOURCE_DIR}/mentos/src/process/user.S

        ${PROJECT_SOURCE_DIR}/libc/inc/array.h
        ${PROJECT_SOURCE_DIR}/libc/inc/assert.h
        ${PROJECT_SOURCE_DIR}/libc/inc/bits/ioctls.h
        ${PROJECT_SOURCE_DIR}/libc/inc/bits/stat.h
        ${PROJECT_SOURCE_DIR}/libc/inc/bits/termios-struct.h
        ${PROJECT_SOURCE_DIR}/libc/inc/ctype.h
        ${PROJECT_SOURCE_DIR}/libc/inc/fcntl.h
        ${PROJECT_SOURCE_DIR}/libc/inc/fcvt.h
        ${PROJECT_SOURCE_DIR}/libc/inc/grp.h
        ${PROJECT_SOURCE_DIR}/libc/inc/io/ansi_colors.h
        ${PROJECT_SOURCE_DIR}/libc/inc/io/debug.h
        ${PROJECT_SOURCE_DIR}/libc/inc/io/mm_io.h
        ${PROJECT_SOURCE_DIR}/libc/inc/io/port_io.h
        ${PROJECT_SOURCE_DIR}/libc/inc/ipc/ipc.h
        ${PROJECT_SOURCE_DIR}/libc/inc/ipc/msg.h
        ${PROJECT_SOURCE_DIR}/libc/inc/ipc/sem.h
        ${PROJECT_SOURCE_DIR}/libc/inc/ipc/shm.h
        ${PROJECT_SOURCE_DIR}/libc/inc/libgen.h
        ${PROJECT_SOURCE_DIR}/libc/inc/limits.h
        ${PROJECT_SOURCE_DIR}/libc/inc/math.h
        ${PROJECT_SOURCE_DIR}/libc/inc/pwd.h
        ${PROJECT_SOURCE_DIR}/libc/inc/ring_buffer.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sched.h
        ${PROJECT_SOURCE_DIR}/libc/inc/signal.h
        ${PROJECT_SOURCE_DIR}/libc/inc/stdarg.h
        ${PROJECT_SOURCE_DIR}/libc/inc/stdbool.h
        ${PROJECT_SOURCE_DIR}/libc/inc/stddef.h
        ${PROJECT_SOURCE_DIR}/libc/inc/stdint.h
        ${PROJECT_SOURCE_DIR}/libc/inc/stdio.h
        ${PROJECT_SOURCE_DIR}/libc/inc/stdlib.h
        ${PROJECT_SOURCE_DIR}/libc/inc/strerror.h
        ${PROJECT_SOURCE_DIR}/libc/inc/string.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/bitops.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/dirent.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/errno.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/ioctl.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/kernel_levels.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/reboot.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/stat.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/types.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/unistd.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/utsname.h
        ${PROJECT_SOURCE_DIR}/libc/inc/sys/wait.h
        ${PROJECT_SOURCE_DIR}/libc/inc/system/syscall_types.h
        ${PROJECT_SOURCE_DIR}/libc/inc/termios.h
        ${PROJECT_SOURCE_DIR}/libc/inc/time.h

        ${PROJECT_SOURCE_DIR}/libc/src/abort.c
        ${PROJECT_SOURCE_DIR}/libc/src/assert.c
        ${PROJECT_SOURCE_DIR}/libc/src/ctype.c
        ${PROJECT_SOURCE_DIR}/libc/src/fcvt.c
        ${PROJECT_SOURCE_DIR}/libc/src/grp.c
        ${PROJECT_SOURCE_DIR}/libc/src/io/debug.c
        ${PROJECT_SOURCE_DIR}/libc/src/io/mm_io.c
        ${PROJECT_SOURCE_DIR}/libc/src/ipc/ipc.c
        ${PROJECT_SOURCE_DIR}/libc/src/libc_start.c
        ${PROJECT_SOURCE_DIR}/libc/src/libgen.c
        ${PROJECT_SOURCE_DIR}/libc/src/math.c
        ${PROJECT_SOURCE_DIR}/libc/src/pwd.c
        ${PROJECT_SOURCE_DIR}/libc/src/sched.c
        ${PROJECT_SOURCE_DIR}/libc/src/setenv.c
        ${PROJECT_SOURCE_DIR}/libc/src/stdio.c
        ${PROJECT_SOURCE_DIR}/libc/src/stdlib.c
        ${PROJECT_SOURCE_DIR}/libc/src/strerror.c
        ${PROJECT_SOURCE_DIR}/libc/src/string.c
        ${PROJECT_SOURCE_DIR}/libc/src/sys/errno.c
        ${PROJECT_SOURCE_DIR}/libc/src/sys/ioctl.c
        ${PROJECT_SOURCE_DIR}/libc/src/sys/unistd.c
        ${PROJECT_SOURCE_DIR}/libc/src/sys/utsname.c
        ${PROJECT_SOURCE_DIR}/libc/src/termios.c
        ${PROJECT_SOURCE_DIR}/libc/src/time.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/chdir.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/close.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/creat.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/exec.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/exit.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/fork.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/getcwd.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/getdents.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/getgid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/getpgid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/getpid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/getppid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/getsid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/getuid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/interval.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/kill.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/lseek.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/mkdir.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/nice.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/open.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/read.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/reboot.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/rmdir.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/setgid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/setpgid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/setsid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/setuid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/signal.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/stat.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/unlink.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/waitpid.c
        ${PROJECT_SOURCE_DIR}/libc/src/unistd/write.c
        ${PROJECT_SOURCE_DIR}/libc/src/vscanf.c
        ${PROJECT_SOURCE_DIR}/libc/src/vsprintf.c

        ${PROJECT_SOURCE_DIR}/libc/src/crt0.S
    )
endif (DOXYGEN_FOUND)