Intel SPMD Program Compiler on Visual Studio
Introduction
The CMake, from ver. 3.21, supports Intel SPMD Program Compiler (ISPC), but only for make and Ninja. I often use Visual Studio for C++ developments, and so need useful code pieces for CMakeLists.txt.
Functions
This is always included from the root CMakeLists.txt. Ofcourse I know that gathering sources automatically is not recommended.
function(add_ispcs ISPC_OBJECTS FILES)
set(OBJECT_FILES "")
foreach(SOURCE_FILE IN LISTS FILES)
string(REPLACE ".ispc" ".ispc.o" OBJECT_FILE ${SOURCE_FILE})
get_filename_component(OBJECT_FILE ${OBJECT_FILE} NAME)
set(OBJECT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_FILE})
set(OBJECT_FILES "${OBJECT_FILES};${OBJECT_FILE}")
string(REPLACE ".ispc" ".h" HEADER_FILE ${SOURCE_FILE})
add_custom_command(OUTPUT ${OBJECT_FILE}
PREBUILD
COMMAND ${ISPC_BIN} ${SOURCE_FILE} -o ${OBJECT_FILE} --target=${ISPC_TARGET} --arch=${ISPC_ARCH} --cpu=${ISPC_CPU} -h ${HEADER_FILE}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
endforeach()
set(${ISPC_OBJECTS} ${OBJECT_FILES} PARENT_SCOPE)
endfunction(add_ispcs)
function(expand_files FILES SOURCE)
file (GLOB SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE})
set(${FILES} ${SOURCES} PARENT_SCOPE)
endfunction(expand_files)
function(expand_absolute_files FILES SOURCE)
file (GLOB SOURCES ${SOURCE})
set(${FILES} ${SOURCES} PARENT_SCOPE)
endfunction(expand_absolute_files)
set(TEST_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
expand_absolute_files(TEST_INCLUDES "${TEST_ROOT}/*.h")
expand_absolute_files(TEST_SOURCES "${TEST_ROOT}/*.cpp")
expand_absolute_files(TEST_ISPHS "${TEST_ROOT}/*.isph")
expand_absolute_files(TEST_ISPCS "${TEST_ROOT}/*.ispc")
source_group("ispc" FILES ${TEST_ISPHS})
source_group("ispc" FILES ${TEST_ISPCS})
set(FILES ${TEST_INCLUDES} ${TEST_SOURCES} ${TEST_ISPHS} ${TEST_ISPCS})
add_ispcs(TEST_ISPC_OBJECTS "${TEST_ISPCS}")
add_executable(${PROJECT_NAME} ${FILES} ${TEST_ISPC_OBJECTS})
Required variables,
- ISPC_BIN: Path to ISPC executable
- ISPC_TARGET: ‘sse2’, ‘avx1’, ‘avx2’, …
- ISPC_ARCH: ‘x86’, ‘x86-64’, ‘aarch64’, …
- ISPC_CPU: ‘core-avx2’, …