Работа с CMake и Xcode: сохранить изменения проекта при изменении CMakeLists.txt

Сравнение различных предложений (а также сравнение в контексте замены одного символа различными размерами и позициями цели).

В этом конкретном случае расщепление по целям и объединение на заменах (в данном случае пустая строка) является самым быстрым, по крайней мере, в 3 раза. В конечном счете производительность отличается в зависимости от количества замен, где находятся замены в источнике, и размера источника. #ymmv

Результаты

(полные результаты здесь )

| Test                      | Compare | Elapsed                                                            |
|---------------------------|---------|--------------------------------------------------------------------|
| SplitJoin                 | 1.00x   | 29023 ticks elapsed (2.9023 ms) [in 10K reps, 0.00029023 ms per]   |
| Replace                   | 2.77x   | 80295 ticks elapsed (8.0295 ms) [in 10K reps, 0.00080295 ms per]   |
| RegexCompiled             | 5.27x   | 152869 ticks elapsed (15.2869 ms) [in 10K reps, 0.00152869 ms per] |
| LinqSplit                 | 5.43x   | 157580 ticks elapsed (15.758 ms) [in 10K reps, 0.0015758 ms per]   |
| Regex, Uncompiled         | 5.85x   | 169667 ticks elapsed (16.9667 ms) [in 10K reps, 0.00169667 ms per] |
| Regex                     | 6.81x   | 197551 ticks elapsed (19.7551 ms) [in 10K reps, 0.00197551 ms per] |
| RegexCompiled Insensitive | 7.33x   | 212789 ticks elapsed (21.2789 ms) [in 10K reps, 0.00212789 ms per] |
| Regex Insentive           | 7.52x   | 218164 ticks elapsed (21.8164 ms) [in 10K reps, 0.00218164 ms per] |

Жгут проводов (LinqPad)

(примечание: Perf и Vs являются временными расширениями, которые я написал )

void test(string title, string sample, string target, string replacement) {
    var targets = target.ToCharArray();

    var tox = "[" + target + "]";
    var x = new Regex(tox);
    var xc = new Regex(tox, RegexOptions.Compiled);
    var xci = new Regex(tox, RegexOptions.Compiled | RegexOptions.IgnoreCase);

    // no, don't dump the results
    var p = new Perf/**/();
        p.Add(string.Join(" ", title, "Replace"), n => targets.Aggregate(sample, (res, curr) => res.Replace(new string(curr, 1), replacement)));
        p.Add(string.Join(" ", title, "SplitJoin"), n => String.Join(replacement, sample.Split(targets)));
        p.Add(string.Join(" ", title, "LinqSplit"), n => String.Concat(sample.Select(c => targets.Contains(c) ? replacement : new string(c, 1))));
        p.Add(string.Join(" ", title, "Regex"), n => Regex.Replace(sample, tox, replacement));
        p.Add(string.Join(" ", title, "Regex Insentive"), n => Regex.Replace(sample, tox, replacement, RegexOptions.IgnoreCase));
        p.Add(string.Join(" ", title, "Regex, Uncompiled"), n => x.Replace(sample, replacement));
        p.Add(string.Join(" ", title, "RegexCompiled"), n => xc.Replace(sample, replacement));
        p.Add(string.Join(" ", title, "RegexCompiled Insensitive"), n => xci.Replace(sample, replacement));

    var trunc = 40;
    var header = sample.Length > trunc ? sample.Substring(0, trunc) + "..." : sample;

    p.Vs(header);
}

void Main()
{
    // also see https://stackoverflow.com/questions/7411438/remove-characters-from-c-sharp-string

    "Control".Perf(n => { var s = "*"; });


    var text = "My name @is ,Wan.;'; Wan";
    var clean = new[] { '@', ',', '.', ';', '\'' };

    test("stackoverflow", text, string.Concat(clean), string.Empty);


    var target = "o";
    var f = "x";
    var replacement = "1";

    var fillers = new Dictionary {
        { "short", new String(f[0], 10) },
        { "med", new String(f[0], 300) },
        { "long", new String(f[0], 1000) },
        { "huge", new String(f[0], 10000) }
    };

    var formats = new Dictionary {
        { "start", "{0}{1}{1}" },
        { "middle", "{1}{0}{1}" },
        { "end", "{1}{1}{0}" }
    };

    foreach(var filler in fillers)
    foreach(var format in formats) {
        var title = string.Join("-", filler.Key, format.Key);
        var sample = string.Format(format.Value, target, filler.Value);

        test(title, sample, target, replacement);
    }
}

30
задан YuppieNetworking 18 July 2010 в 19:18
поделиться

2 ответа

Вы можете добавить цель, которая запускает программу, с помощью add_custom_target (foobar COMMAND foo --bar DEPENDS foo) . Вы также можете вызвать сценарий вместо программы, в которой легко установить переменные среды (я использую эту настройку в Win32 для настройки путей в VC). Этот сценарий также может быть шаблоном в VCS, поэтому у каждого разработчика есть собственная версия сценария с фактическими параметрами командной строки.

10
ответ дан 28 November 2019 в 00:26
поделиться

Я думаю, вы потеряете этого. Xcode хранит все определения проекта в файле с именем Foo.xcodeproj / project.pbxproj. Когда один из разработчиков вашего Mac изменяет флаг или настройку, это записывается в файл project.pbxproj. Когда вы изменяете файл CMakeLists.txt, CMake запускает перестройку project.pbxproj, стирая все изменения, внесенные разработчиком Mac. Xcode не разрабатывался с учетом CMake, и они очень хорошо работают вместе.

Одно из возможных решений (которое не является лучшим для разработчиков Mac) - использовать CMake для генерации файлов сборки. Им нужно будет написать несколько пользовательских команд в Xcode, которые вызывают CMake / Make для сборки исполняемых файлов, но они смогут передавать аргументы в CMake для управления процессом сборки. Исполняемые файлы будут определены отдельно для Xcode, а CMake удалит только файлы Makefile. Это может быть способом сделать всех счастливыми.

ИМХО, разработчики CMake не уделили Xcode должного внимания. Но это ограничение заложено в архитектуре Xcode и будет крепким орешком.

Надеюсь, это поможет,
-dan

Изменить:

У ваших разработчиков Xcode есть некоторые ограниченные возможности использовать «Пользовательские настройки». Я не знаю, как их использовать (я парень emacs / make-типа), но, возможно, они могли бы использовать их для переопределения настроек CMake.

11
ответ дан 28 November 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: