cmake_minimum_required(VERSION 2.8)

project(Qt4Targets)

cmake_policy(SET CMP0020 NEW)

find_package(Qt4 REQUIRED)

set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

add_executable(Qt4Targets WIN32 main.cpp)
target_link_libraries(Qt4Targets Qt4::QtGui)

if (WIN32)
  if (TARGET Qt4::QAxServer)
    add_executable(activeqtexe WIN32 activeqtexe.cpp)
    set_property(TARGET activeqtexe PROPERTY QT4_NO_LINK_QTMAIN ON)
    target_link_libraries(activeqtexe Qt4::QAxServer Qt4::QtGui)
  endif()
endif()

# Qt4 moc does not support utf8 paths in _parameter files generated by
# qt4_wrap_cpp and qt4_generate_moc
# https://bugreports.qt.io/browse/QTBUG-35480
# Do a simple check if there is are non ASCII character in the build path
string(REGEX MATCH "[^ -~]+" NON_ASCII_BDIR ${CMAKE_CURRENT_BINARY_DIR})
if(NON_ASCII_BDIR)
  message(WARNING "Build path contains non ASCII characters. Skipping Qt4 test.")
  return()
endif()

qt4_generate_moc(main_gen_test.cpp
  "${CMAKE_CURRENT_BINARY_DIR}/main_gen_test.moc"
  TARGET Qt4GenerateMacroTest
)
add_executable(Qt4GenerateMacroTest WIN32 main_gen_test.cpp "${CMAKE_CURRENT_BINARY_DIR}/main_gen_test.moc")
set_property(TARGET Qt4GenerateMacroTest PROPERTY AUTOMOC OFF)
target_include_directories(Qt4GenerateMacroTest PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/interface")
target_link_libraries(Qt4GenerateMacroTest Qt4::QtGui)

qt4_wrap_cpp(moc_file mywrapobject.h
  TARGET Qt4WrapMacroTest
)
add_executable(Qt4WrapMacroTest WIN32 main_wrap_test.cpp ${moc_file})
set_property(TARGET Qt4WrapMacroTest PROPERTY AUTOMOC OFF)
target_include_directories(Qt4WrapMacroTest PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/interface")
target_link_libraries(Qt4WrapMacroTest Qt4::QtGui)

macro(test_incremental def)
  set(timeformat "%Y%j%H%M%S")
  try_compile(RESULT
    "${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild_${def}"
    "${CMAKE_CURRENT_SOURCE_DIR}/IncrementalMoc"
    IncrementalMoc
    CMAKE_FLAGS -D${def}=0 "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}"
    OUTPUT_VARIABLE output
    )
  file(TIMESTAMP "${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild_${def}/moc_foo.cpp" tsvar_before "${timeformat}")
  if (NOT tsvar_before)
    message(SEND_ERROR
      "Unable to read timestamp from moc file from first build with -D${def}!\n"
      "try_compile output:\n${output}"
      )
  endif()

  execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 2) # Ensure that the timestamp will change.

  try_compile(RESULT
    "${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild_${def}"
    "${CMAKE_CURRENT_SOURCE_DIR}/IncrementalMoc"
    IncrementalMoc
    CMAKE_FLAGS -D${def}=1 "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}"
    OUTPUT_VARIABLE output
    )
  file(TIMESTAMP "${CMAKE_CURRENT_BINARY_DIR}/IncrementalMocBuild_${def}/moc_foo.cpp" tsvar_after "${timeformat}")
  if (NOT tsvar_after)
    message(SEND_ERROR
      "Unable to read timestamp from moc file from second build!\n"
      "try_compile output:\n${output}"
      )
  endif()

  if (NOT tsvar_after GREATER tsvar_before)
    message(SEND_ERROR "Rebuild did not re-create moc file with -D${def}. Before: ${tsvar_before}. After: ${tsvar_after}")
  endif()
endmacro()

test_incremental(ADD_TARGET_DEF)
test_incremental(ADD_DIR_DEF)
