Cmake指定生成目标路径
# 将本目录源文件名称名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library (ABC SHARED ${DIR_LIB_SRCS})
set(PATH /root)
# 设置动态库文件输出路径
set_target_properties(
ABC
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PATH}
)
makefile 屏蔽输出 Entering/Leaving directory
makefile 屏蔽输出 Entering/Leaving directory - Swack
建立一个入口Makefile执行指定子目录中的Makefile
建立一个入口Makefile执行指定子目录中的Makefile_初心-CSDN博客_makefile 进入目录
cmake:环境变量(environment variable)读写和if判断
cmake:环境变量(environment variable)读写和if判断_10km的专栏-CSDN博客
CMakeLists文件中打印出里面定义的变量的值 - maycpou - 博客园
在Makefile中设置环境变量
在Makefile中设置环境变量_weixin_34268610的博客-CSDN博客
Makefile:如何隐藏命令内容本身
cmake 命令概述:
示例:
文件tree
//linux64
[ test]$ tree -I "modules"
.
├── test_Kernel //代码路径
│ ├── test1 //示例子demo1-》编译成独立.so
│ │ ├── CMakeLists.txt //该so的cmake文件
│ │ └── test.cc
│ └── test2 //示例子demo2-》编译成独立.so
│ ├── CMakeLists.txt //该so的cmake文件
│ └── test.cc
└── test_project // 工程路径
├── config-user.mk //子makefile 用于汇总所有需编译的 cmakelists.txt 的路径
├── GNUmakefile //总的makefile, make命令默认执行
└── linux64
├── lib //存放生成的动态库
│ ├── libtest1.so
│ ├── libtest2.so
│ └── systemc
└── obj //存放中间文件,包含cmake生成的makfile信息
test_kernel/test1/CMakelists.txt
cmake_minimum_required (VERSION 3.0)
project (test1)
aux_source_directory(. DIR_LIB_SRCS)
#MESSAGE("OBJ_PATH: " $ENV{OBJ_PATH})
set(PATH $ENV{OBJ_PATH})
#MESSAGE("PATH: " ${PATH})
#set(PATH /home/zhangyi10245050/simics_project/bk1_simics_project_master/Lads/test_project/build)
#add_compile_options(-std=c++14)
#add_compile_options(-fPIC -shared -g )
add_library(test1 SHARED ${DIR_LIB_SRCS})
set_target_properties(
test1
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PATH}
PREFIX ""
)
#PREFIX "" #删除lib前缀
test_kernel/test2/CMakelists.txt
cmake_minimum_required (VERSION 3.0)
project (test1)
aux_source_directory(. DIR_LIB_SRCS)
#set(PATH /home/zhangyi10245050/simics_project/bk1_simics_project_master/Lads/test_project/build)
set(PATH $ENV{OBJ_PATH})
#add_compile_options(-std=c++14)
#add_compile_options(-fPIC -shared -g )
add_library(test2 SHARED ${DIR_LIB_SRCS})
set_target_properties(
test2
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PATH}
)
test.cc
#include <stdio.h>
#include <stdlib.h>
double power(double base, int exponent)
{
int result = base;
int i;
if (exponent == 0) {
return 1;
}
for(i = 1; i < exponent; ++i){
result = result * base;
}
return result;
}
/*
int main(int argc, char *argv[])
{
if (argc < 3){
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
double result = power(base, exponent);
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}*/
test_project/config-user.mk
SIMICS_PROJECT:=$(PROJECT_DIR)
MODULE_DIRS_USER+=;$(SIMICS_PROJECT)/../test_Kernel/test1
#MODULE_DIRS_USER:=$(SIMICS_PROJECT)/../test_Kernel/test1
MODULE_DIRS_USER+=;$(SIMICS_PROJECT)/../test_Kernel/test2
$(info MODULE_DIRS_USER: $(MODULE_DIRS_USER))
_MODULES_QUALIFIED:=$(patsubst %/CMakeLists.txt,%,$(foreach d,$(subst ;, ,$(MODULE_DIRS_USER)),$(wildcard $(d)/CMakeLists.txt)))
$(info _MODULES_QUALIFIED: $(_MODULES_QUALIFIED))
test_project/GNUmakefile
MKDIRS = mkdir -p
CAT = cat
HOST_TYPE =./linux64
export PROJECT_DIR = $(shell pwd)
export OBJ_PATH=$(PROJECT_DIR)/$(HOST_TYPE)/lib
OBJ_MODULES=$(PROJECT_DIR)/$(HOST_TYPE)/obj/modules
MAKEFLAGS+= --no-print-directory
_say=$(info $(1))
_oneword = $(if $(word 2,$1),$(warning Duplicate module name $(notdir $(word 1,$1)), found as: $1))$(word 1,$1)
-include config-user.mk
#MODULES:=$(sort $(notdir $(_MODULES_QUALIFIED)))
MODULES:=$(notdir $(_MODULES_QUALIFIED))
#$(info MODULES: $(MODULES))
.PHONY: $(MODULES)
all:$(MODULES)
$(MODULES):%:
$(call _say,=== Building module $@ ===)
$(if $(wildcard $(OBJ_MODULES)/$@),,$(MKDIRS) $(OBJ_MODULES)/$@)
@cmake $(call _oneword,$(filter %/$@,$(_MODULES_QUALIFIED))) -B $(OBJ_MODULES)/$@
@$(MAKE) -C $(OBJ_MODULES)/$@
.PHONY: clean
clean:
@echo Making clean
@list='$(MODULES)'; for subdir in $$list; do \
echo "Clean in $$subdir";\
$(MAKE) -C $(OBJ_MODULES)/$$subdir clean;\
done
.PHONY: clean_all
clean_all:
@echo Making clean_all
@list='$(MODULES)'; for subdir in $$list; do \
echo "Clean in $$subdir";\
rm -r $(OBJ_MODULES)/$$subdir; \
done