\ 跳到主要內容

cmake

YY: Good to know that you managed to rebuild with pybind11 reinstalled.  Comments:

1. Please search the cmake document for why you should mkdir before building a cmake project.  Similarly, please share the link that provides the information.

So at first I went here.  I get to know:

Usage

  cmake [options] path-to-source
  cmake [options] path-to-existing-build
  cmake [options] -S path-to-source -B path-to-build
From the video, the mkdir seems to be what most people do. The reason to why mkdir I supposed is that it helps organize our files, so that files won't be a mess. It helps, but not a necessity. In order to better confirm my words, I did a little experiment on it:
cmake -DCMAKE_INSTALL_PREFIX=/ .
sudo make install
It works as well. So I think the reason to mkdir is that it helps sort our files in an organized way. 

While building pybind, there are files being generated, including Makefile; no additional CMakeLists.txt are generated accordingly. I'm not sure whether it is possible that cmake would generate an additional CMakeLists.txt. If it does, the reason to mkdir will be even obvious, i.e, overwritting will increase the difficulty if we want to undo. 

2. Please find out what CMAKE_INSTALL_PREFIX does, and show me the link that explains it to you.
It designated the directory of installation. (link)
On my pc, while cmake -DCMAKE_INSTALL_PREFIX=/ .,
...
-- Installing: /usr/include/pybind11/common.h
-- Installing: /usr/include/pybind11/pybind11.h
...
while cmake -DCMAKE_INSTALL_PREFIX=/usr/local .,
...
-- Installing: /usr/local/include/pybind11/common.h
-- Installing: /usr/local/include/pybind11/pybind11.h
...


3. Read the cmake control file of either pybind11 or modmesh and tell me what it does.  You should also tell me which file(s) are the cmake control file.  Show me the links, too.
From this documentation, I think CMakeLists.txt is the cmake control file. Within CMakeLists.tx. there are if-statements, to me it correspond to the Flow Control-> conditional statement in the link above. 

  • Addressing my comments will not bring answers to your questions immediately, but will train you the skills for you to find the answers yourself later. And I would like to ask you that which platform do you want to use for developing modmesh?  It's Windows or Linux?  And why?
I would like to use Linux. Well, I think the main purpose to me is that Linux seems to be a developing platform, where I expect it to result in less troubles in the future. Also, targets on developing problem, there are more discussion on Linux and less on Windows on the internet, so I expect on Linux I could better overcome troubles in the future. 

  • While answering the questions, since you can build the code, please run all the unit tests.  You should see all of them pass.  After that, please break one test and tell me what do you do to break it and why it breaks. 
I'll work on building the code, running the unit tests, and break one test tomorrow. But may I ask, what do you mean by break?


留言

這個網誌中的熱門文章

Command Line 與 Makefile

在認識到Linux以前,我鮮少接觸到CLI(Command Line Interface),也花了些許時間去熟悉。一開始看它也許會感到有些震懾,但並沒有想像中的複雜,單純是將我們習慣使用的GUI(Graphical User Interface)改成CLI,滑鼠改成鍵盤,簡單做了轉換。 sudo apt-get install qt6-default //以superuser身份安裝qt6-default mkdir build/install -p //新增資料夾 cd build/install //切換目錄到build/install rm –rf build //remove文件, recursively. makefile make 以及 makefile讓我們得以自動化我們想執行的command line。比如說modmesh裡面中clean這個target,若是藉由一行一行的command line我們會需要輸入以下的指令, rm -f $(MODMESH_ROOT)/modmesh/_modmesh$(pyextsuffix) make -C $(BUILD_PATH) clean 但如果已經在Makefile中寫好了clean這個target,將一行行的command line寫成了shell script。 .PHONY: clean clean: rm -f $(MODMESH_ROOT)/modmesh/_modmesh$(pyextsuffix) make -C $(BUILD_PATH) clean 我們就可以去藉由make,直接輸入 make clean 去執行我們想要去執行的內容,不用逐步命令。 make clean

A brief introduction to Object file

從 這篇 可以看到在vim中開啟main.o,而上圖充斥著1&0,看似截然不同的兩個東西。 main.o in vim ^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@ ^@^@^@^@^@^@^@^@^@^@X^B^@^@^@^@^@^@^@^@^@^ @@^@^@^@^@^@@^@^L^@^K^@ó^O^^úUH å¸^@^@^ @^@]Ã^@GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0^@^@^@^@^@^@^D^@^...... 理解兩者差異的原因,可以從兩個面向去釐清: 1. 所有的檔案都是由0&1組成的 電腦中的檔案皆是藉由0&1組成的,包括source file, object file(.o), binary file等等,但vim會將所有的binary藉由ASCII轉換成為我們所看到的plain text,這裡以一main.cpp作為例子: main.cpp in vim #define N 81 int main(){ return 0;//this is the end } main.cpp, configured with  :%! xxd -b 00000000: 00100011 01100100 01100101 01100110 01101001 01101110 #defin 00000006: 01100101 00100000 01001110 00100000 00111000 00110001 e N 81 0000000c: 00001010 01101001 01101110 01110100 00100000 01101101 .int m 00000012: 01100001 01101001 01101110 00101000 00101001 01111011 ain(){ 00000018: 00001010 00001001 01110010 01100101 01110100 01110101 ..retu 0000001e: 01110010 01101110 00100000 00110000 00111011 00101111 rn 0;/ 0000...

Write a module in C++ and use it in python

 做這個小實驗的當天看到這個梗圖,相當呼應這個主題: 「其它的程式語言對你作力學是沒用的,作計算就三本柱 Python、C++、Fortran 足矣,連 C 都沒什麼用處。」Python在計算的速度上相較於C++非常的緩慢,這個 demo 很清楚地呈現了這件事。 以計算力學為題,python在tool的開發,input的整合上具有優勢,但是在計算效能上的表現不佳,於是就有了許多與python互相支援的foreign function interface(FFI),如 swig, cython, pybind11。 截python所長,補C++所短 (or vice versa) ,似乎是做出更好的力學程式不可或缺的元素,pybind扮演的角色於是顯現。接下來就簡單用C++寫一個python的module: 1. 寫 .cpp/.h file。 #include <pybind11/pybind11.h> double square(double i){ return i*i; } PYBIND11_MODULE(test, handle){ //Module 的attributes 會在這裡做定義 handle.doc()="This is my doc"; handle.def("sqrt", &square); } 2. 寫 CMakeList.txt。 cmake_minimum_required(VERSION 3.4) PROJECT(pybind_vid) add_subdirectory(pybind11) pybind11_add_module(test test.cpp) //test為建構的module的名稱 test.cpp是它所依據的檔案 3. Build the module。 mkdir build cd build/ cmake .. make 4. 在python中使用前面所建立的module。 ~/git-repo/importation/test$ python3 >>> import test >>> dir(test) ['doc', 'file...