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