2011-11-09 10 views
21

Estoy trabajando en un proyecto de analizador fuente C++ y parece que clang es un buen candidato para el trabajo de análisis. El problema es que el clang depende en gran medida del proyecto de infraestructura "llvm", ¿Cómo lo configuro para obtener un front-end limpio sin ningún backend concreto orientado a la máquina? Al igual que LCC, proporcionan un back-end "nulo" para las personas que se centran en las partes del analizador. Cualquier sugerencia es apreciada.¿Cómo hacer un frente de clang limpio?

+1

Aparte de algunas bibliotecas de soporte (que proporcionan algunas clases de utilidades y códigos independientes del sistema operativo), no debería necesitar el LLVM completo. ¿Qué bibliotecas de Clang estás usando? –

+0

Voy a usar todo el ejecutable de clang pero con un back-end ficticio. –

+12

¿Conoces 'libclang'? Es una biblioteca C (con una interfaz estable garantizada) que puede exponer el Clang AST. Es mucho más ligero. De lo contrario, simplemente puede usar las bibliotecas C++ (tenga en cuenta que la interfaz es * no * estable), el ejecutable incrusta cosas que no serán realmente útiles para usted, creo. –

Respuesta

8

Hace poco hice esto en Windows.

Descargue la fuente de clang y llvm de here.

Instale cmake y Python (a diferencia de los documentos, necesita Python solo para generar clang; al menos, cmake se da por vencido si no puede encontrar un tiempo de ejecución de Python).

También necesita VS2008 o VS2010.

Una cosa que no es del todo evidente es la estructura de directorios necesaria:

projectRoot 
    build <- intermediate build files and DLLs, etc. will go here 
    llvm <- contents of llvm-3.0.src from llvm-3.0.tar go here 
     tools 
      clang <- contents of clang-3.0.src from clang-3.0.tar go here 

y siga las windows build instructions desde el paso 4 en adelante. No intente usar la GUI de cmake, es un horror; solo usa los comandos dados en las instrucciones de compilación.

Una vez finalizada la generación (que tarda un tiempo) que tendrá:

projectRoot 
    build 
     bin 
      Release <- libclang.dll will be here 
     lib 
      Release <- libclang.lib will be here 
    llvm 
     tools 
      clang 
       include 
        clang-c <- Index.h is here 

Index.h define la API para acceder a información sobre su código fuente; contiene bastante documentación sobre las API.

Para empezar usando sonido metálico que necesita algo como:

CXIndex index = clang_createIndex(1, 1); 

// Support Microsoft extensions 
char *args[] = {"-fms-extensions"}; 

CXTranslationUnit tu = clang_parseTranslationUnit(index, "mySource.c", args, ARRAY_SIZE(args), 0, 0, 0); 

if (tu) 
{ 
    CXCursor cursor = clang_getTranslationUnitCursor(tu); 

    // Use the cursor functions to navigate through the AST 
} 
+0

Gracias arx! Estoy intentando tu enfoque. –

+0

sí, funciona perfectamente. –

1

Por desgracia, no se puede conseguir front-end "puro" sin detalles específicos de la máquina. C/C++ son idiomas intrínsecamente vinculados a la máquina. Piense en el preprocesador y las definiciones integradas, los tamaños de los tipos integrados, etc. Algunos de estos pueden abstraerse, pero no p. preprocesador.

Cuestiones relacionadas