CMake игнорируется -DCMAKE_RUNTIME_OUTPUT_DIRECTORY флаг [дубликат]

Этот код Lua адаптирован из материала, найденного в Википедии, и в инструменте GPSbabel Роберта Липе :

local EARTH_RAD = 6378137.0 
  -- earth's radius in meters (official geoid datum, not 20,000km / pi)

local radmiles = EARTH_RAD*100.0/2.54/12.0/5280.0;
  -- earth's radius in miles

local multipliers = {
  radians = 1, miles = radmiles, mi = radmiles, feet = radmiles * 5280,
  meters = EARTH_RAD, m = EARTH_RAD, km = EARTH_RAD / 1000, 
  degrees = 360 / (2 * math.pi), min = 60 * 360 / (2 * math.pi)
}

function gcdist(pt1, pt2, units) -- return distance in radians or given units
  --- this formula works best for points close together or antipodal
  --- rounding error strikes when distance is one-quarter Earth's circumference
  --- (ref: wikipedia Great-circle distance)
  if not pt1.radians then pt1 = rad(pt1) end
  if not pt2.radians then pt2 = rad(pt2) end
  local sdlat = sin((pt1.lat - pt2.lat) / 2.0);
  local sdlon = sin((pt1.lon - pt2.lon) / 2.0);
  local res = sqrt(sdlat * sdlat + cos(pt1.lat) * cos(pt2.lat) * sdlon * sdlon);
  res = res > 1 and 1 or res < -1 and -1 or res
  res = 2 * asin(res);
  if units then return res * assert(multipliers[units])
  else return res
  end
end

68
задан Vertexwahn 25 December 2016 в 16:57
поделиться

5 ответов

Не нужно устанавливать все переменные, которые вы устанавливаете. CMake устанавливает их в разумные значения по умолчанию. Вы должны определенно не изменить CMAKE_BINARY_DIR или CMAKE_CACHEFILE_DIR. Обработайте их как только для чтения.

Сначала удалите существующий проблемный файл кеша из каталога src:

cd src
rm CMakeCache.txt
cd ..

Затем удалите все команды set() и выполните:

cd Compile
rm -rf *
cmake ../src

Пока вы не находитесь за исходным каталогом при запуске CMake, он не будет изменять исходный каталог, если ваш CMakeList явно не сообщает об этом.

Как только вы это сделаете, вы можете посмотреть, где CMake помещает вещи по умолчанию, и только если вас не устраивают местоположения по умолчанию (например, значение по умолчанию EXECUTABLE_OUTPUT_PATH), измените только те, которые вам нужны. И попытайтесь выразить их относительно CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, PROJECT_BINARY_DIR и т. Д.

. Если вы посмотрите на документацию CMake, вы увидите переменные, разделенные на семантические разделы. За исключением особых условий very , вы должны обрабатывать все перечисленные в разделе «Переменные, которые предоставляют информацию» как доступные только для чтения в CMakeLists.

43
ответ дан the_storyteller 19 August 2018 в 06:09
поделиться
  • 1
    Я начал использовать cmake со сборками в каталоге src ... этот метод не удалось изначально. Как только я удалил все файлы / кеши сборки cmake в каталоге src, эта техника работала. Благодаря! – Avi Tevet 17 October 2014 в 23:33
  • 2
    Может быть, лучше не советовать использовать rm -rf *. Это не очень хорошо, если cd Compile терпит неудачу ... – Roman 28 May 2017 в 06:41
  • 3
    @Roman Я считаю такие примеры командной строки довольно псевдо-кодом. Он менее подробный и более точный, чем набирать «введите» в каталог Compile, удалите все, а затем запустите CMake с помощью пути к исходному каталогу. & Quot; Я предполагаю, что основной здравый смысл & amp; суждение по части читателя. – Angew 29 May 2017 в 08:36
  • 4
    @AviTevet: Я думаю, что это правильный ответ. Если есть файлы кэша cmake из предыдущего вызова cakeake в исходном каталоге, вы не получите cmake, чтобы выбрать другой каталог для сгенерированных файлов, если только вы не удалите все старые из исходного каталога. Довольно разбитое поведение CMake, на мой взгляд. Почему бы вам не написать еще один ответ? – Jo So 15 December 2017 в 17:34
3
ответ дан Avi Tevet 19 August 2018 в 06:09
поделиться

Начиная с CMake Wiki :

CMAKE_BINARY_DIR, если вы создаете исходный код, это то же самое, что и CMAKE_SOURCE_DIR, иначе это каталог верхнего уровня вашего build tree

Сравните эти две переменные, чтобы определить, была ли запущена сборка вне источника

5
ответ дан ldav1s 19 August 2018 в 06:09
поделиться

Прежде всего, вы не должны ретранслировать имя dir в своем скрипте. строка с ../Compile должна быть изменена.

Это потому, что для пользователя нужно компилировать.

Вместо этого используется одна из предопределенных переменных: http: // www.cmake.org/Wiki/CMake_Useful_Variables (найдите CMAKE_BINARY_DIR и CMAKE_CURRENT_BINARY_DIR)

3
ответ дан Michał Walenciak 19 August 2018 в 06:09
поделиться
  • 1
    это именно то, что я искал - CMAKE_CURRENT_BINARY_DIR, обычно рассказывал о текущем двоичном пути сборки. Возможно, он может использоваться для установки зависимых сборников libs / bin. – parasrish 27 March 2018 в 06:07

Похоже, вы хотите из исходной сборки . Есть несколько способов, которыми вы можете создать сборку источника.

  1. Выполняйте то, что вы делали, запустите
    cd /path/to/my/build/folder
    cmake /path/to/my/source/folder
    
    , из-за чего cmake будет генерировать дерево сборки в /path/to/my/build/folder для дерева источника в /path/to/my/source/folder. Когда вы его создали, cmake запоминает, где находится исходная папка, поэтому вы можете повторно запустить cmake в дереве сборки с помощью
    cmake /path/to/my/build/folder
    
    или даже
    cmake .
    
    , если ваш текущий каталог уже является папкой сборки.
  2. Используйте некоторые недокументированные опции , чтобы установить папки источника и сборки :
    cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
    
    , которые будут делать то же самое, что и (1), но без зависимости от текущего рабочего каталога.

По умолчанию CMake выставляет все свои выходы в дереве сборки , поэтому, если вы не используете ${CMAKE_SOURCE_DIR} или ${CMAKE_CURRENT_SOURCE_DIR} в ваших файлах cmake, не должны касаться вашего исходное дерево .

Самое большое, что может пойти не так, если вы уже создали дерево сборки в исходном дереве (т. е. у вас есть в источнике строить). После того, как вы сделали это, вторая часть (1) выше ударит, а cmake не вносит никаких изменений в места источника или сборки. Таким образом, вы не можете создать сборку вне источника для исходного каталога с встроенной сборкой. Вы можете исправить это довольно легко, удалив (как минимум) CMakeCache.txt из исходного каталога. Есть еще несколько файлов (в основном в каталоге CMakeFiles), которые CMake генерирует, которые вы также должны удалить, но это не приведет к тому, что cmake обработает исходное дерево как дерево сборки.

Поскольку сборки вне исходного кода часто более желательны, чем сборники в источнике, вы можете изменить свой cmake, чтобы потребовать от исходных построений:

# Ensures that we do an out of source build

MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
     STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
     "${CMAKE_BINARY_DIR}" insource)
     GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
     STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
     "${PARENTDIR}" insourcesubdir)
    IF(insource OR insourcesubdir)
        MESSAGE(FATAL_ERROR "${MSG}")
    ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)

MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
    "${CMAKE_PROJECT_NAME} requires an out of source build."
)

Вышеуказанный макрос происходит из обычно используемого модуля, называемого MacroOutOfSourceBuild. Есть много источников для MacroOutOfSourceBuild.cmake в google, но я не могу найти оригинал, и он достаточно короткий, чтобы включить здесь полностью.

К сожалению, cmake обычно записывал несколько файлов к тому моменту, когда макрос вызывается, так что, хотя это не остановит вас от фактического выполнения сборки, вам все равно нужно удалить CMakeCache.txt и CMakeFiles.

Возможно, вам будет полезно установить пути, в которых используются двоичные, общие и статические библиотеки записываются в - в этом случае см. , как я могу сделать вывод cmake в «bin» dir? (отказ от ответственности, у меня есть главный голосовой ответ на этот вопрос ... но вот как я знаю о она).

76
ответ дан Palimondo 19 August 2018 в 06:09
поделиться
Другие вопросы по тегам:

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