From e4ce485309902c7a2a14fb9b652bc51f46ec8975 Mon Sep 17 00:00:00 2001 From: Lenny Maiorani Date: Wed, 23 Dec 2020 10:07:22 -0700 Subject: [PATCH] CMake: Decouple cmake utility functions from top-level CMakeLists.txt Problem: - These utility functions are only used in `AK`, but are being defined in the top-level. This clutters the top-level. Solution: - Move the utility functions to `Meta/CMake/utils.cmake` and include where needed. - Also, move `all_the_debug_macros.cmake` into `Meta/CMake` directory to consolidate the location of `*.cmake` script files. --- AK/CMakeLists.txt | 1 + CMakeLists.txt | 133 +------------------- Meta/{ => CMake}/all_the_debug_macros.cmake | 0 Meta/CMake/utils.cmake | 130 +++++++++++++++++++ Meta/check-debug-flags.sh | 2 +- 5 files changed, 133 insertions(+), 133 deletions(-) rename Meta/{ => CMake}/all_the_debug_macros.cmake (100%) create mode 100644 Meta/CMake/utils.cmake diff --git a/AK/CMakeLists.txt b/AK/CMakeLists.txt index 5fc9dcd20e1..509d3d45092 100644 --- a/AK/CMakeLists.txt +++ b/AK/CMakeLists.txt @@ -1,2 +1,3 @@ +include(${CMAKE_SOURCE_DIR}/Meta/CMake/utils.cmake) serenity_install_headers(AK) serenity_install_sources(AK) diff --git a/CMakeLists.txt b/CMakeLists.txt index 024f5223a91..0c83aed1948 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,7 +55,7 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") endif() if (ALL_THE_DEBUG_MACROS) - include(Meta/all_the_debug_macros.cmake) + include(${CMAKE_SOURCE_DIR}/Meta/CMake/all_the_debug_macros.cmake) endif(ALL_THE_DEBUG_MACROS) include_directories(Libraries) @@ -69,137 +69,6 @@ add_subdirectory(Libraries/LibRegex/Tests) set(write_if_different ${CMAKE_SOURCE_DIR}/Meta/write-only-on-difference.sh) -function(serenity_install_headers target_name) - file(GLOB_RECURSE headers RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h") - foreach(header ${headers}) - get_filename_component(subdirectory ${header} DIRECTORY) - install(FILES ${header} DESTINATION usr/include/${target_name}/${subdirectory}) - endforeach() -endfunction() - -function(serenity_install_sources target_name) - file(GLOB_RECURSE sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h" "*.cpp") - foreach(source ${sources}) - get_filename_component(subdirectory ${source} DIRECTORY) - install(FILES ${source} DESTINATION usr/src/serenity/${target_name}/${subdirectory}) - endforeach() -endfunction() - -function(serenity_generated_sources target_name) - if(DEFINED GENERATED_SOURCES) - set_source_files_properties(${GENERATED_SOURCES} PROPERTIES GENERATED 1) - foreach(generated ${GENERATED_SOURCES}) - get_filename_component(generated_name ${generated} NAME) - add_dependencies(${target_name} generate_${generated_name}) - endforeach() - endif() -endfunction() - -function(serenity_lib target_name fs_name) - serenity_install_headers(${target_name}) - serenity_install_sources("Libraries/${target_name}") - #add_library(${target_name} SHARED ${SOURCES} ${GENERATED_SOURCES}) - add_library(${target_name} SHARED ${SOURCES} ${GENERATED_SOURCES} ${CMAKE_SOURCE_DIR}/Libraries/LibC/crt0_shared.cpp) - #library_sources("{target_name}" PRIVATE ${CMAKE_SOURCE_DIR}/Libraries/LibC/crt0_shared.cpp) - install(TARGETS ${target_name} DESTINATION usr/lib) - set_target_properties(${target_name} PROPERTIES OUTPUT_NAME ${fs_name}) - serenity_generated_sources(${target_name}) -endfunction() - -function(serenity_shared_lib target_name fs_name) - serenity_install_headers(${target_name}) - serenity_install_sources("Libraries/${target_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_generated_sources(${target_name}) -endfunction() - -function(serenity_libc target_name fs_name) - serenity_install_headers("") - serenity_install_sources("Libraries/LibC") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdlib -fpic") - add_library(${target_name} SHARED ${SOURCES}) - install(TARGETS ${target_name} DESTINATION usr/lib) - set_target_properties(${target_name} PROPERTIES OUTPUT_NAME ${fs_name}) - target_link_directories(LibC PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) - serenity_generated_sources(${target_name}) -endfunction() - -function(serenity_libc_static target_name fs_name) - serenity_install_headers("") - serenity_install_sources("Libraries/LibC") - add_library(${target_name} ${SOURCES}) - install(TARGETS ${target_name} ARCHIVE DESTINATION usr/lib) - set_target_properties(${target_name} PROPERTIES OUTPUT_NAME ${fs_name}) - target_link_directories(${target_name} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) - serenity_generated_sources(${target_name}) -endfunction() - -function(serenity_bin target_name) - add_executable(${target_name} ${SOURCES}) - target_sources(${target_name} PRIVATE ${CMAKE_SOURCE_DIR}/Libraries/LibC/crt0_shared.cpp) - install(TARGETS ${target_name} RUNTIME DESTINATION bin) - serenity_generated_sources(${target_name}) -endfunction() - -function(serenity_app target_name) - cmake_parse_arguments(SERENITY_APP "" "ICON" "" ${ARGN}) - - serenity_bin("${target_name}") - set(small_icon "${CMAKE_SOURCE_DIR}/Base/res/icons/16x16/${SERENITY_APP_ICON}.png") - set(medium_icon "${CMAKE_SOURCE_DIR}/Base/res/icons/32x32/${SERENITY_APP_ICON}.png") - - if (EXISTS "${small_icon}") - embed_resource("${target_name}" serenity_icon_s "${small_icon}") - endif() - if (EXISTS "${medium_icon}") - embed_resource("${target_name}" serenity_icon_m "${medium_icon}") - endif() - - # TODO: Issue warnings if the app icons don't exist -endfunction() - -function(compile_gml source output string_name) - set(source ${CMAKE_CURRENT_SOURCE_DIR}/${source}) - add_custom_command( - OUTPUT ${output} - COMMAND ${write_if_different} ${output} ${CMAKE_SOURCE_DIR}/Meta/text-to-cpp-string.sh ${string_name} ${source} - VERBATIM - DEPENDS ${CMAKE_SOURCE_DIR}/Meta/text-to-cpp-string.sh - MAIN_DEPENDENCY ${source} - ) - get_filename_component(output_name ${output} NAME) - add_custom_target(generate_${output_name} DEPENDS ${output}) -endfunction() - - -function(compile_ipc source output) - set(source ${CMAKE_CURRENT_SOURCE_DIR}/${source}) - add_custom_command( - OUTPUT ${output} - COMMAND ${write_if_different} ${output} ${CMAKE_BINARY_DIR}/DevTools/IPCCompiler/IPCCompiler ${source} - VERBATIM - DEPENDS IPCCompiler - MAIN_DEPENDENCY ${source} - ) - get_filename_component(output_name ${output} NAME) - add_custom_target(generate_${output_name} DEPENDS ${output}) -endfunction() - -function(embed_resource target section file) - get_filename_component(asm_file "${file}" NAME) - set(asm_file "${CMAKE_CURRENT_BINARY_DIR}/${target}-${section}.s") - get_filename_component(input_file "${file}" ABSOLUTE) - add_custom_command( - OUTPUT "${asm_file}" - COMMAND "${CMAKE_SOURCE_DIR}/Meta/generate-embedded-resource-assembly.sh" "${asm_file}" "${section}" "${input_file}" - DEPENDS "${input_file}" "${CMAKE_SOURCE_DIR}/Meta/generate-embedded-resource-assembly.sh" - COMMENT "Generating ${asm_file}" - ) - target_sources("${target}" PRIVATE "${asm_file}") -endfunction() - find_program(CCACHE_PROGRAM ccache) if(CCACHE_PROGRAM) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") diff --git a/Meta/all_the_debug_macros.cmake b/Meta/CMake/all_the_debug_macros.cmake similarity index 100% rename from Meta/all_the_debug_macros.cmake rename to Meta/CMake/all_the_debug_macros.cmake diff --git a/Meta/CMake/utils.cmake b/Meta/CMake/utils.cmake new file mode 100644 index 00000000000..093b16bbaed --- /dev/null +++ b/Meta/CMake/utils.cmake @@ -0,0 +1,130 @@ +function(serenity_install_headers target_name) + file(GLOB_RECURSE headers RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h") + foreach(header ${headers}) + get_filename_component(subdirectory ${header} DIRECTORY) + install(FILES ${header} DESTINATION usr/include/${target_name}/${subdirectory}) + endforeach() +endfunction() + +function(serenity_install_sources target_name) + file(GLOB_RECURSE sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h" "*.cpp") + foreach(source ${sources}) + get_filename_component(subdirectory ${source} DIRECTORY) + install(FILES ${source} DESTINATION usr/src/serenity/${target_name}/${subdirectory}) + endforeach() +endfunction() + +function(serenity_generated_sources target_name) + if(DEFINED GENERATED_SOURCES) + set_source_files_properties(${GENERATED_SOURCES} PROPERTIES GENERATED 1) + foreach(generated ${GENERATED_SOURCES}) + get_filename_component(generated_name ${generated} NAME) + add_dependencies(${target_name} generate_${generated_name}) + endforeach() + endif() +endfunction() + +function(serenity_lib target_name fs_name) + serenity_install_headers(${target_name}) + serenity_install_sources("Libraries/${target_name}") + #add_library(${target_name} SHARED ${SOURCES} ${GENERATED_SOURCES}) + add_library(${target_name} SHARED ${SOURCES} ${GENERATED_SOURCES} ${CMAKE_SOURCE_DIR}/Libraries/LibC/crt0_shared.cpp) + #library_sources("{target_name}" PRIVATE ${CMAKE_SOURCE_DIR}/Libraries/LibC/crt0_shared.cpp) + install(TARGETS ${target_name} DESTINATION usr/lib) + set_target_properties(${target_name} PROPERTIES OUTPUT_NAME ${fs_name}) + serenity_generated_sources(${target_name}) +endfunction() + +function(serenity_shared_lib target_name fs_name) + serenity_install_headers(${target_name}) + serenity_install_sources("Libraries/${target_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_generated_sources(${target_name}) +endfunction() + +function(serenity_libc target_name fs_name) + serenity_install_headers("") + serenity_install_sources("Libraries/LibC") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdlib -fpic") + add_library(${target_name} SHARED ${SOURCES}) + install(TARGETS ${target_name} DESTINATION usr/lib) + set_target_properties(${target_name} PROPERTIES OUTPUT_NAME ${fs_name}) + target_link_directories(LibC PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) + serenity_generated_sources(${target_name}) +endfunction() + +function(serenity_libc_static target_name fs_name) + serenity_install_headers("") + serenity_install_sources("Libraries/LibC") + add_library(${target_name} ${SOURCES}) + install(TARGETS ${target_name} ARCHIVE DESTINATION usr/lib) + set_target_properties(${target_name} PROPERTIES OUTPUT_NAME ${fs_name}) + target_link_directories(${target_name} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) + serenity_generated_sources(${target_name}) +endfunction() + +function(serenity_bin target_name) + add_executable(${target_name} ${SOURCES}) + target_sources(${target_name} PRIVATE ${CMAKE_SOURCE_DIR}/Libraries/LibC/crt0_shared.cpp) + install(TARGETS ${target_name} RUNTIME DESTINATION bin) + serenity_generated_sources(${target_name}) +endfunction() + +function(serenity_app target_name) + cmake_parse_arguments(SERENITY_APP "" "ICON" "" ${ARGN}) + + serenity_bin("${target_name}") + set(small_icon "${CMAKE_SOURCE_DIR}/Base/res/icons/16x16/${SERENITY_APP_ICON}.png") + set(medium_icon "${CMAKE_SOURCE_DIR}/Base/res/icons/32x32/${SERENITY_APP_ICON}.png") + + if (EXISTS "${small_icon}") + embed_resource("${target_name}" serenity_icon_s "${small_icon}") + endif() + if (EXISTS "${medium_icon}") + embed_resource("${target_name}" serenity_icon_m "${medium_icon}") + endif() + + # TODO: Issue warnings if the app icons don't exist +endfunction() + +function(compile_gml source output string_name) + set(source ${CMAKE_CURRENT_SOURCE_DIR}/${source}) + add_custom_command( + OUTPUT ${output} + COMMAND ${write_if_different} ${output} ${CMAKE_SOURCE_DIR}/Meta/text-to-cpp-string.sh ${string_name} ${source} + VERBATIM + DEPENDS ${CMAKE_SOURCE_DIR}/Meta/text-to-cpp-string.sh + MAIN_DEPENDENCY ${source} + ) + get_filename_component(output_name ${output} NAME) + add_custom_target(generate_${output_name} DEPENDS ${output}) +endfunction() + + +function(compile_ipc source output) + set(source ${CMAKE_CURRENT_SOURCE_DIR}/${source}) + add_custom_command( + OUTPUT ${output} + COMMAND ${write_if_different} ${output} ${CMAKE_BINARY_DIR}/DevTools/IPCCompiler/IPCCompiler ${source} + VERBATIM + DEPENDS IPCCompiler + MAIN_DEPENDENCY ${source} + ) + get_filename_component(output_name ${output} NAME) + add_custom_target(generate_${output_name} DEPENDS ${output}) +endfunction() + +function(embed_resource target section file) + get_filename_component(asm_file "${file}" NAME) + set(asm_file "${CMAKE_CURRENT_BINARY_DIR}/${target}-${section}.s") + get_filename_component(input_file "${file}" ABSOLUTE) + add_custom_command( + OUTPUT "${asm_file}" + COMMAND "${CMAKE_SOURCE_DIR}/Meta/generate-embedded-resource-assembly.sh" "${asm_file}" "${section}" "${input_file}" + DEPENDS "${input_file}" "${CMAKE_SOURCE_DIR}/Meta/generate-embedded-resource-assembly.sh" + COMMENT "Generating ${asm_file}" + ) + target_sources("${target}" PRIVATE "${asm_file}") +endfunction() diff --git a/Meta/check-debug-flags.sh b/Meta/check-debug-flags.sh index 0d305bfd7f4..822d348caa5 100755 --- a/Meta/check-debug-flags.sh +++ b/Meta/check-debug-flags.sh @@ -11,7 +11,7 @@ while IFS= read -r FLAG; do # We simply search whether the CMakeLists.txt *ever* sets the flag. # There are (basically) no false positives, but there might be false negatives, # for example we intentionally don't check for commented-out lines here. - if ! grep -qP "add_compile_definitions\(\"${FLAG}" Meta/all_the_debug_macros.cmake ; then + if ! grep -qP "add_compile_definitions\(\"${FLAG}" Meta/CMake/all_the_debug_macros.cmake ; then echo "ALL_THE_DEBUG_MACROS probably doesn't include ${FLAG}" MISSING_FLAGS=y fi