2024-04-26T01:24:40+00:00 me@minidump.info 更新FreeBSD、NetBSD、OpenBSD、DragonflyBSD 2024-04-14T00:00:00+00:00 https://blog.ismisv.com/2024/04/update-bsd 之前在PVE上装了几个BSD系统后,也没怎么用,就时不时更新一下,各个BSD有各自的更新方式,这里简单记一下。

更新都是在root下进行,或在命令前加sudo。系统更新尽量在控制台进行,不要通过ssh远程登录执行,因为ssh进程很可能会在更新过程中被干掉。

FreeBSD

更新系统

更新补丁

1
freebsd-update fetch install

更新大版本

1
2
3
4
5
6
7
8
9
freebsd-update -r 14.0-RELEASE upgrade
freebsd-update install
reboot
freebsd-update install
pkg-static install -f pkg
pkg update
pkg upgrade
/usr/sbin/freebsd-update install
reboot

更新预编译包

1
pkg update && pkg upgrade

修改包镜像源

修改文件/usr/local/etc/pkg/repos/FreeBSD.conf

NetBSD

更新系统

1
sysupgrade auto ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-10.0/amd64

更新预编译包

1
pkgin update && pkgin upgrade

修改包镜像源

修改文件/usr/pkg/etc/pkgin/repositories.conf

OpenBSD

更新系统

1
sysupgrade auto https://ftp.usa.openbsd.org/pub/OpenBSD/7.5/amd64

更新预编译包

1
pkg_add -iuv

修改包镜像源

修改文件/etc/installurl

DragonflyBSD

更新系统

官方文档,需要自己下载源代码,编译,安装,再重启。

更新预编译包

1
pkg update && pkg upgrade

修改包镜像源

修改文件/usr/local/etc/pkg/repos/df-latest.conf

]]>
湖州龙之梦乐园跨年 2024-01-01T00:00:00+00:00 https://blog.ismisv.com/2024/01/hu-zhou-long-zhi-meng-le-yuan-trip 节假日不用回老家真是太好了,29号晚上才决定去湖州龙之梦乐园玩一下,在网上团了酒店房间,虽然网上都说那边商业化很严重,似乎评价不高的样子,但总归要自己去过才知道到底行不行,反正离得不远,自驾1个半小时就行了。

我们订了瑞峰国际大酒店的大床房,面朝太湖古镇的那一边房间要比另一边面朝大山的房间贵100块钱一天,主要是可以晚上直接在阳台上观赏烟花表演,但我们没选,因为可以很方便地在酒店外的地面上观看。

无论是打车还是公交,都比较方便,公交大多2元随便坐,也可以自己开车,就会有找停车位的麻烦,另外就是晚上水秀和烟花秀时段,太湖古镇那一路段会交通管制,要等9点半表演结束后才放开,那时乌泱泱的人和车,最好避开这个时段。

值得吐槽的是,在一些明显需要红绿灯的地方,只有斑马线,没有红绿灯,而那边的车辆基本不会停下礼让行人,反而开得飞快,生怕行人挡了他们的路似的。

有一次我在斑马线上等了好几分钟,直到有2辆私家车主动减速停在斑马线前,我老婆看了一眼说:“果然是沪牌。”

再后来又一次过斑马线,趁着车流量较大,车速不快,我们强行穿过斑马线,我老婆看了一眼停下的车说:“像这些牌的就只能被动逼停。”

感觉到了浓浓的地域歧视,哈哈。

非常不好,一则是没找到好吃的,别说堂食了,外卖都没什么好吃的,晚上居然看到不少人排队在酒店一楼的超市买泡面。二则是很贵,无论是连锁的肯德基、必胜客,还是小馆子,价格都比其他地方贵不少。如果想吃得好点可以跑到湖州市区去,比如吾悦广场,大概10公里左右。感觉这点是这个度假区最大的败笔,如果让我说一个不想再去第二次的理由,或者劝阻别人去那里的理由,我就说这点。

我只去了动物园,排队一个多小时坐了小火车,花了120块钱买了投喂动物的食物,反正我挺反感这点的,感觉就是拿捏住小孩家长的命脉使劲薅羊毛,还那么贵,诛心点说,怪不得越来越多的人不想生小孩了。

看了大马戏,还是挺精彩的,或者说紧张刺激的,但我看那些高空杂技表演的时候一直心惊胆战的。期间有熊出来表演,旁边一些人在那说“好可爱”,我就联想到前些天在网上看到日本熊吃人的新闻,总归心里不大舒服。

两天晚上都看了喷泉表演,感觉还不如上海爱琴海购物公园门口的喷泉表演呢。

烟花表演倒还不错,就是时间短了点,几十架航拍的无人机在头顶闪着灯,别有一番趣味。

]]>
修改DNS去广告 2023-08-01T00:00:00+00:00 https://blog.ismisv.com/2023/08/dns-block-ads 以前也尝试过在DNS上做手脚拦截广告,但因为误杀太多以及漏网之鱼太多,觉得还不如不折腾呢。

最近偶然发现了一组列表,又尝试了一番,发现效果挺不错的,手机开屏广告绝大多数不见,浏览网页时Google Ads也基本没有了,真是让我喜出望外。所以以前效果不好的原因只是因为使用的黑名单列表不好而已。

我是在路由器上的CoreDNS使用ads插件设置拦截的,所有接入的设备都可以享受到这个效果。用到3组黑名单源,分别是Anti-adAdGuardEasyList,然后自己写了点代码将列表规整了一下,转成hosts文件的格式后合并为一个文件,ads插件可以直接通过http协议加载hosts格式的文件。CoreDNS的配置文件增加ads就行了:

1
2
3
4
5
#blocklist domains.txt
ads {
    blacklist https://cdn.jsdelivr.net/gh/missdeer/blocklist@master/convert/alldomains.txt
    nxdomain
}
]]>
Debian上使用Nginx搭建WebDav服务要点 2023-07-18T00:00:00+00:00 https://blog.ismisv.com/2023/07/debian-nginx-webdav-tips 要点:

  1. 不要用Nginx官方的源,而是用Debian的源安装Nginx
  2. 一键安装Nginx及扩展:sudo aptitude -y install nginx-full nginx-extras libnginx-mod-http-dav-ext libnginx-mod-http-auth-pam
  3. 配置要给zone分配内存:dav_ext_lock_zone zone=webdav:10m;

最容易出问题的就是以上3点,其他配置从网上抄一下就行,大体如下:

location / {
    root /home/missdeer/;
    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
    dav_access user:rw group:rw all:rw;
    dav_ext_lock zone=webdav;

    client_max_body_size 102400M;
    create_full_put_path on;
    client_body_temp_path /tmp/;

    set $dest $http_destination;
    if (-d $request_filename) {
        rewrite ^(.*[^/])$ $1/;
        set $dest $dest/;
    }

    if ($request_method ~ (MOVE|COPY)) {
        more_set_input_headers 'Destination: $dest';
    }

    if ($request_method ~ MKCOL) {
        rewrite ^(.*[^/])$ $1/ break;
    }

    auth_pam "Restricted";
    auth_pam_service_name "common-auth";

    index index.html index.htm index.php admin.php;
}

最后启用Nginx:sudo systemctl restart nginx

如果起不来,先看一下配置文件是否有问题:sudo /sbin/nginx -t

]]>
武夷山之旅 2023-06-24T00:00:00+00:00 https://blog.ismisv.com/2023/06/wuyishan-trip 端午节最终决定去武夷山游玩,对旅游这块确实既没多大兴趣,更没什么经验,都是老婆一手操办下来的。这个决定做的比较晚,导致买高铁票都是老婆花了不少日子靠在app上抢来,好在总体而言还算顺利,叫上两边的老人一起,浩浩荡荡7个人。

住宿是在一个叫一同山居的民墅,环境和服务都感觉不错,还可以提前让他们帮忙订《印象大红袍》的门票,可以讲价,当然羊毛出在羊身上,毕竟还有大头房费呢,看怎么谈更划算。高铁坐到南平市站,然后转K1线公交车到茶博园站下车。周围很多类似的民墅,和酒店的经营方式非常相似,有前台,有自己的停车场,有电梯,有自己的餐厅提供早餐,当然还有当地特色的茶厅,可以自己泡茶。价格不是很贵,估计是受疫情影响生意比以前差了,反正在这3天里我只见过另两个客人。

22号中饭是在茶人村吃的,环境挺好的,菜的口味也还好,份量也大。晚饭则是在五小厨,环境就比较一般,菜的口味还好,但份量不如茶人村那么足。两家店总的说来都是价格实惠,大概人均50元就够了,习惯了上海的馆子的价格后,这样的真算得上价廉物美了。23号中饭是在一家叫闽味私厨的馆子吃的,只有2个大妈服务员,服务差点,味道差不多,价格也差不多,结账的时候和老板聊了几句,老板说2010年-2018年就在上海开店的,后来回了老家云云。因为中饭吃得晚,晚上又要看表演,就没吃晚饭,特别跑去网上推荐的旧街小光饼,一个非常非常小的店铺,只有一个烤炉,说这炉在烤的都已经被订了,要么等50分钟出下一炉,老婆居然还犹豫,真是无法想像那些为个网红小吃等几个小时的人是怎样的脑回路,就算时间是用来浪费的,也可以浪费在更有趣的事情上啊,我直接拉她到路对面的另一个小光饼梅干菜饼店买了20块钱的饼。表演结束后回到住处,在饿了么上点夜宵,非常贵,就是专砍游客的,非常不推荐,应该去店里吃的。

比较恼火的是天气不好,一直在下午,22号吃过中饭,下午冒着大雨去了一下大红袍景点,看到了传说中的几株母树。23号本来想去天游峰的,但是因为我妈身体不好,我和我爸只好爬到1/3的路程返回,我老婆和丈人丈母娘带着我儿子居然爬上去了,结果因为我妈爬不了山,到哪都是要爬山的,跑去水帘洞,走了不少路,发现最后也是要爬山的,只能原路返回,直到我老婆他们下山。

这一趟最值的是晚上看《印象大红袍》表演了,天公作美,表演期间没有下雨,这种表演形式也新奇,感觉是这次到武夷山旅游最值得的一个项目了。非常推荐!

最想吐槽的是交通状况,那边红绿灯非常少,斑马线也非常少,要横穿马路就是裸奔,全靠司机素质好,遇到行人肯停车等待。另一个是高德地图的实时公交功能不能用,对于在上海用惯这功能的人来说,简直变成了瞎子。24号赶高铁,在公交站等了十几分钟没等到K1线,老婆就着急忙慌打了个车先走了,结果不到2分钟后我刚在高德地图下了单,K1线就过来了,上了车就接到接单出租车司机的电话,连忙取消订单。这个体验太差了。

]]>
配置Debian路由器双WAN接入 2022-11-03T00:00:00+00:00 https://blog.ismisv.com/2022/11/dual-wan-internet-access 鉴于移动免费送了1年200M的一条宽带,没多犹豫决定还是要用起来。经过一番折腾,基本搞好了,目前的情况大概是这样的:

家中网络拓扑弱电箱电信光猫移动光猫R86S软路由TP-Link SG1210PPoE千兆交换机@弱电箱TP-Link千兆交换机@客厅TP-Link千兆交换机@主卧HTPC一些服务程序如Git Server等主卧86面板AP5G WIFI以太网口次卧86面板AP5G WIFI以太网口餐厅86面板AP2.4G & 5G WIFI以太网口客厅86面板AP2.4G & 5G WIFI以太网口TL-AC100MacMini吃灰备用Windows小主机主力开发机Debian曾经的主力旁路由@PVEFreeBSD学习实验用@PVENetBSD学习实验用@PVEOpenBSD学习实验用@PVEDragonflyBSD学习实验用@PVEWindows台式机TP-Link监控摄像头TP-Link监控摄像头Chromecast电视机智能门锁

2年前也写过文章提到过家里的网络拓扑,大的变化没有,只是加了一些新设备。现在在原有电信宽带的情况下,新增一条移动宽带,主要就是把接入路由器换了,原本的TP-Link R470GP只能接入一个WAN,正好目前R86S比较火,买了个最便宜的版本,先不考虑自己折腾猫棒,能双线以太网口接入就行。另外从闲鱼收了一个TP-Link SG1210P,索性把所有面板都从同一个交换机连上,情况会简单很多。

TP-Link SG1210P有3种工作模式,其中VLAN模式和视频监控模式,LAN中的设备只能与上游接入设备通信,我这里客厅的HTPC要与主卧的诸多设备互通,所以要把TP-Link SG1210P切换到标准模式。

剩下的工作就是把R86S配置好,顺便把原来HTPC/Debian上的科学上网工作也移到R86S上。我给R86S装了最新的Debian 11,网上看其他做软路由的文章/视频99.9%是刷OpenWRT,我为什么不用呢,有几个原因:

  1. 首先最重要的是,Debian是我最喜欢的Linux发行版,没有之一。从图上可以看到,客厅的HTPC,主卧的曾经的主力旁路由,都是装的Debian,我所有的VPS上也都用的Debian。
  2. 其次,我觉得OpenWRT的可玩性不如Debian好,Debian做路由系统需要自己动手做的事更多,但另一方面讲也更自由。
  3. Debian官方仓库的软件包更多更可信,OpenWRT这方面差一点,系统和软件包的魔改版本太多,全都自己编译的话太费时费力。
  4. 最后,对OpenWRT的质量不太信任,之前买了个GL.iNet MT1300,刷的是厂商定制的OpenWRT,升级系统没一次是没问题的。而我这么多不同硬件环境下的Debian系统大版本升级没一次是有问题的。

再来讲如何将Debian配置成一个路由器。我的R86S是最低配的那款,只有3个以太网口,规划好3个口的用途,将外壳上标记的eth0和eth1作为WAN口,连接运营商的光猫,eth2作为LAN口,连接屋内的交换机。

首先,在sysctl中将包转发功能打开(我不使用IPv6,不实用),root打开文件/etc/sysctl.conf,顺便把BBR也打开:

net.ipv4.ip_forward=1
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

再运行一下sysctl -p使其生效。

然后配置网络连接,我有3个网口,分别是enp1s0enp2s0enp3s0,前2个分别接入电信和移动宽带,第3个作为LAN,编辑/etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp1s0
iface enp1s0 inet dhcp
#iface enp1s0 inet6 dhcp

auto enp2s0
iface enp2s0 inet dhcp
#iface enp2s0 inet6 dhcp

auto enp3s0
iface enp3s0 inet static
    address 192.168.233.1
    netmask 255.255.255.0

如果想用IPv6,可以把inet6那两行注释去掉,我不用,所以就注释掉了,都使用DHCP从光猫获取IP。把内网网段设为192.168.233.x,本机作为路由器即网关,就用192.168.233.1。再设置一下iptables转发参数,运行命令:

1
2
iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE

这时已经可以上网了,比如敲个命令curl www.baidu.com看一下,可以得到返回的内容。如果有其他设备接入enp3s0的口,并手动将IP和子网掩码,网关分别设置到192.168.233.x255.255.255.0192.168.233.1,其中x是[2,255]间的整数。

接着使用dnsmasq作为DHCP服务器。安装好后编辑配置文件/etc/dnsmasq.conf

interface=enp3s0
dhcp-range=192.168.233.200,192.168.233.250,255.255.255.0,12h
dhcp-option=option:router,192.168.233.1
dhcp-option=option:dns-server,192.168.233.1

内容很简单:第1行,将服务绑定到第3个网口,第2行,设定自由分由的IP地址池以及有效时间,第3行,告知客户端使用的网关IP,第4行,告知客户端使用的DNS服务器地址。还可以绑定IP和mac地址,这样可以在后续针对某个设备做些特殊的设置:

dhcp-host=00:e0:4c:68:2a:5f,192.168.233.166
dhcp-host=00:e0:4c:68:2a:60,192.168.233.66
dhcp-host=00:1E:65:41:73:C2,192.168.233.16

这里我将本机作为DNS服务器,dnsmasq本身也是一个DNS服务器程序,但我习惯使用CoreDNS,在以前的文章中详细讲过。

最后是配置一下分流策略,我没拿双线做负载均衡和故障转移,因为我觉得电信1000M和移动200M接入以我家里平常的使用习惯,以及凭目前的服务质量可能一年都碰不到一次需要用另一根线的情况。而流量分流的话,可能在访问某一些服务器时延迟能减少几毫秒(误!我的策略很简单,如果目的IP是归属移动的,则走移动线,否则走电信线。需要分本机流量和非本机流量两种情况处理,先处理非本机的情况,从https://ispip.clang.cn/下载归属移动的IP地址段列表,然后添加到一个ipset中,命令如下:

1
2
3
4
5
6
7
rm -f /tmp/cmroute.txt
curl -sSL https://ispip.clang.cn/cmcc_cidr.txt | while read line
do
    echo "add cmroute $line" >> /tmp/cmroute.txt
done
ipset create cmroute hash:net family inet hashsize 1024 maxelem 512
ipset restore -f /tmp/cmroute.txt

然后给enp3s0的流入流量打个标签:

1
iptables -A PREROUTING -i enp3s0 -t mangle -m set --match-set cmroute dst -j MARK --set-mark 10

再给移动线建一个新的路由表(假设叫table 10)并打了标签的流量都导到这个路由上去(192.168.1.6是移动光猫分配出来的IP):

1
2
3
4
ip rule add from 192.168.1.6 table 10
ip rule add fwmark 10 table 10
ip route add 192.168.1.0/24 dev enp2s0 src 192.168.1.6 table 10
ip route add default via 192.168.1.1 dev enp2s0 table 10

这时接入到enp3s0口的设备访问移动网络的IP时就会走移动线路了,可以打开移动官网或手机app,感觉似乎真的快了一点点呢!

最后,把本机的流量也分一下,直接改主路由表就行了:

1
2
3
4
curl -sSL https://ispip.clang.cn/cmcc_cidr.txt | while read line
do
    ip route add $line dev enp2s0
done

路由器的基本设置就完成了。另外还可以弄一下科学上网等,这是另一个话题了,暂且略过。

]]>
关于Qt/CMake的一个经验 2022-10-01T00:00:00+00:00 https://blog.ismisv.com/2022/10/a-tip-for-qt-cmake 不要使用Qt安装器中提供的CMake,而是自己另外安装一份,比如从CMake官网下载,或者macOS上可使用Homebrew在线安装。

也许你一直用Qt安装器中的那个CMake用得好好的,那没关系。如果有一天突然遇到莫名其妙的CMake配置错误,可以试试使用其他安装的版本,哪怕是被qt-cmake调用的情况下。

]]>
Windows上编译Zeal 2022-04-04T00:00:00+00:00 https://blog.ismisv.com/2022/04/build-zeal-on-windows 鉴于最近买了个梯子,不大稳定,速度也没以前的快,直接打开在线的开发文档就感觉不大舒服了,想在本地弄个快的。今天编译试用了一下Zeal,感觉不错,比当时刚出来的时候好多了,不会随便动两下就遇到奇怪的bug,界面也不那么丑了。

官网上的安装包是3年半前的了,要最新的需要自己编译,看一下文档说明,还算简单。

首先需要准备好MSVC和Qt5。

然后下载依赖项libarchivesqlite3。都下载官方预编译的包就行了,sqlite3稍微麻烦一点,只能下载到.h.dll.def文件,没有.lib文件,需要自己用命令从.def生成sqlite3.lib

lib /DEF:sqlite3.def /OUT:sqlite3.lib /MACHINE:x64

最后安装工具cmake,就可以开始编译了。

打开cmd命令行窗口,假设libarchive和sqlite3分别存放在C:\Project\libarchiveC:\Project\sqlite-dll-win64-x64,进入zeal代码所在目录,敲命令:

cd zeal
set Qt5_DIR=C:\Qt\5.15.2\msvc2019_64
cmake.exe -B build -DLibArchive_LIBRARY=C:\Project\libarchive\lib\archive.lib -DLibArchive_INCLUDE_DIR=C:\Project\libarchive\include -DSQLite_LIBRARY=C:\Project\sqlite-dll-win64-x64\sqlite3.lib -DSQLite_INCLUDE_DIR=C:\Project\sqlite-dll-win64-x64 -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_C_FLAGS="/utf-8" -DCMAKE_CXX_FLAGS="/utf-8"
cmake.exe --build build --config Release

这样应该就能编译出来zeal.exe了。

如果有Ninja,则可以指定cmake使用ninja以便并行编译项目,加快编译速度:

cd zeal
set Qt5_DIR=C:\Qt\5.15.2\msvc2019_64
cmake.exe -B build -DLibArchive_LIBRARY=C:\Project\libarchive\lib\archive.lib -DLibArchive_INCLUDE_DIR=C:\Project\libarchive\include -DSQLite_LIBRARY=C:\Project\sqlite-dll-win64-x64\sqlite3.lib -DSQLite_INCLUDE_DIR=C:\Project\sqlite-dll-win64-x64 -DCMAKE_MAKE_PROGRAM=C:\Tools\ninja.exe -DCMAKE_BUILD_TYPE=Release -G"Ninja" -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_C_FLAGS="/utf-8" -DCMAKE_CXX_FLAGS="/utf-8"
cmake.exe --build build

可以看到两种方法的区别,前一种方法cmake生成了MSVC的工程文件,cmake编译时调用MSVC的构建工具,所以可以在编译命令中加--config Release指定编译variant,后一种方法生成的是Ninja工程文件,直接指定了编译variant,后面的编译命令不需要再指定编译variant,然后cmake调用了ninja进行编译,ninja会自己根据当前CPU的核数自动启动多个并行编译任务。

编译出zeal.exe后,要把archive.dllsqlite3.dll拷贝到相同目录,再用Qt的windeployqt.exe把依赖的Qt库都拷过来,最后把Qt的Tools目录下的OpenSSL两个文件libcrypto-1_1-x64.dlllibssl-1_1-x64.dll拷贝过来,就能双击运行zeal.exe了,跑起来的界面大概是这个样子:

zeal

]]>
Windows上cmake适配多种构建工具和编译器 2022-01-10T00:00:00+00:00 https://blog.ismisv.com/2022/01/adapter-compilers-with-cmake-on-windows 用CMake的好处一是屏蔽了多种常见编译器的编译选项和命令行参数差异,二是可以选择目标构建工具。我前段时间要写一个SDK,希望SDK能在主流操作系统(Windows,Linux,macOS)上跑,能用常见的编译器套件(MSVC,GCC,Clang,Intel C编译器等等)编译,这正好是CMake的用武之地。

使用不同的构建工具

NMake

以Windows为例,我想用MSVC编译,则用如下命令行:

1
2
3
4
mkdir build
cd build
cmake.exe -DCMAKE_BUILD_TYPE=Release -G"NMake Makefiles" -DCMAKE_PREFIX_PATH=U:\boost_1_77_0  ..
nmake

JOM

如果嫌nmake编译速度慢,Qt提供了一个跟nmake相近但允许像GNU make一样加-j参数并行编译的工具JOM,命令行如下:

1
2
3
4
mkdir build
cd build
cmake.exe -DCMAKE_BUILD_TYPE=Release -G"NMake Makefiles JOM" -DCMAKE_PREFIX_PATH=U:\boost_1_77_0 -DCMAKE_MAKE_PROGRAM=C:\Qt\Tools\QtCreator\bin\jom\jom.exe  ..
jom.exe -j 12

Ninja

也可以用现在很流行的另一个构建工具Ninja,它默认自动进行并行编译,命令行如下:

1
2
3
4
mkdir build
cd build
cmake.exe -DCMAKE_BUILD_TYPE=Release -G"Ninja" -DCMAKE_PREFIX_PATH=U:\boost_1_77_0 -DCMAKE_MAKE_PROGRAM=C:\Tools\ninja.exe  ..
ninja.exe

使用不同的编译器

Clang for Windows

前面是用了MSVC,如果想用Clang,Clang在Windows上有2种,一种是使用MSVC的套件,前端命令工具是clang-cl,另一种是使用MinGW,前端命令工具是clang,在cmake中只要参数设置一下就可以了:

1
2
3
4
mkdir build
cd build
cmake.exe -DCMAKE_BUILD_TYPE=Release -G"NMake Makefiles" -DCMAKE_PREFIX_PATH=U:\boost_1_77_0  -DCMAKE_CXX_COMPILER=clang-cl  ..
nmake

Intel oneAPI Compiler

以前Intel C编译器只在Linux上是免费的,现在Windows和macOS上也有免费安装包下载了,有在线安装和离线安装包2种,根据自己网络情况下载后安装,然后从开始菜单找到Intel oneAPI command prompt for Intel 64 for Visual Studio 2019,它的工具命令行是icx,但后面接了clang,所以也是clang-cl,这点不需要关心,知道是这回事就行,命令行如下:

1
2
3
4
mkdir build
cd build
cmake.exe -DCMAKE_BUILD_TYPE=Release -G"NMake Makefiles" -DCMAKE_PREFIX_PATH=U:\boost_1_77_0  -DCMAKE_CXX_COMPILER=icx  ..
nmake

用Intel oneAPI编译出来的可执行文件相比MSVC和官方Clang编译出来的可执行文件多链接了一个libmmd.dll,可能这是Intel家特有的一个优化点。

GCC/Clang with MinGW

MinGW在Windows上有多套环境,不同环境又有GCC和Clang这2种C++编译器,CMake都支持了这总共4种编译套件,构建工具可以使用MinGW官方的mingw32-make,注意一定要用官方CMake包,不要用msys2中的CMake,会有奇怪的问题。

64位GCC

1
2
3
4
mkdir mingw64-gcc-build
cd mingw64-gcc-build
env PATH=$PATH:/mingw64/bin cmake.exe -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=gcc -DCMAKE_MAKE_PROGRAM=/mingw64/bin/mingw32-make.exe ..
env PATH=$PATH:/mingw64/bin /mingw64/bin/mingw32-make.exe -j `nproc` 

64位Clang

1
2
3
4
mkdir mingw64-clang-build
cd mingw64-clang-build
env PATH=$PATH:/clang64/bin cmake.exe -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang -DCMAKE_MAKE_PROGRAM=/clang64/bin/mingw32-make.exe ..
env PATH=$PATH:/clang64/bin /clang64/bin/mingw32-make.exe -j `nproc` 

32位GCC

1
2
3
4
mkdir mingw32-gcc-build
cd mingw32-gcc-build
env PATH=$PATH:/mingw32/bin cmake.exe -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=gcc -DCMAKE_MAKE_PROGRAM=/mingw32/bin/mingw32-make.exe ..
env PATH=$PATH:/mingw32/bin /mingw32/bin/mingw32-make.exe -j `nproc` 

32位Clang

1
2
3
4
mkdir mingw32-clang-build
cd mingw32-clang-build
env PATH=$PATH:/clang32/bin cmake.exe -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang -DCMAKE_MAKE_PROGRAM=/clang32/bin/mingw32-make.exe ..
env PATH=$PATH:/clang32/bin /clang32/bin/mingw32-make.exe -j `nproc` 
]]>
把玩BSD 2021-12-27T00:00:00+00:00 https://blog.ismisv.com/2021/12/cross-compile-for-dragonflybsd 前些时间脑子发热在淘宝上买了个DeskMini X300,但是出于预算方面的原因,选了个最低档的CPU——AMD 3000G,到手后发现跑Windows10非常慢,有点后悔没有多加千把块钱配个好点的CPU。

我买DeskMini的原因倒不是为了跑Windows,而是为了跑Linux之类的当服务器,然后刚好了解了一下PVE,于是一番折腾,先装了PVE,再陆续装了5个虚拟系统,分别是Debian 11,FreeBSD 13,NetBSD 9.2,OpenBSD 7以及DragonflyBSD 6,而且只装了命令行界面,所有图形界面组件全都没有装,这样一来机器性能就不是什么大问题了。

这些年一直在VPS和HTPC上跑着Debian 11,虽然不是很熟练,但也不陌生。但几个BSD系统,只有好些年前在Thinkpad T43装过一回,也没怎么用,基本属于完全不了解的程度,不过好在安装过程非常简单,连资料都不用看也能基本顺利地完成安装。

安装完成之后,便是设置普通用户,设置服务等等,除了一些Linux上可以使用的命令没有外,日常使用基本上不是特别难的问题,上网都能搜到一些资料。不过到目前为止还遗留一个问题:在Linux上建的NFS server,在BSD上挂载后只有只读,但在Linux下可以挂载为读写。

我比较关心的是在各个系统上编写自己的程序是否方便,发现FreeBSD和OpenBSD都默认使用较新版本的clang,NetBSD默认安装某个旧版本gcc,但可以自行用pkgin安装最新的clang。但是DragonflyBSD就比较懒了,默认安装了某个很旧版本的gcc,还没现成的clang安装包。

既没有DragonflyBSD上可用的clang安装包,又不想自己编译一个clang,也不想用老旧的gcc,只能想想在其他平台用clang给DragonflyBSD做交叉编译了。

首先mount好DragonflyBSD的安装镜像ISO,这在Linux和FreeBSD上有一点区别,FreeBSD需要先创建一个回环设备:

1
$ mdconfig -a -t vnode -f DragonFly-x86_64-LATEST-ISO.iso

这时会返回新创建的回环设备名称,比如md0,再mount这个设备:

1
2
$ mkdir iso
$ mount -t cd9660 -o ro /dev/md0 ./iso

如果是Linux上则可以直接mount这个iso文件:

1
2
$ mkdir iso
$ mount -o loop,ro DragonFly-x86_64-LATEST-ISO.iso ./iso

写一个经典的Hello world,代码如下:

1
2
3
4
5
6
#include <stdio.h>

int main(int argc, char **argv) {
  printf("Hello World\n");
  return 0;
}

然后就可以用clang编译了:

1
2
3
4
5
$ clang -I./iso/usr/include \
      -L./iso/usr/lib -L./iso/usr/lib/gcc47 \
      -B./iso/usr/lib -B./iso/usr/lib/gcc47 \
      -target x86_64-pc-dragonfly-elf \
      -o helloworld helloworld.c 

如果没问题的话,这时应该生成了一个可执行文件helloworld,可以用file命令看一下文件类型:

1
2
$ file helloworld
/home/missdeer/helloworld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, interpreter /usr/libexec/ld-elf.so.2, for DragonFly 6.0.0, not stripped

大体过程就是这样了。但是最好还是编译一套原生的clang吧。

]]>