2015-07-29 2 views
0

Я работаю с некоторым внутренним программным обеспечением, которое использует собственную систему сборки Makefile. Однако программное обеспечение, которое я пишу, требует большей гибкости, поэтому я использую CMake, который я бы хотел настроить для автоматического создания этих проектов. Я пытаюсь включить эти внешние библиотеки со своими специальными правилами сборки с помощью функции следующим образом:Запуск make от cmake на внешнюю зависимость - Забудьте правила cmake make

set(MyModuleDir "/path/to/my/modules") 
set(MyModules "") 
function(import_my_module module_name) 
    add_custom_target(build_my_${module_name} ALL 
     COMMAND ${CMAKE_MAKE_PROGRAM} library 
     WORKING_DIRECTORY ${MyModuleDir}/${module_name}) 
    add_library(my_${module_name} STATIC IMPORTED) 
    set_target_properties(my_${module_name} 
     PROPERTIES IMPORTED_LOCATION ${MyModuleDir}/${module_name}/lib${module_name}.a) 
    add_dependencies(my_${module_name} build_my_${module_name}) 
    include_directories(${MyModuleDir}/${module_name}) 
    set(MyModules my_${module_name} ${MyModules} PARENT_SCOPE) 
endfunction() 

Команда она заканчивается работает правильно, скажем, для DoStuff библиотеки:

cd /path/to/my/modules/dostuff && /usr/bin/make library 

Какие , если он работает сам по себе, дает правильные результаты. Тем не менее, в исполнении CMake Makefile я вместо того, чтобы получить некоторые предупреждения о первостепенных старых рецептов, а затем кучу ошибок, как это с треском проваливается при попытке построить, как эти:

cd /path/to/my/modules/dostuff && /usr/bin/make library 
make[3]: Entering directory '/path/to/my/modules/dostuff' 
../my-make/Make.common:1007: warning: overriding recipe for target '/dostuff' 
../my-make/Make.common:982: warning: ignoring old recipe for target '/dostuff' 
../my-make/Make.common:1032: warning: overriding recipe for target '/dostuff' 
../my-make/Make.common:1007: warning: ignoring old recipe for target '/dostuff' 
I. -I.. -o /myfile -c myfile.c 
make[3]: I.: Command not found 
../my-make/Make.common:1145: recipe for target '/myfile' failed 
make[3]: [/myfile] Error 127 (ignored) 
I. -I.. -o /myfile2 -c myfile2.c 
make[3]: I.: Command not found 
... etc ... 

Так что я думаю, может быть, некоторые из конфигурации Makefile CMake в впрыскивается при выполнении других Makefiles. Это или выполнение из контекста make не позволяет ребенку заставить процесс правильно настроить себя. Я хотел бы построить эти проекты с новой конфигурацией make, не наследуя ничего от других make-процессов. Как это может быть сделано?

Вот некоторые из линий в вопросе от внешнего Makefile:

980 # Target for objdir's executable. 
981 $(execute): $(siblibs) $(library) $(maincobjs) $(mainccobjs) 
982  $(maincppobjs) 
... 
1004 # We make the libraries for each project, which causes all the object 
1005 # files to be created. 
1006 $(dynlib): $(siblibs) $(library) 
1007 @if [ "$(dynlib_ok)" = "1" ]; then \ 
1008  cd $(OBJDIR); \ 
1009   $(linkcc) $(dynlib_link_flags) \ 
1010    $(LFLAGS) \ 
1011    -o $(notdir $(dynlib)) \ 
1012    $(foreach sobj,$(sibobjs), ../$(sobj)) \ 
1013    $(notdir $(libcobjs)) \ 
1014    $(notdir $(libccobjs)) \ 
1015    $(notdir $(libcppobjs)) \ 
1016    $(LIBS) $(user_libs); \ 
1017 else \ 
... 
1030 $(library): $(libcobjs) $(libccobjs) $(libcppobjs) $(cplibs) 
1031 # numsources must be positive. 
1032 @if [ "$(numsources)" -eq 0 -a "$(nummains)" -eq 0 ]; then \ 
1033  echo "There are no sources to compile or libs to be made."; \ 
1034  exit 1; \ 
1035 fi 
1036 # Check that sources (incl. main) do not include both libs and c files, 
1037 # or multiple libs. 
1038 @if [ "$(numcplibs)" -gt 0 -a "$(numsources)" -gt 1 ]; then \ 
1039  echo "Error: cannot have source files (not incl. main) and"; \ 
1040  echo "libs {$(cplibs)}, or multiple libs, in same project"; \ 
1041  exit 1; \ 
1042 fi 
+0

Создает ли CMake Makefile 'cd/path/to/my/modules/dostuff &&/usr/bin/make library' буквально или использует' cd/path/to/my/modules/dostuff && $ (MAKE) библиотека'? Вы также можете попробовать добавить 'env' или' printenv' в качестве команды к этому рецепту, чтобы посмотреть, как выглядит среда в этой точке. Это может вам что-то сказать. –

+0

Он использует первый. Никакая переменная не нуждается в расширении. Я попробую распечатать переменные окружения и посмотреть, не выйдет ли что-нибудь полезное. – Anthony

+0

Переменные выглядят правильно. Это не показывает мне, почему существуют рецепты, которые необходимо перезаписать или почему они пытаются запустить команду I. (cc и cxx правильно определены). – Anthony

ответ

0

Как оказалось, проблема была в другом месте в общем сценарии Makefile. Был некоторый код, чтобы условно установить некоторые внутренние переменные на основе проверки MAKELEVEL, чтобы избежать переопределения переменных в рекурсивных прогонах. Это задается сценариями создания CMake (например, мой уровень был на уровне 4). Поэтому я только что обновил свою команду до

COMMAND ${CMAKE_MAKE_PROGRAM} library MAKELEVEL=0 

И теперь все работает.

Смежные вопросы