При выполнении "find ... -delete" со сложным условием выбора файлов внутри execute_process в CMake не работает условие выбора файлов

ЗАДАЧА: в проекте cmake с помощью команд в CMakeLists.txt удалить из подкаталога build/ все файлы, кроме:

  1. Файла с заданным именем - например, "file.so";
  2. Файлов, находящихся в подкаталоге build/CMakeFiles/.

ПРИМЕЧАНИЯ:

  1. Текущая версия cmake - 3.5; максимально допустимая - 3.7;
  2. Проект собирается в Linux и только в нём.

Для решения этой задачи я пытаюсь использовать консольную команду

find build/ -type f -not \( -name 'file.so' -or -wholename '*CMakeFiles*' \) -delete

В терминале эта команда работает как надо (как я и ожидаю), однако при попытке выполнить эту команду функцией execute_process в CMakeLists.txt возникает проблема: из каталога build/ и его подкаталогов удаляются абсолютно все файлы.

Удалив из команды -delete в CMakeLists.txt, я заметил, что команда find выводит все файлы в каталоге build/ и его подкаталогах (включая файлы, которые я не хочу удалять). При этом, выполняя эту команду без -delete в консоли я получаю только те файлы, которые я хочу удалить.

Из этого результата я делаю предположение, что команда execute_process пропускает условие выбора файлов при запуске команды find.

Вот версия CMakeLists.txt из моего тестового проекта, на которой я остановился сейчас:

cmake_minimum_required(VERSION 3.5)
project(RPOJ)

execute_process(COMMAND "find" 
        "." "-type" "f" "-not" 
        "(" 
        "-name" "'file.so'" 
        "-or" 
        "-wholename" "'*CMakeFiles*'" 
        ")"
#       "-delete"
#       "(-name '*.sh' -or -wholename '*CMakeFiles*')"
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/build
        RESULT_VARIABLE del_res
        OUTPUT_VARIABLE del_out
        ERROR_VARIABLE del_err
)

message("///   RESULT: ${del_res}")
message("///   OUTPUT:")
message(${del_out})
message("///   ERROR:")
message(${del_err})
message("//////////////////////////////////////")
if(NOT ${del_res} EQUAL 0)
    message(FATAL_ERROR "Error: ${del_res}")
endif()

Я запускаю cmake самым простым образом: cmake .

У меня возникла идея, что проблема кроется в некорректном экранирования символов скобок. Однако, я перепробовал множество различных вариантов экранирования символов "\", "(" и ")" из исходной консольной команды и мне не удалось исправить проблему - команда find, вызванная через cmake, игнорирует условие выбора файлов.

Также я пробовал перенести каталог build из WORKING_DIRECTORY в параметры find (вместо .) - не помогло.

У меня закончились идеи и опустились руки.

ВОПРОС: как мне правильно записать команду find в execute_process, чтобы решить поставленную задачу?

ПРИМЕЧАНИЯ 2:

  1. На самом деле, исходная задача состоит в удалении ВСЕХ ИСПОЛНЯЕМЫХ файлов, кроме build/file.so и исполняемых файлов в каталоге build/CMakeFiles/, однако моих знаний в linux командах недостаточно, чтобы решить её - если кто-то сможет с эти помочь, я буду признателен Вам.
  2. Если кто-то может предложить другую linux-команду (или цепочку команд) для решения задачи, такое решение также подойдёт (если я смогу его запустить в cmake).

Исходные данные (тестовый проект):

user@user:~/PROJ$ find . -type f
./build/build_no_exec.txt
./build/file.so
./build/no_build/file_no_exec.txt
./build/no_build/file_delete.so
./build/CMakeFiles/build_no_exec.txt
./build/CMakeFiles/file_no_delete.so
./file.so
./root_no_exec.txt
./CMakeLists.txt
./no_build/file_no_exec.txt
./no_build/file_no_delete.so
user@user:~/PROJ$ 

Запуск find в консоли (есть все файлы, которые я хочу удалить, и нет файлов, которые надо оставить):

user@user:~/PROJ$ find build/ -type f -not \( -name 'file.so' -or -wholename '*CMakeFiles*' \)
build/build_no_exec.txt
build/no_build/file_no_exec.txt
build/no_build/file_delete.so
user@user:~/PROJ$

Запуск cmake (в OUTPUT находятся все файлы из каталога build/ и его подкаталогов):

user@user:~/PROJ$ cmake .
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
///   RESULT: 0
///   OUTPUT:
./build_no_exec.txt
./file.so
./no_build/file_no_exec.txt
./no_build/file_delete.so
./CMakeFiles/build_no_exec.txt
./CMakeFiles/file_no_delete.so

///   ERROR:
CMake Error at CMakeLists.txt:23 (message):
  message called with incorrect number of arguments


//////////////////////////////////////
-- Configuring incomplete, errors occurred!
See also "/home/user/PROJ/CMakeFiles/CMakeOutput.log".
user@user:~/PROJ$ 

Ответы (0 шт):