2013-05-28 3 views
2

Я написал небольшой скрипт bash (не так), чтобы генерировать мои общие файлы make-файлов. Эти make-файлы определяют архитектуру хоста в начале и создают все объекты и выходы в папке с именем arch.cmake - создать защищенный от архитектуры make-файл

это выглядит следующим образом:

uname_m = $(shell uname -m) 
DETECTED_ARCHITECTURE=$(uname_m) 
ifeq ($(ARCH), x86_64) 
    CFLAGS += -m64 
    LDFLAGS += -m64 
endif 
ifeq ($(ARCH), x86) 
    CFLAGS += -m32 
    LDFLAGS += -m32 
endif 
OUTPUT_DIR = $(DETECTED_ARCHITECTURE)/ 
OBJ_PREFIX_DIR = $(OUTPUT_DIR)objs/ 

Так, например, если я запускаю сделать для моего кода в моей работе ПК, он выводит все в папку с именем i686, дома в x86_64 папку, и на моей малины, в руки. Кроме того, если я делаю что-то вроде ARCH = i686 make, он правильно переопределяет обнаруженную архитектуру так, чтобы она задавала правильные параметры компилятора и выводила каталог. Окончательный вывод идет в OUTPUT_DIR, и все сгенерированные файлы .o переходят в OUTPUT_DIR/objs.

Я пытаюсь сделать что-то подобное с cmake. Я посмотрел на CMake add_custom_command/_target in different directories for cross-compilation и CMAKE output directory depending on generator architecture, но я не хочу, чтобы архитектура зависела от генератора. Я хочу, чтобы он зависел от компилирующей машины.

Например, код i в моем компьютере и скомпилируйте его. если все пойдет хорошо, я ssh к моей малине, смонтируйте папку кода с моего компьютера до малины через sshfs и скомпилируйте ее там. Поскольку все идет в другую папку (armv6l vs x86_64), конфликтов нет, и мне не нужно повторно генерировать make-файл, чистить или что-то еще.

Итак, в принципе, можно ли сказать cmake, чтобы сделать архитектуру makefile известной? Благодаря

+0

возможно дубликат [Как определить целевую архитектуру с помощью CMake?] (Http://stackoverflow.com/questions/11944060/how-to-detect -target-architecture-using-cmake) –

ответ

1

Это взято из следующих электронной почты теме: Determine-32-vs-64-bit-cpu

if(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    set(arch_64 TRUE) 
else() 
    set(arch_64 FALSE) 
endif() 

И следующее предостережение было дано

Однако помните, что на Mac OS X это почти всегда неправильное дело, когда вы строите универсальные бинарные файлы . Итак, если ваше программное обеспечение должно работать на Mac, вам понадобится , чтобы принять специальные меры предосторожности.

Я использовал этот метод с успехом.

Если вы не беспокоитесь о Mac, это должно сработать для вас. Если вы беспокоитесь о Mac, вам нужно проверить, находитесь ли вы на Mac и используете «живые» двоичные флаги вместо 64 против 32 флагов.

EDIT

Лучший ответ дается здесь: https://stackoverflow.com/a/12024211/1399279.

В частности, проверить его реализацию CMake этого здесь: https://github.com/petroules/solar-cmake/blob/master/TargetArch.cmake

+0

Это способное правильно угадывать между 32 и 64 бит. но как насчет руки? Он просто попадет в 32-разрядную секцию и с треском провалится. Мое намерение состоит в том, чтобы отделить файлы сборки в соответствии с архитектурой, а не только размер указателя. Фрагмент make-файла, который я написал, делает именно это.Я мог бы просто попытаться «вставить» этот фрагмент make-файла внутри сценария cmake, чтобы он включался в создание make-файла. Является ли это возможным? –

+0

@RhiakathFlanders Хм ... Я не думал об этом. К сожалению, вы не можете «внедрить» фрагменты Makefile через ваш CMakeLists.txt, насколько мне известно. Проверьте этот ответ на довольно окольный метод: http://stackoverflow.com/a/12024211/1399279 – SethMMorton

+0

Sweet little jesus! этот парень написал святую Библию в cmake, чтобы обнаружить архитектуру! Но это все еще не то, что я хотел ... Он может обнаружить архитектуру в cmake, но я хочу сделать это в make-файле (во время компиляции). Думаю, это невозможно с cmake. Cmake должен знать заранее, где он будет размещать выходные данные и что я хочу, для make-файла, чтобы решить, где он будет размещать его. Таким образом, я мог бы просто передать код через sshfs и использовать «make», не создавая снова файл makefile. Поэтому мне понадобится cmake, чтобы вставить это arch-detecting в make-файл. –

Смежные вопросы