Они практически одинаковы.
Первый раунд скобок вокруг функции, чтобы сделать его действительным выражением и вызывает его. Результат выражения не определен.
Второй выполняет функцию, а круглые скобки вокруг автоматического вызова делают это допустимым выражением. Он также оценивает неопределенные.
Я не думаю, что есть «правильный» способ сделать это, так как результат выражения тот же.
> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
add_custom_target(COMMAND $<TARGET_FILE:foo> ...)
См.:
http://www.cmake.org/cmake/help/v3.0/manual/cmake-generator-expressions.7.html
На самом деле вам даже не требуется выражение генератора :) По крайней мере / w modern CMake :
Если COMMAND указывает исполняемое имя цели (созданное с помощью команды add_executable ()), она будет автоматически заменена местоположением исполняемого файла, созданного во время сборки.
blockquote>add_executable(foo ...) add_custom_target(COMMAND foo ...)