Перейти к содержанию
    

CMake, как положить результаты работы в каталог

Пытаюсь заставить собираться проект под Cortex-M0+ при помощи GCC и CMake, в принципе, все получается, но один момент никак не хочет работать так, как нужно мне.

Мне хотелось бы, чтобы результат работы линкера сбрасывался не в корень проекта, где лежит CMakeLists.txt, а в подкаталог проекта, например, в bin.

Пишу что-то такое:

#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)

Каталог bin в результате прогона make создается, но он пуст, а прогон make дает следующую ошибку:

[100%] Linking C executable bin\xxx.out
arm-none-eabi-size: 'xxx.out': No such file
mingw32-make[2]: *** [CMakeFiles\xxx.out.dir\build.make:913: bin/xxx.out] Error 1
mingw32-make[2]: *** Deleting file 'bin/xxx.out'
mingw32-make[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/xxx.out.dir/all] Error 2
mingw32-make: *** [Makefile:90: all] Error 2

Если убрать определение CMAKE_RUNTIME_OUTPUT_DIRECTORY, то все работает, но файлы бросаются в корневой каталог, что неудобно.

В чем может быть проблема?

В данный момент я работаю с Windows и mingw.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, Grizzly said:

А если вместо bin указать "${CMAKE_BINARY_DIR}/bin"?

Та же ситуация, каталог создан, но пуст, ошибка та же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот полный текст CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
project(xxx)

enable_language(C ASM)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)

set(EXECUTABLE ${PROJECT_NAME}.out)

include_directories(src)
set(sources 
	src/main.c
	)
add_executable (${EXECUTABLE} ${sources})

target_compile_definitions(${EXECUTABLE} PRIVATE
        -D__ATSAMC21E18A__ 
		-D__TARGET_CPU_CORTEX_M0
		)
		
target_compile_options(${EXECUTABLE} PRIVATE
        -mcpu=cortex-m0plus
		-march=armv6-m
        -mthumb
        -mfloat-abi=soft
        -fdata-sections
        -ffunction-sections
		-fno-strict-aliasing
        -Wall
        -O2
		)

target_link_options(${EXECUTABLE} PRIVATE
        -Tsys/samc21g18a_release.ld
        -mcpu=cortex-m0plus
		-march=armv6-m
        -mthumb
        -mfloat-abi=soft
        -Wl,-Map=${PROJECT_NAME}.map,--cref
        -specs=nano.specs
        -Wl,--gc-sections
        -lm
        -lc
        -lnosys
        )

target_link_libraries(${EXECUTABLE} PRIVATE
		m
		)

add_custom_command(TARGET ${EXECUTABLE}
        POST_BUILD
        COMMAND arm-none-eabi-size ${EXECUTABLE})
		
add_custom_command(TARGET ${EXECUTABLE}
        POST_BUILD
        COMMAND arm-none-eabi-objcopy -O ihex ${EXECUTABLE} ${PROJECT_NAME}.hex
        COMMAND arm-none-eabi-objcopy -O binary ${EXECUTABLE} ${PROJECT_NAME}.bin)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А сами объектные файлы во время компиляции создаются? И где вообще .out находится, если указать CMake'у результат сборки класть в bin?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Grizzly said:

А сами объектные файлы во время компиляции создаются? И где вообще .out находится, если указать CMake'у результат сборки класть в bin?

Не уверен по этому поводу, потому что если он где-то и находится, то make его сразу же после ошиьки стирает. Но предполагаю, что находится он действительно в bin.

На другом форуме обратили внимание на то, что arm-none-eabi-size обращается к ${EXECUTABLE}, который предполагается найти в корне, поэтому нужно обращаться к ./bin/${EXECUTABLE}.

Но я выяснил еще одну вещь - даже если такой подход сработает, то все равно основная работа будет вестись в корне, чего мне не хотелось бы, проблема тут больше с запуском cmake.

Я это делал вот так:

cmake -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=arm-none-eabi-gcc.cmake
mingw32-make

Теперь же делаю вот так:

cmake -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=arm-none-eabi-gcc.cmake . -Bbin
cmake --build ./bin

Теперь вся служебная информация оказывается в bin, включая и генерируемые map, hex, bin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, Polaris сказал:

поэтому нужно обращаться к ./bin/${EXECUTABLE}

Поэтому я спросил про место порождаемых файлов. А правильнее будет вот так:

${PROJECT_BINARY_DIR}/bin/${EXECUTABLE}

21 минуту назад, Polaris сказал:

cmake --build ./bin

Да, теперь всё верно. Нужно обязательно указывать путь при вызове cmake до того каталога, в котором будет вестись сборка.

Это сборка out of source, когда она ведется отдельно от исходных файлов. Мне она тоже более симпатична.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 hours ago, Grizzly said:

Это сборка out of source, когда она ведется отдельно от исходных файлов. Мне она тоже более симпатична.

Согласен, не вижу смысла гадить в каталог с исходниками, даже если это делает CMake

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...