まず、私のフォルダ構造を説明しましょう
| SourceCode folder
| | Build folder
| | | makefile
| | | buildrules.mak
| | Integration_Tests folder
| | | Subsystem_1_Test folder
| | | | buildfiles folder
| | | | test.cpp
| | | | makefile
| | Subsystem_1 folder
| | | buildfiles folder
| | | source1.cpp
| | | source2.cpp
| | | source3.cpp
| | | makefile
| | Subsystem_2 folder
| | | buildfiles folder
| | | source4.cpp
| | | source5.cpp
| | | source6.cpp
| | | makefile
そのため、ビルド フォルダー内のメイクファイルは、下位のメイクファイルを呼び出すことによって、すべてのサブシステムと統合テストをビルドします。各サブシステムが実行可能ファイルを作成し、各サブシステム テストが実行可能ファイルを作成します。buildfiles フォルダーには、依存関係ファイル、オブジェクト ファイル、および最終的な実行可能コードが格納されます。これは、ビルド時にメイクファイルによってすべて取り込まれます。
統合テストは、テストの下のサブシステム コードを使用してビルドされ、サブシステムもビルドされますが、サブシステム フォルダー内でローカルにビルドされます。各サブシステム統合テストの makefile は、vpath を使用してサブシステム フォルダーのパスを設定します。つまり、サブシステム 1 テストの場合、vpath は次のとおりです。
vpath = ../../Subsystem_1
目の前に正確なコードはありませんが、コンパイル行は基本的に次のように定義されています。これは buildrules.mak にあり、すべてのメイクファイルで使用されます
./buildfiles/%.o : %.cpp
compile the code
したがって、私が見ている問題は、統合テストをビルドするときです。技術的にはビルドしてリンクする必要がありますが、Subsystem_1/buildfiles フォルダーでオブジェクト ファイルを見つけて、サブシステム コードがビルドされ、test.cpp のみをビルドすると言っているようです。
テストにはビルド定義が定義されており、適切なテストのためにサブシステムを再度ビルドする必要があるため、これはエラーです。
サブシステム 1 がビルドされていない場合、つまりオブジェクト ファイルがない場合、結合テストは期待どおりにファイルをビルドし、オブジェクト ファイルをローカルの結合テストの buildfiles フォルダーに配置します。
これは、統合テストの make ファイルで vpath が設定されているためだと思います。サブシステム_1 フォルダーでオブジェクト ファイルを検索しているようですが、残念ながら見つかりません。
Subsystem_1 フォルダーをビルドしていて、テストが既にビルドされている場合、問題は見られません。これはおそらく、Subsystem_1 の vpath にテストへのパスがないためです。
本質的にファイルパスの問題であるこの問題を解決する方法を理解できないようです。コンパイル行で一致させる必要があるビルドファイルフォルダーをより具体的にする必要があるようですが、パスがありません。
$(CURDIR) は絶対パスであり、相対パスを使用する必要があると言われたため、使用できません。スペースと括弧を含むパスに問題があると思います。おそらく使用する前にそれらをエスケープすることができましたが、相対パスですべてを行う必要があると言われました。
make を実行するディレクトリから buildrules.mak への相対パスである buildrules.mak に変数があります。これは以下を使用して達成されました。
BUILD_FOLDER_PATH := $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))
$(CURDIR) を解析して、sourcecod のような一般的なフォルダーに移動する方法はありますか? 次に、次のようなことができます。
$(BUILD_FOLDER_PATH)/../[path extracted from $(CURDIR)]/buildfiles
$(CURDIR) が c:/a/b/sourcecode/Integration_Tests/Subsystem_Test の場合、"/Integration_Tests/Subsystem_Test" を抽出して上記のパスに入れることができます。
これを行う別の方法がある場合は、提案も受け付けています。
ありがとう!
編集: Makefile のテスト
# used when make is executed without any arguments, must be first thing in the file
all: default
##########################################################################
# #
# Source Files #
# #
##########################################################################
# These files are not shared with other processes
CPP_SRC := \
cmdclientmq.cpp \
cmdservermq.cpp \
ConvertUTF.cpp \
crcutil.cpp \
deka_cpu.cpp \
deka_debug.cpp \
deka_file.cpp \
deka_mutex.cpp \
deka_sem.cpp \
deka_serial.cpp \
deka_sharedMem.cpp \
deka_thread.cpp \
deka_time.cpp \
deka_timer.cpp \
encryptionutils.cpp \
exec_client.cpp \
logclient.cpp \
procstatus.cpp \
syserror.cpp
# These files are shared with other processes
EXPORTED_SRC :=
# These files are analyzed by the manifest tool
# Not all header files are listed because the manifest tool automatically checks if there is a .h file
# with the same name as a .cpp file
MANIFEST_SRC := \
$(CPP_SRC) \
$(EXPORTED_SRC)
##########################################################################
# #
# makefile includes #
# #
##########################################################################
# Basic compiler definitions, must be listed after source files
include ../../build/buildrules.mak
##########################################################################
# #
# build flags #
# #
##########################################################################
# Position Independent Code flag
GCC_FLAGS += -fPIC
##########################################################################
# #
# Subsystem build paths #
# #
##########################################################################
# directory include paths need for files external to the current subsystem
INCDIRS := \
$(EXECUTIVE_INC_PATH) \
$(LOGGER_INC_PATH) \
$(OS_INTERFACE_INC_PATH) \
$(SYSERROR_INC_PATH) \
$(SYSTEMDEFS_INC_PATH) \
$(UTILITIES_INC_PATH)
# list of directories in the current subsystem
VPATH := \
$(EXECUTIVE_PATH)/exec_client \
$(EXECUTIVE_PATH)/exec_core \
$(LOGGER_PATH)/main \
$(OS_INTERFACE_PATH) \
$(SYSERROR_PATH) \
$(UTILITIES_PATH)
##########################################################################
# #
# Targets #
# #
##########################################################################
# default target to build and link the subsystem code
default: $(LIB_DIR)/libpycommon.a
@echo
@echo Common Library default: Done.
@echo ----------------------------------------------------------------------------
@echo
# remove the subsystem build folders and create the neccessary directories
clean: REMOVE_INTEGRATION_DIRS CREATE_INTEGRATION_OUTPUT_DIRS
@echo
@echo Common Library clean: Done.
@echo ----------------------------------------------------------------------------
@echo
##########################################################################
# #
# Build Rules #
# #
##########################################################################
# Do not build archives or call ranlib in parallel:
# http://www.gnu.org/software/make/manual/make.html#Archive-Pitfalls
.NOTPARALLEL:
$(LIB_DIR)/libpycommon.a: $(LIB_DIR)/libpycommon.a($(CPP_OBJS))
$(RANLIB) $(LIB_DIR)/libpycommon.a
buildrules.mak
# get relative path to the current makefile by examining the $(MAKEFILE_LIST), which is
# dynamically updated. Determine the number of words in $(MAKEFILE_LIST) and grab the
# last word. Then extract the directory path up to the found last word.
# the include order is important, do not adjust
include $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))toolset.mak
include $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))common.mak
##########################################################################
# #
# Build rules for creating subsystem and project folder structure #
# #
##########################################################################
CREATE_SUBSYSTEM_OUTPUT_DIRS :
-@echo Creating directory: $(BUILD_PATH)
-@mkdir -p $(BUILD_PATH)
-@echo Creating directory: $(DEP_DIR)
-@mkdir -p $(DEP_DIR)
-@echo Creating directory: $(OBJ_DIR)
-@mkdir -p $(OBJ_DIR)
-@echo Creating directory: $(LINT_DIR)
-@mkdir -p $(LINT_DIR)
-@echo Creating directory: $(CCK_DIR)
-@mkdir -p $(CCK_DIR)
-@echo Creating directory: $(UNCRUST_DIR)
-@mkdir -p $(UNCRUST_DIR)
-@echo Creating directory: $(MET_DIR)
-@mkdir -p $(MET_DIR)
REMOVE_SUBSYSTEM_DIRS :
-@echo ----------------------------------------------------------------------------
-@echo Removing directory: $(BUILD_PATH)
-@echo ----------------------------------------------------------------------------
-@rm -rf $(BUILD_PATH)
-@echo
CREATE_PROJECT_OUTPUT_DIRS :
-@echo Creating directory: $(IMAGE_DIR)
-@mkdir -p $(IMAGE_DIR)
-@echo Creating directory: $(PROJECT_OBJ_DIR)
-@mkdir -p $(PROJECT_OBJ_DIR)
REMOVE_PROJECT_OUTPUT_DIRS :
-@echo Removing directory: $(DIALYSIS_DIR)
-@rm -rf $(DIALYSIS_DIR)
-@echo Removing directory: $(ETC_DIR)
-@rm -rf $(ETC_DIR)
-@echo Removing directory: $(IMAGE_DIR)
-@rm -rf $(IMAGE_DIR)
-@echo Removing directory: $(PROJECT_OBJ_DIR)
-@rm -rf $(PROJECT_OBJ_DIR)
-@echo Removing directory: $(TAR_DIR)
-@rm -rf $(TAR_DIR)
-@echo Removing directory: $(QUAL_DIR)
-@rm -rf $(QUAL_DIR)
-@echo Removing directory: $(PYTHON_OUT)
-@rm -rf $(PYTHON_OUT)
##########################################################################
# #
# Integration Build Rules #
# #
##########################################################################
CREATE_INTEGRATION_OUTPUT_DIRS :
-@echo Creating directory: $(BUILD_PATH)
-@mkdir -p $(BUILD_PATH)
-@echo Creating directory: $(DEP_DIR)
-@mkdir -p $(DEP_DIR)
-@echo Creating directory: $(OBJ_DIR)
-@mkdir -p $(OBJ_DIR)
-@echo Creating directory: $(LIB_DIR)
-@mkdir -p $(LIB_DIR)
-@echo Creating directory: $(PYTHON_OUT)
-@mkdir -p $(PYTHON_OUT)
REMOVE_INTEGRATION_DIRS :
@echo Removing directory: $(BUILD_PATH)
@rm -rf $(BUILD_PATH)
@echo
##########################################################################
# #
# Unit Test Build Rules #
# #
##########################################################################
CREATE_UNIT_TEST_OUTPUT_DIRS :
-@echo Creating directory: $(BUILD_PATH)
-@mkdir -p $(BUILD_PATH)
-@echo Creating directory: $(DEP_DIR)
-@mkdir -p $(DEP_DIR)
-@echo Creating directory: $(OBJ_DIR)
-@mkdir -p $(OBJ_DIR)
REMOVE_UNIT_TEST_DIRS :
@echo Removing directory: $(BUILD_PATH)
-@rm -rf $(BUILD_PATH)
@echo
##########################################################################
# #
# Create dependancy files from all cpp files #
# #
##########################################################################
# convert the file extensions from .o to .d and strip the relative path and add the dependancy path
DEP_OBJS = $(patsubst %.o, $(DEP_DIR)/%.d, $(Call_OBJ))
##########################################################################
# #
# Create object files from all cpp files #
# #
##########################################################################
# convert the file extensions from .cpp to .o
Cxx_OBJS = $(CPP_SRC:.cpp=.o)
# strip the relative path and add the object path
CPP_OBJS = $(patsubst %.o, $(OBJ_DIR)/%.o, $(Cxx_OBJS))
##########################################################################
# #
# Create object files from all exported files #
# #
##########################################################################
# Files needed by other subsystems
# convert the file extensions from .cpp to .o
Exx_OBJS = $(EXPORTED_SRC:.cpp=.o)
# strip the relative path and add the path to the subsystem object folder
EXPORTED_OBJ = $(patsubst %.o, $(OBJ_DIR)/%.o, $(Exx_OBJS))
# strip the relative path and add the project object folder
EXPORTED_OUT = $(patsubst %.o, $(PROJECT_OBJ_DIR)/%.o, $(Exx_OBJS))
##########################################################################
# #
# List of files within the subsystem #
# #
##########################################################################
# create the list of all files associated with this subsystem
Call_OBJ = $(Cxx_OBJS) $(Exx_OBJS)
##########################################################################
# #
# Files needed by Lint #
# #
##########################################################################
# convert the file extensions from .o to .lob and strip the relative path and add the lint path
LINT_OBJS = $(patsubst %.o, $(LINT_DIR)/%.lob, $(Call_OBJ))
##########################################################################
# #
# Interface Rules to create dependancy files from project source code #
# #
##########################################################################
# function used to create dependancy files
define DEPENDS_COMMAND
@echo
@echo ----------------------------------------------------------------------------
@echo -Depend: $@
@echo ----------------------------------------------------------------------------
@$(CC_DEP) -MM -MT '$(OBJ_DIR)/$*'.o $(INCDIRS) $< > $ $@.tmp
@$(SED) 's,\($*\)\.o[ :]*,\1.o $(LINT_DIR)/\1.lob $@ : ,g' < $@.tmp > $@;
@rm -f $@.tmp
endef
# rule to create dependency for C++ code
$(DEP_DIR)/%.d: %.cpp
$(DEPENDS_COMMAND)
##########################################################################
# #
# Interface Rules to compile project source code #
# #
##########################################################################
# function used to compile code
define COMPILE_COMMAND
@echo
@echo ----------------------------------------------------------------------------
@echo -Compiling: $@
@echo ----------------------------------------------------------------------------
@$(CC) $(CPU_GCC_FLAGS) $(GCC_FLAGS) $(INCDIRS) $< -o $@
endef
# build object files in subsytem ojbect folder for all cpp files
$(OBJ_DIR)/%.o: %.cpp
@$(COMPILE_COMMAND)
##########################################################################
# #
# Build exported object files and copy them to the build folder #
# #
##########################################################################
# move shared object files to the proper directory
$(EXPORTED_OUT): $(PROJECT_OBJ_DIR)/%.o : $(OBJ_DIR)/%.o
@echo
@echo Copying Shared File $< to $@ ...
@cp $< $@
##########################################################################
# #
# Build Rules to link files to create the final executable #
# #
##########################################################################
# Commands for linking final executable [LINK_DB_LIBS vs LINK_LIBS]
define LINK_EXECUTABLE
@echo
@echo "**********************************"
@echo "**** Linux Linking $@"
@echo "**********************************"
$(CC) $^ $(LINK_LIBS) $(LIB_FLAGS) -o $(IMAGE_DIR)/$@
@$(DEKA_TOOLS)/imagecrc.exe $(IMAGE_DIR)/$@ 2>&1
@echo
@echo LINK_EXECUTABLE Completed
@echo ----------------------------------------------------------------------------
endef
# Commands for linking final executable for subsystems using the database [LINK_DB_LIBS vs LINK_LIBS]
define LINK_DB_EXECUTABLE
@echo
@echo "********************************************"
@echo "**** Linux Linking $@"
@echo "********************************************"
@$(CC) $^ $(LINK_DB_LIBS) $(LIB_FLAGS) -o $(IMAGE_DIR)/$@
@$(DEKA_TOOLS)/imagecrc.exe $(IMAGE_DIR)/$@ 2>&1
@echo
@echo LINK_DB_EXECUTABLE Completed
@echo ----------------------------------------------------------------------------
endef
define LINK_EXECUTABLE_INTEGRATION
@echo
@echo "**********************************"
@echo "**** Linux Linking $@"
@echo "**********************************"
$(CC) $^ $(LINK_LIBS) $(LIB_FLAGS) -o $(PYTHON_OUT)/$@
@$(DEKA_TOOLS)/imagecrc.exe $(PYTHON_OUT)/$@ 2>&1
@echo ----------------------------------------------------------------------------
endef
define LINK_EXECUTABLE_UNIT_TEST
@echo
@echo "**********************************"
@echo "**** Linux Linking $@"
@echo "**********************************"
$(CC) $^ $(LINK_LIBS) $(LIB_FLAGS) $(CANTPP_LIB) -L$(GCC_LIB_PATH) -o $(OBJ_DIR_UT)/$@
@echo ----------------------------------------------------------------------------
endef
##########################################################################
# #
# Build rules for Lint of C++ files #
# #
##########################################################################
# function used to lint C++ files
define LINT_COMMAND
@echo
@echo ----------------------------------------------------------------------------
@echo -Lint: $<
@echo ----------------------------------------------------------------------------
-@$(LINT) -dRELEASE_BUILD -u -b $(LINT_SYS_DIRS) $(INCDIRS) $(LINT_RULES) '-passes(2)' '-oo($@)' '-os($(@D)/$(*F).txt)' $<
@$(PYTHON) $(LINT_PYTHON_SCRIPT) --out $(@D)/$(*F).txt --src $(CURDIR)/$<
endef
# rule to create lint output for C++ code
$(LINT_DIR)/%.lob: %.cpp
@$(LINT_COMMAND)
lint: $(LINT_OBJS)
@echo
@echo lint: Done.
@echo ----------------------------------------------------------------------------
lintclean:
@rm -rf $(LINT_DIR)
@mkdir $(LINT_DIR)
@echo
@echo lintclean: Done
@echo ----------------------------------------------------------------------------
##########################################################################
# #
# Build rules for Uncrustify of C++ files #
# #
##########################################################################
uncrustify: $(UNCRUST_DIR)
@python $(UNCRUST_PYTHON_FILE) $(UNCRUST_EXECUTABLE) -nooverwrite
@echo
@echo uncrustify: Done
@echo ----------------------------------------------------------------------------
uncrustifyclean:
@rm -rf $(UNCRUST_DIR)
@mkdir $(UNCRUST_DIR)
@echo
@echo uncrustifyclean: Done
@echo ----------------------------------------------------------------------------
##########################################################################
# #
# Build rules for Understand CodeCheck of C++ files #
# #
##########################################################################
codecheck.udb: $(CCK_DIR)
@echo
@cp -rf $(UND_RULES_ARCHIVE) $(UND_RULES)
@$(UND) create -db $@ -languages c++
@$(UND) -db $@ settings -c++MacrosAdd RELEASE_BUILD=1
@$(UND) add $(CURDIR) -db $@
-@$(UND) remove unittest -db $@
@$(UND) analyze -all -db $(CURDIR)/$@ > $(CCK_DIR)/analyze.log 2>&1
@$(UND) -db $(CURDIR)/$@ codecheck -html $(CCK_RULES_FILE) $(CCK_DIR) > $(CCK_DIR)/codecheck.log 2>&1
@$(UPERL) $(UND_PERL_SCRIPT) $(CURDIR) -db $@
@rm $@
@echo
@echo codecheck: Done
@echo ----------------------------------------------------------------------------
codecheckclean:
@rm -rf $(CCK_DIR)
@mkdir $(CCK_DIR)
@echo
@echo codecheckclean: Done
@echo ----------------------------------------------------------------------------
##########################################################################
# #
# Build rules for Metrics/Complexity of C++ files using Understand #
# #
##########################################################################
metric.udb: $(MET_DIR)
@echo
@$(UND) create -db $@ -languages c++
@$(UND) -db $@ settings -c++MacrosAdd RELEASE_BUILD=1
@$(UND) settings -metricsShowDeclaredInFile on -db $@
@$(UND) settings -metrics MaxNesting CyclomaticModified -db $@
@$(UND) add $(CURDIR) -db $@
-@$(UND) remove unittest -db $@
@$(UND) analyze -all -db $@ > $(UND_METRICS_LOG) 2>&1
@$(UND) metrics -db $@
-@mv -f metric.csv $(MET_DIR)/
@rm $@
@echo
@echo metrics: Done
@echo ----------------------------------------------------------------------------
metricclean:
@rm -rf $(MET_DIR)
@mkdir $(MET_DIR)
@echo
@echo metricclean: Done
@echo ----------------------------------------------------------------------------
##########################################################################
# #
# Build Rules to create a manifest of static analysis tool results #
# #
##########################################################################
manifestall: manifestclean uncrustifyclean lintclean codecheckclean metricclean uncrustify codecheck.udb metric.udb
@$(MAKE) -j $(NUMBER_OF_PROCESSORS) lint
@python $(MANIFEST_SCRIPT_LOCATION) --cpp $(MANIFEST_SRC) --searchpath $(VPATH)
@echo
@echo manifestall: Done
@echo ----------------------------------------------------------------------------
manifest:
@python $(MANIFEST_SCRIPT_LOCATION) --cpp $(MANIFEST_SRC) --searchpath $(VPATH)
@echo manifest: Done
@echo ----------------------------------------------------------------------------
manifestclean:
@rm -f $(CURDIR)/manifest.csv
@echo manifestclean: Done
@echo ----------------------------------------------------------------------------
##########################################################################
# #
# Build rules for PyLint of Python files #
# #
##########################################################################
# TODO in the future
# rule to create lint output for Python code
#$(PYLINT_DIR)/%.pylint: %.py
# @echo ----------------------------------------------
# @echo -PyLint: $<
# @echo ----------------------------------------------
# @$(PYTHON) $(PYLINT) --include-ids=y --rcfile=$(PYLINT_CONFIG) $< > $@
##########################################################################
# #
# Build rules for PEP8 (CodeCheck) of Python files #
# #
##########################################################################
# TODO in the future
# rule to create codecheck for Python code
#$(CCK_DIR)/%.pep8: %.py
# @echo ----------------------------------------------
# @echo PEP8: $<
# @echo ----------------------------------------------
# @$(PYTHON) $(PEP) --statistics --show-source --repeat $< > $@
##########################################################################
# #
# Dependancy File Creation #
# #
##########################################################################
# alwawys try to create a dependancy file unless $(MAKECMDGOALS) is one of the listed targets
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),lint)
ifneq ($(MAKECMDGOALS),lintclean)
ifneq ($(MAKECMDGOALS),uncrustify)
ifneq ($(MAKECMDGOALS),uncrustifyclean)
ifneq ($(MAKECMDGOALS),codecheck.udb)
ifneq ($(MAKECMDGOALS),codecheckclean)
ifneq ($(MAKECMDGOALS),metric.udb)
ifneq ($(MAKECMDGOALS),metricclean)
ifneq ($(MAKECMDGOALS),manifestall)
ifneq ($(MAKECMDGOALS),manifest)
ifneq ($(MAKECMDGOALS),manifestclean)
include $(DEP_OBJS)
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif