При выполнении "find ... -delete" со сложным условием выбора файлов внутри execute_process в CMake не работает условие выбора файлов
ЗАДАЧА: в проекте cmake с помощью команд в CMakeLists.txt удалить из подкаталога build/ все файлы, кроме:
- Файла с заданным именем - например, "file.so";
- Файлов, находящихся в подкаталоге build/CMakeFiles/.
ПРИМЕЧАНИЯ:
- Текущая версия cmake - 3.5; максимально допустимая - 3.7;
- Проект собирается в 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:
- На самом деле, исходная задача состоит в удалении ВСЕХ ИСПОЛНЯЕМЫХ файлов, кроме build/file.so и исполняемых файлов в каталоге build/CMakeFiles/, однако моих знаний в linux командах недостаточно, чтобы решить её - если кто-то сможет с эти помочь, я буду признателен Вам.
- Если кто-то может предложить другую 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$