cmake_minimum_required(VERSION 3.28) if(NOT SUBPROJECT) project(InstallScript) # Top-level exe; built by "all" file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/main.cpp "int main() {}") add_executable(test.exe ${CMAKE_CURRENT_BINARY_DIR}/main.cpp) target_link_libraries(test.exe PRIVATE testLib) set(SUBPROJECT ON) # Just so we can reuse current file for add_subdirectory add_subdirectory(. testlib EXCLUDE_FROM_ALL) # Note: EXCLUDE_FROM_ALL (only build lib if used) else() add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/TheScript.sh COMMAND /bin/sh -c "echo '#!/bin/sh' > ${CMAKE_CURRENT_BINARY_DIR}/TheScript.sh" VERBATIM) add_library(testLib ${CMAKE_CURRENT_BINARY_DIR}/../main.cpp # Reuse from exe ${CMAKE_CURRENT_BINARY_DIR}/TheScript.sh # Bind to force generation ) install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/TheScript.sh DESTINATION /tmp) endif()