在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7796|回复: 7

[求助] makefile如何做字符串的拆分??

[复制链接]
发表于 2014-11-22 16:17:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
各位大神:        最近在搭建uvm平台,脚本是makefile。现在需要将输入的字符串在makefile中解析分开,比如将spi_case0分开为spi和case0,分别用来生成编译目录和仿真目录。  我用shell的 str1=$$string | cut -d' ' -f1 ,打印出来的是空的,
             求指教
发表于 2014-11-26 16:56:21 | 显示全部楼层
我找到一个解决方案,不过比较丑。
先写了一个perl脚本,用来切割字符。文件名是split_case_name.pl,代码如下:
#!/usr/bin/perl

use strict;

my $var_num   = $ARGV[0];
my $case_name = $ARGV[1];

my @fields = split /_/, $case_name;

if ($var_num == 0) {
   print $fields[0];
}
else {
   print $fields[1];
}

然后Makefile的代码如下:
TEST_NAME = spi_case0

COM_DIR   = $(shell ./split_case_name.pl 0 $(TEST_NAME))
SIM_DIR   = $(shell ./split_case_name.pl 1 $(TEST_NAME))

PRINT :
        -echo $(COM_DIR)
        -echo $(SIM_DIR)
发表于 2014-11-26 16:57:29 | 显示全部楼层
本帖最后由 irene_cn 于 2014-11-27 08:04 编辑

我一开始想用awk来解决这个问题,但是结果死活不对,不知道为什么。请大家帮我看一下:
TEST_NAME = spi_case0

COM_DIR   = $(shell echo $(TEST_NAME) | awk -F '_' '{print $1}')
SIM_DIR   = $(shell echo $(TEST_NAME) | awk -F '_' '{print $2}')

PRINT :
        -echo $(COM_DIR)
        -echo $(SIM_DIR)
 楼主| 发表于 2014-11-27 08:40:46 | 显示全部楼层




   perl脚本确实很好做,之前我也是这样做的,但是我需要在makefile的target中进行字符串的拆分,所以只能makefile调用shell了。在指定的目录下通过perl生成两个文件,然后提取这两个文件的名称。现在的问题是,我是想通过解析出来的模块名称去查找work目录下的路径,在linux系统中,文件名和路径是不能够重名的。所以perl脚本产生的文件需要放在什么地方呢?  如果是同模块的不同CASE并行仿真的话文件可能会出现覆盖的情况。这样做可能存在问题
 楼主| 发表于 2014-11-27 08:42:48 | 显示全部楼层


我一开始想用awk来解决这个问题,但是结果死活不对,不知道为什么。请大家帮我看一下:
TEST_NAME = spi_c ...
irene_cn 发表于 2014-11-26 16:57




   我不熟悉这个语法。但是makefile只能在target之外进行makefile变量赋值。想在makefile的target中进行赋值的话,只能通过shell变量。
发表于 2014-11-28 11:57:52 | 显示全部楼层


perl脚本确实很好做,之前我也是这样做的,但是我需要在makefile的target中进行字符串的拆分,所以 ...
allencherry 发表于 2014-11-27 08:40




    不是很理解楼主的要求啊,我觉得用perl应该满足楼主要求的。
 楼主| 发表于 2014-11-28 14:16:33 | 显示全部楼层


不是很理解楼主的要求啊,我觉得用perl应该满足楼主要求的。
irene_cn 发表于 2014-11-28 11:57




   平台设计的初衷是只编译一次代码,模块按照模块编译,系统按照系统编译。仿真的过程中,用户会输入module_name_case_name之类的字符串,比如dma_case10,makefile需要解析这个字符串,在该模块的目录下创建case_10目录,在目录下存放仿真结果。makefile智能调用perl的命令,能够让perl生成dma和case10的文件名,通过提取文件名来进行操作。perl脚本产生的文件不能够放在同一个目录下,否则不支持并行仿真,放在临时目录下会增加仿真目录。编译和仿真是分开的。仿真的过程中需要先解析出模块名称去查找模块路径。
发表于 2014-12-5 19:39:38 | 显示全部楼层
学习一下。。。。。。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 00:17 , Processed in 0.026936 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表