cmake_minimum_required(VERSION 3.2) project(mandelbrot_ispc.bin) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64 -g -std=c++11 -O3 -Wall") INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/ ${CMAKE_CURRENT_SOURCE_DIR}/generated/) set(ISPC_TARGET "host") if (DEFINED ENV{TRAVIS}) if( $ENV{TRAVIS} STREQUAL "true") message("Setting ISPC Target to AVX on Travis") set(ISPC_TARGET "avx1-i32x8") endif() endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common/) MACRO(ISPC_GENERATE header) SET(hxxFile "${CMAKE_CURRENT_SOURCE_DIR}/generated/${header}_ispc.h") SET(oxxFile "${CMAKE_CURRENT_SOURCE_DIR}/generated/${header}_ispc.o") SET(ISPC_GENERATED_FILES ${hxxFile} ${oxxFile}) message("Generating ISPC files") ADD_CUSTOM_TARGET(RunGenerator-${header} DEPENDS ${ISPC_GENERATED_FILES} COMMENT "Checking if re-generation is required for ${header}.ispc") ADD_DEPENDENCIES(${PROJECT_NAME} RunGenerator-${header}) ADD_CUSTOM_COMMAND( OUTPUT ${ISPC_GENERATED_FILES} COMMAND ispc -O2 --target=${ISPC_TARGET} --arch=x86-64 ${CMAKE_CURRENT_SOURCE_DIR}/${header}.ispc -o ${CMAKE_CURRENT_SOURCE_DIR}/generated/${header}_ispc.o -h ${CMAKE_CURRENT_SOURCE_DIR}/generated/${header}_ispc.h DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${header}.ispc COMMENT "Generate database support code for ${header}.ispc") ENDMACRO() SET(ISPC_FILES mandelbrot) SET(OBJS "") FOREACH(f ${ISPC_FILES}) LIST(APPEND OBJS ${CMAKE_CURRENT_SOURCE_DIR}/generated/${f}_ispc.o) ENDFOREACH(f) add_executable(mandelbrot_ispc.bin ${CMAKE_CURRENT_SOURCE_DIR}/mandelbrotSerial.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../common/ppm.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../common/tasksys.cpp ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ${OBJS} ) target_link_libraries(mandelbrot_ispc.bin pthread m) SET(GCC_PIC_LINK_FLAGS "-no-pie") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_PIC_LINK_FLAGS}") FOREACH(f ${ISPC_FILES}) ISPC_GENERATE(${f}) ENDFOREACH(f) SET_SOURCE_FILES_PROPERTIES( ${OBJS} PROPERTIES EXTERNAL_OBJECT true GENERATED true )