Изменение поведения установки добавленных подкаталогов в cmake [duplicate]

Это не относится к объекту окна. В JavaScript можно получить доступ к любому свойству объекта. Например,

var test = {
    prop1 : true
};

console.log(test.prop1); // true
console.log(test["prop1"]); // also true

Подробнее здесь: https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects

5
задан Heinzi 11 February 2016 в 17:01
поделиться

3 ответа

Если вам не нужны тесты в выпуске вашего проекта (которые вы хотите поставить с помощью CPack), тогда условно укажите подкаталог googletest и установите для параметра false значение false при упаковке:

...
if(NOT DISABLE_TESTS)
    add_subdirectory(googletest)
endif()

упаковка с

cmake -DDISABLE_TESTS=ON <source-dir>
cpack

Альтернативно, если вы хотите тесты, но не хотите устанавливать инфраструктуру тестирования, вы можете отключить команду install посредством определения макроса или функции с тем же именем:

# Replace install() to do-nothing macro.
macro(install)
endmacro()
# Include subproject (or any other CMake code) with "disabled" install().
add_subdirectory(googletest)
# Restore original install() behavior.
macro(install)
    _install(${ARGN})
endmacro()

Этот подход также был предложен в рассылке CMake .

7
ответ дан Tsyvarev 16 August 2018 в 05:38
поделиться
  • 1
    Вторая вещь, похоже, также отключает мои собственные команды установки, хотя они определены в другом (не суб-) каталоге. Для какой области функция установки перезаписана? Могу ли я перезаписать его только для текущего каталога (включая подкаталоги)? – Heinzi 12 February 2016 в 14:29
  • 2
    Can I overwrite it for the current directory (including subdirectories) only? - Именно так должно работать определение функции. Я проверю это позже. – Tsyvarev 12 February 2016 в 14:34
  • 3
    Ну, на самом деле определение функции имеет глобальный масштаб. Я добавил код для восстановления поведения install() в сообщении ответа. – Tsyvarev 8 February 2017 в 20:40
  • 4
    Это не работает. По какой-то причине один из моих других install(DIRECTORY ...) в другом подкаталоге не устанавливается. – Timmmm 9 February 2017 в 12:23
  • 5
    Я думаю, проблема связана с пробелами и безумной системой цитирования CMake. Также, если вы дважды определяете макрос install, оба вызываются. Не важно в этом случае, но как странно это? – Timmmm 9 February 2017 в 12:36

Итак, есть опция macro @Tsyvarev, которая была первоначально предложена здесь здесь :

# overwrite install() command with a dummy macro that is a nop
macro (install)
endmacro ()

# configure build system for external libraries
add_subdirectory(external)

# replace install macro by one which simply invokes the CMake
install() function with the given arguments
macro (install)
  _install(${ARGV})
endmacro(install)

Примечание ${ARGV} и ${ARGN} совпадают, но документы в настоящее время предложите использовать ${ARGN}. Также тот факт, что макро-переписывание добавляет _ к исходному имени макроса, не документируется, но это по-прежнему поведение. См. Код здесь .

Однако , я никогда не получил вышеуказанный код для правильной работы. Действительно, действительно странные вещи и часто называет install() дважды.

Альтернатива - также недокументированная - использовать EXCLUDE_FROM_ALL:

add_subdirectory(external EXCLUDE_FROM_ALL)

Согласно некоторым комментариям, которые я нашел где-то, это отключает install() для этого подкаталога. Я думаю, что он действительно делает EXCLUDE_FROM_ALL по умолчанию для всех команд install(), которые также, вероятно, делают то, что вы хотите. Я действительно не тестировал его, но стоит того.

5
ответ дан Timmmm 16 August 2018 в 05:38
поделиться

Немного поздно ответ, но я просто потратил слишком много времени на это.

В конкретном случае googletests, указав это на вашем верхнем уровне, CMakeLists.txt делает трюк.

option(INSTALL_GMOCK "Install Googletest's GMock?" OFF)
option(INSTALL_GTEST "Install Googletest's GTest?" OFF)
add_subdirectory(googletest)

Я прочитал (я думаю) список рассылки CMake, который делает установку условным на INSTALL_<package name> внутри вашего пакета своего рода стандартом defacto (и я обязательно буду следовать с этого момента! ). Но я не могу найти эту ссылку сейчас.

0
ответ дан user2365669 16 August 2018 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: