add_subdirectory(tests)

# Find llvm jit, interpreter and native
FIND_LLVM_LIBS( ${LLVM_CONFIG_EXECUTABLE} "native bitwriter linker bitreader jit interpreter support ipo" LLVM_LIBS LLVM_NATIVE_OBJECTS )

include_directories( ${LLVM_INCLUDE_DIR} )

## GTLCore library ##

set(GTLCore_SRCS
  AbstractImage.cpp
  BufferImage.cpp
  Array.cpp
  Image.cpp
  Buffer.cpp
  Debug.cpp
  ErrorMessage.cpp
  Function.cpp
  Optimiser.cpp
  Parameter.cpp
  PixelDescription.cpp
  Region.cpp
  RegionF.cpp
  ScopedName.cpp
  String.cpp
  Type.cpp
  TypeManager.cpp
  Value.cpp
# Internal files
  AST/AccessorExpression.cpp
  AST/BinaryExpression.cpp
  AST/ConvertExpression.cpp
  AST/CoumpoundExpression.cpp
  AST/Expression.cpp
  AST/FunctionDeclaration.cpp
  AST/Statement.cpp
  AST/Tree.cpp
  AST/UnaryExpression.cpp
  CodeGenerator_p.cpp
  CompilerBase_p.cpp
  ConvertCenter_p.cpp
  ErrorMessages_p.cpp
  ExpressionResult_p.cpp
  Function_p.cpp
  FunctionCaller_p.cpp
  FloatHalfConverter_p.cpp
  GenerationContext_p.cpp
  LexerBase_p.cpp
  ModuleData_p.cpp
  Optimiser_p.cpp
  ParserBase_p.cpp
  Token_p.cpp
  Type_p.cpp
  TypeManager_p.cpp
  VariableNG_p.cpp
  VirtualMachine_p.cpp
  Visitor_p.cpp
  ${LLVM_NATIVE_OBJECTS}
  )


# Create GTLCore library
add_library(GTLCore SHARED ${GTLCore_SRCS} ${llvm_objects})

target_link_libraries(GTLCore ${LLVM_LIBS_JIT} ${LLVM_LDFLAGS} ${LLVM_LIBS} )

# Set the ABI version of the library
set_target_properties(GTLCore PROPERTIES VERSION ${OPENGTL_LIB_VERSION} SOVERSION ${OPENGTL_LIB_SOVERSION} )

# __STDC_LIMIT_MACROS is needed by LLVM's DataTypes.h
add_definitions( "-D__STDC_LIMIT_MACROS" )
add_definitions( -DCOUMPONENT_NAME="GTLCore" )

# installation
install(TARGETS GTLCore  DESTINATION ${LIB_INSTALL_DIR} )
install( FILES Parameter.h Function.h Array.h Buffer.h ErrorMessage.h PixelDescription.h Region.h RegionF.h ScopedName.h String.h Type.h Value.h Version.h Macros.h AbstractImage.h BufferImage.h Image.h DESTINATION ${INCLUDE_INSTALL_DIR}/GTLCore )

