2017-02-01 15 views

ответ

2

Я признаю, что у меня был поиск what LOCAL_FILTER_ASM does.

Так следующее мой кусок кода (те же функции только в CMake):

cmake_minimum_required(VERSION 3.0) 
project(LocalFilterASM C ASM) 

set(LOCAL_FILTER_ASM "cp") 

string(
    REPLACE 
     "<ASSEMBLY_SOURCE>" "<OBJECT>.S.original" 
     MY_CREATE_ASSEMBLY "${CMAKE_C_CREATE_ASSEMBLY_SOURCE}" 
) 
string(
    REPLACE 
     "<SOURCE>" "<OBJECT>.S" 
     MY_COMPILE_OBJECT "${CMAKE_ASM_COMPILE_OBJECT}" 
) 

set(
    CMAKE_C_COMPILE_OBJECT 
     "${MY_CREATE_ASSEMBLY}" 
     "${LOCAL_FILTER_ASM} <OBJECT>.S.original <OBJECT>.S" 
     "${MY_COMPILE_OBJECT}" 
) 

file(WRITE main.c "int main(void) { return 0; }") 
add_executable(${PROJECT_NAME} main.c) 

Это просто принимает некоторые из существующих правил компилятора CMake и объединяет его в новое правило многострочного для CMAKE_C_COMPILE_OBJECT. Обратите внимание, что это будет работать только с генераторами Makefile от CMake.

+0

Отличный ответ! Я не знал о CMAKE_C_COMPILE_OBJECT. – loz

+0

Я выполнил более крупный проект и, кажется, генерирует сборные файлы с расширением «o.s» и «o.S.original», потому что я считаю, что обозначает объектные файлы. Он работает хорошо, однако немного странно видеть эти расширения «o.s». – loz

+1

@loz. Это проблема с [правилами расширения] CMake (https://cmake.org/Wiki/CMake_Useful_Variables#Expansion_Rules). У них нет чего-то только для «имени источника», поэтому я не могу ссылаться/создавать что-то обычное в двоичном каталоге вывода. В качестве резервного я расширил выходной путь объекта. – Florian

0

Сложно сказать, так как вы не представили ни одного примера того, что у вас есть.

Однако вы можете использовать функцию add_custom_command() для добавления до и после скриптов в любую цель (см. Нижнюю часть страницы в разделе «Build Events» для синтаксиса, который вы хотите).

+0

Спасибо за ответ. Я попытался использовать add_custom_command(), но у него есть только три события сборки (prebuild, prelink, postbuild). В моем случае мне понадобится событие сборки, которое запускается сразу после создания файла asm. – loz

+0

Ну, как сказано, так как вы не показываете свои текущие правила cmake, мы не можем сказать об этом. Я (по крайней мере) не знаком с файлами Android или LOCAL_FILTER_ASM. Вы пытаетесь вставить некоторую операцию в середину компиляции каждого исходного файла, который будет работать на сгенерированной сборке, а затем использовать результаты этой операции для создания объектного файла? – MadScientist