2013-03-04 11 views
7

Attualmente sto configurando SCons per la compilazione incrociata con Windows come sistema operativo host. Sto creando un custom Environment per il cross-compiler, ma SCons insiste nel cercare Visual Studio ogni volta che lo avvio (e stampa un avviso che non riesce a trovarlo, perché non ce l'ho installato). Posso impedirgli di cercare strumenti standard che so che non userò?Impedisci alle SCons di cercare strumenti standard

risposta

6

ci sono almeno 2 modi per fare questo, il primo modo è il più facile, provare a creare l'ambiente che specifica il compilatore, come segue:

env = Environment(CC = '/path/to/the/compiler') 

avrete probabilmente bisogno di aggiungere percorsi per il linker e altri strumenti. Quindi SCons non dovrebbe cercarli.

Un altro modo per farlo sarebbe quello di creare una definizione strumento per la cross-compilatore utilizzando l'argomento tools sulla funzione Environment() come menzionato nella sezione FILE DI CONFIGURAZIONE DI RIFERIMENTO del SCons man page, dove si precisa quanto segue:

Inoltre, uno specifico insieme di strumenti con i quali per inizializzare l'ambiente può essere specificato come argomento parola chiave opzionale:

env = Environment(tools = ['msvc', 'lex'])

attrezzi non integrati possono essere specificati utilizzando l'argomento percorso utensile:

env = Environment(tools = ['default', 'foo'], toolpath = ['tools'])

...

I singoli elementi della lista utensili può anche essere a loro volta liste di due elementi della forma (toolname, kw_dict). SCons cerca il file delle specifiche del toolname come descritto sopra e passa kw_dict, che deve essere un dizionario, come argomenti delle parole chiave per la funzione di generazione dello strumento . La funzione di generazione può utilizzare gli argomenti per modificare il comportamento dello strumento impostando l'ambiente in in modi diversi o modificando in altro modo l'inizializzazione.

strumenti/my_tool.py:

def generate(env, **kw): 
    # Sets MY_TOOL to the value of keyword argument 'arg1' or 1. 
    env['MY_TOOL'] = kw.get('arg1', '1') 
def exists(env): 
    return 1 

SConstruct:

env = Environment(tools = ['default', ('my_tool', {'arg1': 'abc'})], 
        toolpath=['tools']) 
+0

Grazie per questa eccellente risposta. Vado con il secondo approccio, sembra più quello di cui ho bisogno. –

+0

@ BjörnPollex, felice di aiutare :) – Brady

+2

Questa soluzione purtroppo non risolve il problema dell'avvertimento.Il problema qui era che anche se creo un ambiente personalizzato, il 'DefaultEnvironment' è ancora inizializzato con strumenti predefiniti. L'aggiunta di un 'DefaultEnvironment (tools = [])' ha risolto questo problema. –

1

Si può sopprimere avvertimenti come questo

env.SetOption('warn', 'no-visual-c-missing') 

Ad esempio, per eseguire la cross-compilazione per microcontrollori ARM Cortex-M, sto facendo questo

cross = 'arm-none-eabi-' 
toolchain = { 
    'CC': cross + 'gcc', 
    'CXX': cross + 'g++', 
    'AR': cross + 'ar', 
    'AS': cross + 'gcc', 
    'OBJCOPY': cross + 'objcopy', 
    'SIZE': cross + 'size', 
    'PROGSUFFIX': '.elf', 
} 

env = Environment(tools=('gcc', 'g++', 'gnulink', 'ar', 'as'), ENV=os.environ) 
env.SetOption('warn', 'no-visual-c-missing') 
env.Replace(**toolchain) 
+0

Se si aggiunge DefaultEnvironment (tools = []), non è necessario sopprimere l'avviso assumendo che sia elencato esplicitamente anche gli strumenti per ciascun Ambiente creato() e che gli elenchi non includano msvc, msvs, ecc. – bdbaddog