переход от make к cmake: как использовать build target с подстановочными знаками - PullRequest
5 голосов
/ 02 августа 2011

Я пытаюсь преобразовать make-сборку в cmake (чтобы избежать текущего состояния необходимости заботиться о среде Windows-build на основе make / msdev и linux на основе make / gcc).

В этом проекте я обнаружил каталог, полный файлов исходного кода, которые, в соответствии с соглашением об именах, компилируются в библиотеки.(например, c1223.c => c1223.dll (или .sl))

Текущий make-файл состоит из некоторых директив, использующих символы подстановки, например:

LIB_NO  = $(basename $(subst s,,$@))

OBJ = $(OBJ_PATH)/s$(LIB_NO).o $(OBJ_PATH)/c$(LIB_NO).o\
          $(OBJ_PATH)/b$(LIB_NO).o

$(OBJ_PATH)/%.o : %.c
    -$(CC) $(CFLAGS) -I$(PWD) -c $< -o $@
    -(chmod a+w $@;true)

Я искал некоторое времяно не могу найти ничего, что, кажется, работает.Можно ли даже с помощью cmake позволить ему генерировать сборку на основе подстановочных знаков?

Любые комментарии, советы и предложения приветствуются:)

cheers Markus

Ответы [ 2 ]

3 голосов
/ 03 августа 2011

Вы можете использовать довольно примитивную подстановку (синтаксиса регулярных выражений я не вижу).

file(GLOB TESTSRCS "test/src/*.cpp")

# Compile the test sources.
add_executable(Tests ${TESTSRCS})

target_link_libraries(Tests ${LIB} gtest gtest_main)

Реальные make-файлы, по-видимому, не содержат подстановочных запросов внутри них. Если вы добавляете новые файлы, вам нужно будет повторно запустить cmake.

Чего я не знаю, так это как вам удалось бы обернуть создание библиотеки в один макрос, если у вас есть много разных библиотечных файлов для генерации.

Возможно, вы сможете сделать что-то подобное, если в библиотеке будет только один файл c:

file(GLOB libfiles "path/to/libs/c*.c")

foreach(libfile ${libfiles})
    GET_FILENAME_COMPONENT(libname ${libfile} NAME) # remove the '.c' part (untested, hopefully this will work)
    add_library(${libname} ${libfile})
endforeach(libfile)

Если у кого-то есть лучшее решение, я бы тоже хотел его изучить.

0 голосов
/ 03 августа 2011

CMake не создает make-файлы, в которых есть правила подстановочных знаков.Он генерирует особые правила для файлов, о которых ему известно.

В вашем примере вы явно перечисляете файлы .o, которые составляют вашу библиотеку.В CMake вы вместо этого явно указали бы исходные файлы, которые вносят свой вклад в вашу библиотеку, а затем позволили CMake позаботиться обо всем остальном.

Нужны ли вам make-файлы, в которых по каким-то причинам есть правила подстановочных знаков?

Не могли бы вы просто составить список исходных файлов, а затем, для каждого элемента в списке, выполнить вызов add_library с исходным файлом и именем библиотеки, созданным из имени исходного файла?

...