diff options
author | Lenny Maiorani <lenny@colorado.edu> | 2020-12-23 10:07:22 -0700 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-12-24 11:02:04 +0100 |
commit | e4ce485309902c7a2a14fb9b652bc51f46ec8975 (patch) | |
tree | 98d2eff3fc01fceb8adccc99cc5382df86b25f4e /Meta | |
parent | 6db224f020a165a065119231ab5891536d24372f (diff) | |
download | serenity-e4ce485309902c7a2a14fb9b652bc51f46ec8975.zip |
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.
Diffstat (limited to 'Meta')
-rw-r--r-- | Meta/CMake/all_the_debug_macros.cmake (renamed from Meta/all_the_debug_macros.cmake) | 0 | ||||
-rw-r--r-- | Meta/CMake/utils.cmake | 130 | ||||
-rwxr-xr-x | Meta/check-debug-flags.sh | 2 |
3 files changed, 131 insertions, 1 deletions
diff --git a/Meta/all_the_debug_macros.cmake b/Meta/CMake/all_the_debug_macros.cmake index e0e637f07a..e0e637f07a 100644 --- a/Meta/all_the_debug_macros.cmake +++ b/Meta/CMake/all_the_debug_macros.cmake diff --git a/Meta/CMake/utils.cmake b/Meta/CMake/utils.cmake new file mode 100644 index 0000000000..093b16bbae --- /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 0d305bfd7f..822d348caa 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 |