Как настроить базовую компиляцию C++/C, а затем связать скрипт для сборки emscripten

Этот тест предназначен для подготовки к написанию более полноценного модуля сборки. Но сначала мне нужно выяснить основы. Желание: - собрать все выходные "объектные файлы" в выходную папку - связать их в распространяемый двоичный файл "wasm", отформатировать html-страницу и вывести их в папку "dist".

Я посмотрел руководство в:

https://kripken.github.io/emscripten-site/docs/tools_reference/emcc.html

Это не так интуитивно или явно прописано, как хотелось бы. Ниже моя текущая простая тестовая сборка.

#!/bin/bash

# set emscripten toolchain paths in this shell
source "${HOME}/emsdk/emsdk_env.sh" --build=Release   

BuildDir="./build"          # root of output dir for built files
SrcDir="./src"              # a source code directory
ObjDir="${BuildDir}/obj"    # where intermediate "object" files are output to.
IncludeDir="./include"      # an include directory

# start clean for this test
rm -fr "${BuildDir}"
mkdir -p "${ObjDir}"  # also re-creates BuildDir


# compile source code out to ObjDir

emcc --default-obj-ext .bc -o "${ObjDir}/" -I "${IncludeDir}" \
    "${SrcDir}/hello.cpp" "${SrcDir}/TestClass.cpp"`

Выполнение вышеописанного дает мне ошибки, но работает, если есть только один исходный файл.

Is a directory
Traceback (most recent call last):
      File "/home/peterk/emsdk/emscripten/incoming/emcc.py", line 3107, in <module>
...
status 1
    peterk@5a4a702ca3b5:~/didi-wasmtest/test$

Приведенное ниже работает, но все выходные файлы помещаются в папку src/, а также присваиваются им суффикс .o, а не суффикс .bc: он также выводит файлы .out.js и .out.wasm в каталоге, в котором находится скрипт. бежать от. Я хотел бы подавить это до финальной фазы «ссылки», когда результаты нескольких компиляций будут связаны вместе на отдельном шаге.

emcc --default-obj-ext .bc -I "${IncludeDir}" \
    "${SrcDir}/hello.cpp" "${SrcDir}/TestClass.cpp"`

person peterk    schedule 03.11.2018    source источник


Ответы (1)


Хорошо - это работает, и это хорошо, поскольку makefile в любом случае будет компилироваться по одному.

#!/bin/bash

source "${HOME}/emsdk/emsdk_env.sh" --build=Release   # set emscripten toolchain paths in this shell

BuildDir="./build"          # root of output dir for built files
SrcDir="./src"              # a source code directory
ObjDir="${BuildDir}/obj"    # where intermediate "object" files are output to.
IncludeDir="./include"      # an include directory
DistDir="./build/dist"      # distribution "binary" output dir

# start clean for this test
rm -fr "${BuildDir}"

# compile source code out to ObjDir
mkdir -p "${ObjDir}"

objFiles=""

for srcFile in "${SrcDir}"/*.cpp; do
    objFile="${ObjDir}/$(basename "$srcFile").bc"
    emcc -o "${objFile}" -I "${IncludeDir}" "${srcFile}"
    objFiles+="${objFile} " # save list of objFiles for link.
done

# link object files into binary runtime in DistDir
mkdir -p "${DistDir}"

emcc -s WASM=1 ${objFiles} -o "${DistDir}/hello.html"

# expose to browser to test
cd "${DistDir}"
python -c 'import SimpleHTTPServer; SimpleHTTPServer.test()'
person peterk    schedule 03.11.2018
comment
Может быть, вы можете помочь мне, мистер Питер, по адресу: stackoverflow.com/questions/58198388/ - person Nikola Lukic; 08.10.2019
comment
Спасибо - на данный момент он полностью интегрирован в нашу систему сборки на основе Ruby, которую я использую с CLion IDE - спасибо! - person peterk; 09.10.2019