104a309ddSGuillaume Chatelet#include <cstdio> 204a309ddSGuillaume Chatelet#include <cstdlib> 304a309ddSGuillaume Chatelet 404a309ddSGuillaume Chatelet// This file is instantiated by CMake. 504a309ddSGuillaume Chatelet// DEFINITIONS below is replaced with a set of lines like so: 604a309ddSGuillaume Chatelet// #ifdef __SSE2__ 704a309ddSGuillaume Chatelet// "SSE2", 804a309ddSGuillaume Chatelet// #endif 904a309ddSGuillaume Chatelet// 1004a309ddSGuillaume Chatelet// This allows for introspection of compiler definitions. 1104a309ddSGuillaume Chatelet// The output of the program is a single line of semi colon separated feature 1204a309ddSGuillaume Chatelet// names. 1304a309ddSGuillaume Chatelet 1404a309ddSGuillaume Chatelet// MSVC is using a different set of preprocessor definitions for 1504a309ddSGuillaume Chatelet// SSE and SSE2, see _M_IX86_FP in 1604a309ddSGuillaume Chatelet// https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros 1704a309ddSGuillaume Chatelet 1804a309ddSGuillaume Chateletint main(int, char **) { 1904a309ddSGuillaume Chatelet const char *strings[] = { 2004a309ddSGuillaume Chatelet @DEFINITIONS@ 21*7cd42064SSiva Chandra Reddy // If DEFINITIONS turns out to be empty, we don't want to list 22*7cd42064SSiva Chandra Reddy // an empty array. So, we add an end of list marker. 23*7cd42064SSiva Chandra Reddy "<end_of_feature_list>" 2404a309ddSGuillaume Chatelet }; 2504a309ddSGuillaume Chatelet const size_t size = sizeof(strings) / sizeof(strings[0]); 2604a309ddSGuillaume Chatelet for (size_t i = 0; i < size; ++i) { 2704a309ddSGuillaume Chatelet if (i) 2804a309ddSGuillaume Chatelet putchar(';'); 2904a309ddSGuillaume Chatelet fputs(strings[i], stdout); 3004a309ddSGuillaume Chatelet } 3104a309ddSGuillaume Chatelet return EXIT_SUCCESS; 3204a309ddSGuillaume Chatelet} 33