Скомпилируйте код для сборки релиза на D

Есть ли в D (D2) механизм принудительной компиляции кода во время сборки релиза?

В C у вас может быть что-то вроде

#ifndef NDEBUG
/*Something that will only run in a debug build*/
#endif

Я знаю, что у Д есть

debug(mymodule) {
   //Do something
}

Но это требует, чтобы пользователь передал -debug для каждого модуля, чтобы включить его.

Я ищу глобальный механизм, который всегда будет запускать код в обычной сборке, но компилировать его, когда вы передаете флаг -release. Я знаю, что некоторые встроенные функции имеют эту возможность (например, assert), но есть ли способ сделать это и для пользовательского кода?


d
person JRM    schedule 06.07.2010    source источник
comment
Я думаю, что часть вашей проблемы заключается в том, что debug и -release не имеют ничего общего друг с другом в D. -release подразумевает, что вы компилируете релизную версию, и отключает различные проверки (например, утверждения). -debug включает операторы отладки. Таким образом, вы можете утверждать, что в D на самом деле нет режима отладки. У вас есть режим выпуска и режим без выпуска с возможностью включения операторов отладки в любом режиме. Я не думаю, что -release должен действительно изменить семантику вашего кода, как -debug, поэтому, вероятно, поэтому вы не можете делать то, что пытаетесь сделать.   -  person Jonathan M Davis    schedule 07.07.2010
comment
Я не собираюсь менять семантику сборки релиза. Я просто ищу лучший способ добавить дополнительные проверки, отпечатки и т. д. в нерелизную сборку, которая всегда будет включена во время разработки. Я вижу в этом что-то, что дает разработчику возможность быстрее отслеживать проблемы. Дополнительные проверки и предупреждения могут подсказать, для каких модулей следует включить -debug.   -  person JRM    schedule 07.07.2010
comment
Я дал ответ, но как-то мне не по себе от этого. Я бы рекомендовал просто использовать -debug при разработке и debug{ //... }. Имхо, лучше сделать так, чтобы было легко ошибиться при разработке, чем при релизе.   -  person 0scar    schedule 07.07.2010
comment
Что ж, как говорится в документации для -release: скомпилируйте релизную версию, что означает отсутствие генерации кода для контрактов и утверждений. Проверка границ массива не выполняется для системных и доверенных функций. Он не предназначен для включения или отключения пользовательского кода помимо того, что указано в контрактах и ​​утверждениях. Даже если все, что вы собираетесь сделать, это включить или выключить некоторые из ваших собственных проверок, к лучшему или к худшему, это не то, для чего release, похоже, предназначен. Вот для чего предназначен debug, и если это недостаточно подробно для вас, используйте -version. Это немного сбивает с толку, но, похоже, так оно и есть.   -  person Jonathan M Davis    schedule 07.07.2010


Ответы (3)


Существует глобальное понятие отладки. Просто пиши:

debug {
    ... code ...
}
person Andrei Alexandrescu    schedule 07.07.2010
comment
Я знал, что должно быть что-то простое вроде этого. В языке программирования D упоминалась только отладка для конкретного модуля, поэтому я не знал, что существует и глобальная отладка. Теперь я могу использовать debug {...} для базовой отладки и debug(mymodule) {...} для добавления более подробной отладки. - person JRM; 08.07.2010
comment
Точно. Приносим извинения за упущение. Я добавил опечатку от вашего имени здесь: erdani.com/tdpl/errata - person Andrei Alexandrescu; 09.07.2010

dmd -release -version=dist module.d

и

version(dist) {} else {
    int i = 9;
}

Лучшее, что я могу придумать.

[обновление]

Лично я считаю приведенный выше ответ «плохим». Приведенное выше решение внесло бы слишком сложную логику в процесс выпуска, который, как мне кажется, должен быть простым и предсказуемым. Я бы рекомендовал использовать только -debug и debug{ //... }. Даже если вы чувствуете, что можете забыть добавить флаг отладки во время компиляции — вы просто разрабатываете! — ошибки обходятся дешево. Ошибки, которые попадают в релиз, еще хуже.

person 0scar    schedule 07.07.2010
comment
Это не так идеально, как я надеялся, поскольку вам нужно не забыть указать флаг -version, но эти детали, вероятно, могут быть скрыты от конечного пользователя внутри системы сборки, так что это подойдет. - person JRM; 07.07.2010

Если лучшего ответа не найдено, должен сработать такой обходной путь: bool debugMode() { bool res; assert(!!(res = true)); return res; }

person FeepingCreature    schedule 06.07.2010
comment
Это назначение внутри утверждения. В режиме выпуска компилируется утверждение и его содержимое. Таким образом, присвоение происходит только в нерелизных сборках. - person DK.; 07.07.2010
comment
ОП ищет решение для времени компиляции, и утверждение никогда не появляется в CTFE. - person BCS; 09.07.2010