2017-02-01 2 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のための新しいマルチラインのルールにそれを兼ね備えています。これはCMakeのmakefileジェネレータでのみ動作することに注意してください。

+0

すばらしい答え!私はCMAKE_C_COMPILE_OBJECTについて知りませんでした。 – loz

+0

私は大きなプロジェクトで実行し、 "o.s"と "o.Soriginal"拡張子のアセンブリファイルを生成するようです。なぜなら、はオブジェクトファイルを表しているからです。 これはうまくいきますが、これらの "o.s"拡張子を見るのはちょっと混乱します。 – loz

+1

@lozそれはCMakeの[拡張ルール](https://cmake.org/Wiki/CMake_Useful_Variables#Expansion_Rules)の問題です。彼らは "ソース名のみ"のための何かを持っていないので、バイナリ出力ディレクトリでカスタムを参照/作成することはできません。フォールバックとして、オブジェクトの出力パスを拡張しました。 – Florian

0

あなたが現在持っているものの例を提供していないので、言うことは非常に難しいです。

しかし、add_custom_command()関数を使用して、前後のスクリプトを任意のターゲットに追加することができます(必要な構文については、「ビルドイベント」セクションのページの下部を参照)。

+0

お返事ありがとうございます。私はadd_custom_command()を使用しようとしましたが、ビルドイベントは3つしかありません(prebuild、prelink、postbuild)。私の場合は、asmファイルの生成直後にトリガされるビルドイベントが必要です。 – loz

+0

あなたの現在のシェイクルールは表示されていないので、あまり言い表せません。私は(少なくとも)AndroidのmakefileやLOCAL_FILTER_ASMに慣れていません。生成されたアセンブリで動作し、その操作の結果を使用してオブジェクトファイルを生成するすべてのソースファイルのコンパイルの途中に何らかの操作を挿入しようとしていますか? – MadScientist

関連する問題