if(OPENGTL_BUILD_TESTS)
  add_subdirectory(tests)
endif(OPENGTL_BUILD_TESTS)

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
  AbstractColorConverter.cpp
  AbstractImage.cpp
  Array.cpp
  Buffer.cpp
  BufferImage.cpp
  Debug.cpp
  ChannelsFlags.cpp
  Color.cpp
  ColorConverters.cpp
  CompilationMessage.cpp
  CompilationMessages.cpp
  Function.cpp
  Image.cpp
  Parameter.cpp
  PixelDescription.cpp
  ProgressReport.cpp
  ScopedName.cpp
  String.cpp
  Transform.cpp
  Type.cpp
  TypesManager.cpp
  Value.cpp
  Value_p.cpp
  Version.cpp
# Internal files
  ChannelMaths.cpp
  CompilerBase_p.cpp
  ConvertCenter_p.cpp
  ErrorMessages_p.cpp
  Function_p.cpp
  FunctionCaller_p.cpp
  FloatHalfConverter_p.cpp
  LexerBase_p.cpp
  MemoryManager_p.cpp
  ModuleData_p.cpp
  OperatorOverloadCenter_p.cpp
  ParserBase_p.cpp
  SharedPointer.cpp
  Token_p.cpp
  Type_p.cpp
  TypesManager_p.cpp
  VariableNG_p.cpp
  VariablesManager_p.cpp
  VirtualMachine_p.cpp
# AST
  AST/AccessorExpression.cpp
  AST/Annotation.cpp
  AST/BinaryExpression.cpp
  AST/ConvertExpression.cpp
  AST/CompoundExpression.cpp
  AST/ConstantCompoundExpression.cpp
  AST/GarbageCollectionStatement.cpp
  AST/GenerationVisitor.cpp
  AST/ExpressionResult.cpp
  AST/Expression.cpp
  AST/FunctionDeclaration.cpp
  AST/Node.cpp
  AST/Statement.cpp
  AST/Tree.cpp
  AST/UnaryExpression.cpp
# ASTBackend
  ASTBackend/ExpressionResult.cpp
  ASTBackend/GenerationVisitor.cpp
# LLVMBackend
  LLVMBackend/CodeGenerator_p.cpp
  LLVMBackend/ContextManager_p.cpp
  LLVMBackend/ExpressionResult_p.cpp
  LLVMBackend/ExpressionGenerationContext_p.cpp
  LLVMBackend/GenerationContext_p.cpp
  LLVMBackend/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
# TimeMachine
  TimeController.cpp
  TimeMachine.cpp
  TimeValue_p.cpp
# wrappers
  wrappers/Allocate.cpp
  wrappers/ProgressReportWrap.cpp
  wrappers/TransformWrap_p.cpp
  ${LLVM_NATIVE_OBJECTS}
  )


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

if(NOT MSVC AND NOT APPLE)
set(EXTRA_GTLCORE_LINK_OPTIONS -Wl,-u,_ZTVN4llvm3JITE )
elseif(APPLE)
set(EXTRA_GTLCORE_LINK_OPTIONS -Wl,-u,__ZTVN4llvm3JITE )
endif()

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

# 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" )

# installation
install(TARGETS GTLCore ${INSTALL_TARGETS_DEFAULT_ARGS} )
install( FILES
  AbstractImage.h
  Array.h
  Buffer.h
  BufferImage.h
  ChannelsFlags.h
  Color.h
  CompilationMessage.h
  CompilationMessages.h
  Export.h
  Function.h
  ${CMAKE_CURRENT_BINARY_DIR}/Macros.h
  Image.h
  Parameter.h
  PixelDescription.h
  ProgressReport.h
  Region.h
  ScopedName.h
  StdTypes.h
  String.h
  TimeController.h
  TimeMachine.h
  Transform.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)  
