diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ba74b58689..a442a012f59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,7 @@ option(ENABLE_ALL_THE_DEBUG_MACROS "Enable all debug macros to validate they sti option(ENABLE_COMPILETIME_FORMAT_CHECK "Enable compiletime format string checks" ON) option(ENABLE_PCI_IDS_DOWNLOAD "Enable download of the pci.ids database at build time" ON) option(BUILD_LAGOM "Build parts of the system targeting the host OS for fuzzing/testing" OFF) +option(PRECOMPILE_COMMON_HEADERS "Precompile some common headers to speedup compilation" ON) add_custom_target(run COMMAND ${CMAKE_SOURCE_DIR}/Meta/run.sh diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 8b376c97490..3b9e4311ef3 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -361,6 +361,7 @@ add_executable(Kernel ${SOURCES}) target_link_libraries(Kernel kernel_heap gcc stdc++) add_dependencies(Kernel boot kernel_heap) install(TARGETS Kernel RUNTIME DESTINATION boot) +serenity_add_ak_precompiled_headers_to_target(Kernel) add_custom_command( TARGET Kernel diff --git a/Meta/CMake/precompile-headers.cmake b/Meta/CMake/precompile-headers.cmake new file mode 100644 index 00000000000..10064715d68 --- /dev/null +++ b/Meta/CMake/precompile-headers.cmake @@ -0,0 +1,9 @@ +function(serenity_add_precompiled_header_to_target target header) + if (PRECOMPILE_COMMON_HEADERS AND COMMAND target_precompile_headers) + target_precompile_headers(${target} PRIVATE ${header}) + endif () +endfunction() + +function(serenity_add_ak_precompiled_headers_to_target target) + serenity_add_precompiled_header_to_target(${target} ${CMAKE_SOURCE_DIR}/Meta/Precompile/AK.h) +endfunction() diff --git a/Meta/CMake/utils.cmake b/Meta/CMake/utils.cmake index c659abd9005..e3aa4e136e2 100644 --- a/Meta/CMake/utils.cmake +++ b/Meta/CMake/utils.cmake @@ -1,3 +1,5 @@ +include(${CMAKE_SOURCE_DIR}/Meta/CMake/precompile-headers.cmake) + function(serenity_install_headers target_name) file(GLOB_RECURSE headers RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h") foreach(header ${headers}) @@ -31,6 +33,7 @@ function(serenity_lib target_name fs_name) add_library(${target_name} SHARED ${SOURCES} ${GENERATED_SOURCES}) install(TARGETS ${target_name} DESTINATION usr/lib) set_target_properties(${target_name} PROPERTIES OUTPUT_NAME ${fs_name}) + serenity_add_ak_precompiled_headers_to_target(${target_name}) serenity_generated_sources(${target_name}) endfunction() @@ -67,6 +70,7 @@ endfunction() function(serenity_bin target_name) add_executable(${target_name} ${SOURCES}) install(TARGETS ${target_name} RUNTIME DESTINATION bin) + serenity_add_ak_precompiled_headers_to_target(${target_name}) serenity_generated_sources(${target_name}) endfunction() diff --git a/Meta/Precompile/AK.h b/Meta/Precompile/AK.h new file mode 100644 index 00000000000..000af2360d1 --- /dev/null +++ b/Meta/Precompile/AK.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021, Ali Mohammad Pur + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include