if(OPENGTL_BUILD_TESTS)
  add_subdirectory(tests)
endif(OPENGTL_BUILD_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} )

## Generate macros.h file

configure_file(Macros.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/Macros.h )

## GTLCore library ##

set(GTLCore_SRCS
  AbstractImage.cpp
  Array.cpp
  Buffer.cpp
  BufferImage.cpp
  CategoriesManager.cpp
  Category.cpp
  Debug.cpp
  ErrorMessage.cpp
  Function.cpp
  Image.cpp
  Optimiser.cpp
  Parameter.cpp
  PixelDescription.cpp
  ProgressReport.cpp
  Region.cpp
  RegionF.cpp
  ScopedName.cpp
  String.cpp
  Type.cpp
  TypesManager.cpp
  Value.cpp
  Version.cpp
# Internal files
  wrappers/Allocate.cpp
  wrappers/ProgressReportWrap.cpp
  AST/AccessorExpression.cpp
  AST/BinaryExpression.cpp
  AST/ConvertExpression.cpp
  AST/CoumpoundExpression.cpp
  AST/ConstantCoumpoundExpression.cpp
  AST/GarbageCollectionStatement.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
  ExpressionGenerationContext_p.cpp
  ExpressionResult_p.cpp
  Function_p.cpp
  FunctionCaller_p.cpp
  FloatHalfConverter_p.cpp
  GenerationContext_p.cpp
  LexerBase_p.cpp
  MemoryManager_p.cpp
  ModuleData_p.cpp
  Optimiser_p.cpp
  ParserBase_p.cpp
  Token_p.cpp
  Type_p.cpp
  TypesManager_p.cpp
  VariableNG_p.cpp
  VariablesManager_p.cpp
  VirtualMachine_p.cpp
  Visitor_p.cpp
# Metadata
  Metadata/Debug_p.cpp
  Metadata/Entry.cpp
  Metadata/Group.cpp
  Metadata/ParameterEntry.cpp
  Metadata/TextEntry.cpp
  Metadata/ValueEntry.cpp
  Metadata/Factory_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( "-D__STDC_CONSTANT_MACROS" )
add_definitions( -DCOUMPONENT_NAME="GTLCore" )
if(OPENGTL_32_BITS)
add_definitions( -DOPENGTL_32_BITS )
endif(OPENGTL_32_BITS)

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

install( FILES Metadata/ParameterEntry.h Metadata/Entry.h Metadata/Group.h Metadata/TextEntry.h DESTINATION ${INCLUDE_INSTALL_DIR}/GTLCore/Metadata )

# Create and install pc file
configure_file("GTLCore.pc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/GTLCore.pc" @ONLY)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/GTLCore.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)  
