Используйте add_custom_target / add_custom_command.
В любом случае это непереносимая конструкция, поэтому вот простой пример
[root проекта] с двумя папками в нем [src] - здесь N файлов, [build] для двоичного файла и CMakeLists.txt
cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)
set(TARGET_NAME whole)
project(${TARGET_NAME} C)
file(GLOB SRC_FILES src/*.c)
add_custom_target(${TARGET_NAME} ${CMAKE_C_COMPILER} -flto -fwhole-program ${SRC_FILES} -o ${TARGET_NAME})
В папке сборки запустите cmake ..; сделать VERBOSE = 1 целое
Это сделает работу за вас.
Но, -fwhole-программа работает только с исполняемым файлом, согласно документации .
-fwhole-программа
Предположим, что текущий модуль компиляции представляет всю компилируемую программу. Все общедоступные функции и переменные, за исключением основных и тех, которые объединены атрибутом externally_visible, становятся статическими функциями и по сути оптимизируются более агрессивно с помощью межпроцедурных оптимизаторов.
Итак, вы должны определить main в любом месте ваших исходных файлов.