ОБНОВИТЬ минимальный рабочий пример
Я создал минимальный рабочий пример в общедоступном репозитории svn . Checkout
папка proj
из багажника, в ней есть CMakeLists.txt и main.cpp (код размещен ниже). В багажнике у меня также есть папка lib
, статическая библиотека, реализующая класс. Этот класс используется в моем файле main. Я за прокси, поэтому я в ~/.subversion/server
добавил глобальную настройку прокси.
Ожидаемое поведение: после проверки proj выполните cmake .
, который также выполняет проверку lib и выполняет make
для создания libmylib.a
перед сборкой моего main
. Наконец-то make
мой главный проект.
Фактическое поведение: не извлекается библиотека, поэтому libmylib.a
не создается. Сообщение об ошибке:
Re-run cmake no build system arguments
-- Found Subversion: /usr/bin/svn (found version "1.8.8")
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
CMake Error at CMakeLists.txt:48 (add_executable):
Cannot find source file:
/home/user/tmp/externalProject_Test/trunk/proj/project_mylib/lib/mylib.hpp
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx
-- Build files have been written to: /home/user/tmp/externalProject_Test/trunk/proj
Папки создаются ExternalProject_add
, но нет svn co в trunk/proj/project_mylib/lib
MWE main.cpp:
#include "project_mylib/lib/mylib.hpp"
int main () {
Talker me;
me.say();
return 0;
}
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.3)
### Try to add external project
include(ExternalProject)
ExternalProject_Add(project_mylib
PREFIX project_mylib
SVN_REPOSITORY "https://subversion.assembla.com/svn/eternapprojectmwe/trunk/lib/"
# SVN_REVISION ""
# SVN_USERNAME ""
# SVN_PASSWORD ""
SVN_TRUST_CERT 1
TIMEOUT 30
UPDATE_COMMAND ""
SOURCE_DIR "project_mylib/lib"
CONFIGURE_COMMAND ""
BINARY_DIR "project_mylib/lib"
BUILD_COMMAND make
BUILD_IN_SOURCE
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(project_mylib binary_dir)
project(main)
SET(LIB_DIR ${binary_dir})
SET(SOURCES ${PROJECT_SOURCE_DIR}/main.cpp)
SET(HEADERS ${LIB_DIR}/mylib.hpp)
add_custom_command(TARGET project_mylib
POST_BUILD
COMMAND echo ${LIB_DIR}
)
include_directories(
include
${LIB_DIR}
)
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${LIB_DIR})
add_dependencies(${PROJECT_NAME} project_mylib)
target_link_libraries(${PROJECT_NAME} ${LIB_DIR}/libmylib.a)
mylib.cpp:
#include "mylib.hpp"
Talker::Talker()
{
this->text = "Hello!";
}
bool Talker::say(void)
{
cout << this->text;
return true;
}
mylib.hpp
#include <iostream>
#include <string>
using namespace std;
class Talker {
string text;
public:
Talker();
bool say(void);
};
Makefile для статической библиотеки
# Specify extensions of files to delete when cleaning
CLEANEXTS = o a
# Specify the target file and the install directory
OUTPUTFILE = libmylib.a
INSTALLDIR = .
# Default target
.PHONY: all
all: $(OUTPUTFILE)
# Build libjohnpaul.a from john.o, paul.o, and johnpaul.o
$(OUTPUTFILE): mylib.o
ar ru $@ $^
ranlib $@
# No rule to build john.o, paul.o, and johnpaul.o from .cpp
# files is required; this is handled by make's database of
# implicit rules
.PHONY: install
install:
mkdir -p $(INSTALLDIR)
cp -p $(OUTPUTFILE) $(INSTALLDIR)
.PHONY: clean
clean:
for file in $(CLEANEXTS); do rm -f *.$$file; done
# Indicate dependencies of .ccp files on .hpp files
mylib.o: mylib.hpp
Исходное сообщение
У меня есть пакет ROS
(pomdp_planner), связанный с проектом Makefiel
(project_appl). У меня оба проекта на нашем SVN
но в разных локациях (я за прокси). Если у меня есть свежая проверка узла ROS и его сборка, мне не удается загрузить проект Makefile
, поэтому сборка завершается сбоем на этапе связывания. В случае, если я вручную проверяю проект Makefile в нужном месте, ROS PKG собирается
Моя проблема в том, что проект Makefile
в externalproject_add()
не обновляется до текущей версии в SVN и даже не проверяется в начале. Для сборки пакета ROS я использую catkin_tools
.
Я работаю над Ubuntu
14.04, cmake
2.8.12.2 (и ROS Indigo).
Мой пакет ROS CMakeList:
cmake_minimum_required(VERSION 2.8.3)
### Try to add external project
include(ExternalProject)
ExternalProject_Add(project_appl
PREFIX project_appl
SVN_REPOSITORY "mySVN.server"
SVN_REVISION ""
SVN_USERNAME "user"
SVN_PASSWORD "pwd"
SVN_TRUST_CERT 1
UPDATE_COMMAND ""
SOURCE_DIR "project_appl/src"
CONFIGURE_COMMAND ""
BINARY_DIR "project_appl/src"
BUILD_COMMAND make
BUILD_IN_SOURCE
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(project_appl binary_dir)
project(pomdp_planner)
SET(APPL_LIB_DIR ${binary_dir})
add_custom_command(TARGET project_appl
POST_BUILD
COMMAND cmake -E remove_directory ${binary_dir}/Utils/boost
COMMAND cp ${binary_dir}/libappl.a ./CMakeFiles/pomdp_planner.dir/src/libappl.a
COMMAND cp ${binary_dir}/OnlineOPSolver/OnlineOPsolver/solverOP_lib.hpp ../../devel/include/pomdp_planner/solverOP_lib.hpp
)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
add_service_files(
FILES
PlannerAction.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
SET(SOURCES ${PROJECT_SOURCE_DIR}/src/main.cpp)
SET(HEADERS ${APPL_LIB_DIR}/OnlineOPSolver/OnlineOPsolver/solverOP_lib.hpp
${APPL_LIB_DIR}/OfflineSolver/GlobalResource.h
${APPL_LIB_DIR}/OfflineSolver/solverUtils.h
${APPL_LIB_DIR}/Parser/Cassandra/Parser.h
${APPL_LIB_DIR}/Parser/Cassandra/POMDP.h
${APPL_LIB_DIR}/Parser/ParserSelector.h
${APPL_LIB_DIR}/Models/MOMDP/MOMDP.h
${APPL_LIB_DIR}/Algorithms/SARSOP/SARSOP.h
${APPL_LIB_DIR}/Algorithms/OPMDP/OPMDP.h
${APPL_LIB_DIR}/Bounds/BackupAlphaPlaneMOMDP.h
${APPL_LIB_DIR}/Bounds/BackupBeliefValuePairMOMDP.h
${APPL_LIB_DIR}/OnlineOPSolver/OnlineOPsolver/dataLogger.h
${APPL_LIB_DIR}/Bounds/FastInfUBInitializer.h
${APPL_LIB_DIR}/Bounds/FullObsUBInitializer.h
${APPL_LIB_DIR}/Utils/CPTimer.h
${APPL_LIB_DIR}/Core/BeliefCache.h
)
SET(APPL_DIR
${APPL_LIB_DIR}/OnlineOPSolver/OnlineOPsolver/
${APPL_LIB_DIR}/OfflineSolver/
${APPL_LIB_DIR}/Parser/Cassandra/include
${APPL_LIB_DIR}/Parser/Cassandra/
${APPL_LIB_DIR}/Parser/
${APPL_LIB_DIR}/Parser/POMDPX/
${APPL_LIB_DIR}/Models/MOMDP
${APPL_LIB_DIR}/Algorithms/SARSOP
${APPL_LIB_DIR}/Algorithms/OPMDP/
${APPL_LIB_DIR}/Bounds/
${APPL_LIB_DIR}/Utils/
#${APPL_LIB_DIR}/Utils/boost
${APPL_LIB_DIR}/Core/
${APPL_LIB_DIR}/MathLib
${APPL_LIB_DIR}/Algorithms
${APPL_LIB_DIR}/Parser/POMDPX
)
SET(LINKER_FLAG "-std=c++11 -fpermissive")
catkin_package(
INCLUDE_DIRS ${APPL_LIB_DIR}
LIBRARIES pomdp_planner project_appl
CATKIN_DEPENDS roscpp rospy std_msgs message_generation
DEPENDS system_lib
)
add_definitions(${LINKER_FLAG})
${APPL_DIR}/libappl.a)
include_directories(
include
${catkin_INCLUDE_DIRS}
${APPL_LIB_DIR}
${APPL_DIR}
)
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${APPL_LIB_DIR})
add_dependencies(${PROJECT_NAME} project_appl)
add_dependencies(${PROJECT_NAME} ${catkin_EXPORTED_TARGETS} )
target_link_libraries(${PROJECT_NAME} ${ROS_LIBRARIES} ${catkin_LIBRARIES} ${APPL_LIB_DIR}/libappl.a)